ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Katalon Recorder入门:从录制脚本到Selenium测试的自动化测试实践

Katalon Recorder入门:从录制脚本到Selenium测试的自动化测试实践 简介Katalon Recorder 是一款面向 Web 自动化测试的 Chrome 脚本录制工具适合需要快速生成 Selenium WebDriver 脚本的测试人员与开发者可显著减少手工测试工作量降低自动化脚本编写门槛。资源共4个文件压缩包约3.95MB包含两个 crx 插件和两份 HTML 说明文档主插件负责录制与回放可选的 Infinity 新标签页增强插件则用于优化浏览器日常操作体验两份文档分别介绍安装步骤、界面入口和基础用法。用户安装后可在浏览器中录制点击、输入等操作工具会自动识别网页元素并生成可执行的 Selenium 脚本还可在内置编辑器中补充断言、循环等逻辑完成后导出或回放。目前已有1515人学习下载尤其适合刚接触自动化测试、希望借助图形化方式快速掌握 Selenium 的初学者也便于测试人员搭建浏览器端回归测试用例。1. 为什么我推荐从录制工具开始做自动化一个插件能顶半条自动化流水线先说结论Katalon Recorder 是我在自动化测试工具里见过最适合「快速上手、立刻见效」的免费方案。它本质是一个浏览器扩展录下你在页面上的点击、输入、选择操作自动生成可回放的脚本还能一键导出成 Selenium Java、Robot Framework、Katalon Studio 工程。很多人以为录制生成的脚本只能做一次性演示实际用下来配合验证点和定位器修正录制脚本完全能顶住回归测试的重复执行。适合两类人一类是刚接触自动化、被 WebDriver 配置和元素定位劝退的新手另一类是维护存量手工用例、想把回归成本压下来的测试工程师。它的反直觉之处在于录制回放不是「随便点点然后看个乐子」而是需要你像写代码一样去管理定位器、等待和断言下面我把这套完整流程拆给你。2. 录一条能用的脚本录制回放里的几个决定成败的开关2.1 从安装到录出第一条脚本关键开关全在录制按钮旁边Katalon Recorder 作为 Chrome 和 Edge 的扩展安装完成后工具栏会出现一个带圆点图标的 KR 按钮。点击它第一步不是直接录制而是新建项目。新建项目时只需要填项目名称和 Base URL这个 Base URL 会决定脚本里所有打开页面命令的地址拼接方式很多人忽略这个字段结果脚本录完只能在当前环境跑换个预发环境就全废。录制前把 Base URL 填成被测系统的域名根路径比如https://demo.example.com录制过程中打开登录页时生成的 open 命令 target 会只保留相对路径/login。这一步相当于给脚本留了换环境的后路后面我会在第 6 章详细讲参数化但这里就必须养成习惯。点击 New Project 后界面左侧是命令列表右侧是命令属性面板顶部有一排按钮录制、暂停、停止。点录制浏览器顶部会显示录制状态标识这时候你在被测系统里做的每次点击、输入、勾选、下拉选择都会被记录下来。以登录场景为例录完停下来命令列表通常会长这样[ { command: open, target: /login, value: }, { command: type, target: idusername, value: tester01 }, { command: type, target: css#password, value: Pssw0rd }, { command: click, target: xpath//button[contains(text(),登录)], value: }, { command: assertElementPresent, target: css.user-panel, value: } ]上面这个 JSON 就是 KR 内部保存脚本的数据格式它遵循了命令、目标、值的三元组结构。type命令的 target 里的id、css、xpath前缀被称为定位器前缀KR 在录制时会自动决定用哪种方式定位元素它内部的处理逻辑是优先找 id找不到再看 name 和 css最后落到绝对 xpath。很多时候它录出来的 xpath 又长又脆后面 4.1 我会专门讲怎么改。录制的过程中如果点错了按钮不用重新录直接在命令列表里删掉对应那一行或者临时点暂停回到正确页面再继续录。如果遇到了跳转页面的场景KR 会把命令录成clickAndWait这个细节很关键普通click只负责点击不等待新页面加载clickAndWait则会让脚本在点击后等待页面跳转完成录制弹窗、提交表单时优先保留这种命令回放成功率会明显更高。录制完成后先别急着导出右侧属性面板里每条命令都能改。初学者最容易忽略的是 target 旁边的「选择元素」按钮它相当于元素拾取器点击之后可以到页面上重新指定一个元素适合用来修正录歪的定位器。我把这个习惯定为录制后的必做动作每条点击和输入命令都点开检查一次 target确认它指向的元素确实是你想操作的那个。2.2 回放的三个参数速度、延迟与验证点脚本就绪后右键项目名称选 Run就能开始回放。回放不是无脑播放KR 提供了三个直接影响成功率的控制项我在实际项目里几乎每次都要调整它们。第一个是速度控制位于工具栏右侧有一个滑块和输入框默认是 600单位是毫秒。它控制每条命令执行后的间隔时间。网络环境差或者页面有轮询请求时把它调到 1000 以上回放会更稳但不要为了贪快设成 0否则页面还没刷新完脚本已经执行到下一个定位了。第二个是延迟命令。录制时你在页面上看到内容加载完成后才操作脚本里并没有体现这中间的等待所以回放时会出现「元素还没出现就去找它」的情况。我一般会在打开页面命令后手动插入一条delay命令把 value 设成 3000让它先等 3 秒再继续。第三个是验证点。录制时右键页面上的元素菜单里会出现「断言文本存在」、「断言元素可见」之类的选项选完 KR 会在脚本末尾自动追加一条assertElementPresent或assertText命令。断言的作用是把「回放有没有跑通」从主观判断变成客观检查。比如登录后页面上有一个用户面板就断言它的存在如果失败脚本会直接标红停止。assert和verify的区别要记清楚assert系列一旦失败脚本立即停止verify系列失败只记录错误脚本继续往下跑。一个用例里我建议关键路径用assert非关键的元素用verify这样既能快速定位失败点又不会因为一个次要元素缺失导致后续操作全部中断。回放时如果脚本停在某一条命令上报错最直接的做法是点开浏览器控制台 DevTools 的 Console 面板配合 KR 左侧高亮的命令行先看是定位不到元素还是等待超时。这一步处理熟练之后你基本就从一个「录制演示者」变成「能排错的录制脚本使用者」了。3. 导出不只有 SeleniumJava、Robot Framework、Katalon Studio 三种落地的选型3.1 导出为 Selenium Java把录制的脚本嵌进回归工程KR 最大的卖点之一是导出功能录制项目右键点 Export能看到一串目标格式Selenium WebDriver Java、Python、C#、Robot Framework、Katalon Studio 等。我实际用得最多的是导出 Java 工程因为大部分被测团队都跑在 Java 技术栈上弄一个独立的 maven 回归工程把所有录制脚本挂到 CI 上定期执行是目前最成熟的自愈路线。导出之后的 Java 代码结构大致是这样它会对每条命令生成一个 WebDriver 调用import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.junit.Assert; public class LoginTest { Test public void login() throws Exception { System.setProperty(webdriver.chrome.driver, D:/drivers/chromedriver.exe); WebDriver driver new ChromeDriver(); driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS); driver.get(https://demo.example.com/login); driver.findElement(By.id(username)).sendKeys(tester01); driver.findElement(By.cssSelector(#password)).sendKeys(Pssw0rd); driver.findElement(By.xpath(//button[contains(text(),登录)])).click(); Assert.assertTrue(用户面板未显示, driver.findElement(By.cssSelector(.user-panel)).isDisplayed()); driver.quit(); } }这段代码导出后需要补几处才能直接跑。首先是implicitlyWait这个隐式等待它设置的是全局兜底等待时间15 秒通常够用但注意它和命令里的delay是两套机制视频里那种「等一个元素出现再执行」的显式等待KR 导出的代码里不会自动生成我建议在关键操作前后手动用new WebDriverWait(driver, Duration.ofSeconds(10)).until(...)替换掉固定 delay稳定性会好很多。其次是 maven 依赖导出的代码依赖 selenium-java 和 JUnit在 pom.xml 里补上对应坐标就能编译。版本号不要直接照抄别人的去 Maven 仓库确认你本地驱动匹配的版本这是最常翻车的点Chrome 内核一个季度升一次级chromedriver 版本没跟上浏览器就启动不了。dependency groupIdorg.seleniumhq.selenium/groupId artifactIdselenium-java/artifactId version4.25.0/version /dependency dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.2/version scopetest/scope /dependency参数说明selenium-java依赖会传递引入 webdriver 所需要的客户端库junit是测试运行框架。chromedriver 的路径建议通过系统属性或环境变量传入不要写死成本地路径这样换一台执行机不用改代码如果团队用 Docker 跑测试chromedriver 直接放容器镜像里会省很多事。导出的代码默认把 Base URL 写死成了绝对路径如果你在 KR 里设置了 Base URL 且脚本用相对路径导出后它会把 Base URL 和相对路径拼接好。所以你会发现第 2 章认真设置 Base URL 的习惯在这里开始产生回报。3.2 导出到 Robot Framework 与 Katalon Studio两种团队场景如果你的团队已经在用 Robot Framework 管理用例KR 也能直接把脚本导出成.robot格式。导出的文件通常长这样*** Settings *** Library SeleniumLibrary *** Test Cases *** 用户登录 Open Browser https://demo.example.com/login chrome Input Text idusername tester01 Input Text css#password Pssw0rd Click Element xpath//button[contains(text(),登录)] Page Should Contain Element css.user-panel Close Browser运行方式是在终端执行robot 文件名.robot前提是环境里装好了 robotframework 和 robotframework-seleniumlibrary。这里有个坑KR 导出的关键字是click但 SeleniumLibrary 里对应的是Click Element导出工具一般会处理这个映射但偶尔有低版本导出结果里会出现不存在的关键字跑之前扫一眼所有的Click、Input关键字就行。Robot Framework 这种纯文本关键字格式的好处是容易做代码评审测试用例可以 git diff适合团队沉淀资产坏处是 SeleniumLibrary 对定位器的容错性不如 KR 录制时的表现之前在 KR 里能跑的 xpath在 SDK 里执行时经常因为等太短失败所以导出来之后第一件事是给每个交互步骤前面加Wait Until Element Is Visible。最后是 Katalon Studio这是 Katalon 自家的 IDEKR 录制脚本可以直接以 Studio 项目格式导出导入后对象仓库会自动建好页面元素会归拢成可复用的对象后续手动测试和自动用例可以挂在同一个工程下。如果你未来打算把大部分脚本迁移到 Studio 的测试套件里统一调度这个导出路径最省事。我把三种导出场景整理成表格方便选型时对照目标格式适用团队维护成本典型落地方式Selenium JavaJava 技术栈、已有 maven 工程中高放入 CI 跑回归Robot Framework已用 robot 管理用例的团队中与现有关键字库复用Katalon Studio想继续待在 Katalon 生态低至中对象仓库统一管理选择标准很简单团队已经有自动化框架就用它对应的格式团队还在选型阶段我建议直接进 Katalon Studio因为它对 KR 脚本的解析最完整定位器丢失最少。4. 让脚本从「能跑」到「稳」定位器优先序与录制后的修正习惯4.1 定位器选型录制时的点击习惯决定回放稳定性KR 录制生成的目标定位器并不是随机挑选的它遵循一个固定的优先序id 优先于 namename 优先于 CSSCSS 优先于 XPath。这个顺序本身合理但现实项目里前端组件库很容易生成一长串动态 id比如username_123456下次回放时 id 变了脚本就会卡住。这时候就需要手动干预把 target 换成更稳定的定位方式。我常用的优先级是带业务含义的稳定 id 或 name CSS 选择器基于 class 和结构 相对 XPath 绝对 XPath。注意绝对 XPath 是我最后的选择那种从 html/body/div 一路数下来的路径前端稍微加一层 div 就全线崩盘。下面这几种写法可以直接粘贴到 KR 的 target 里替换原值// 按稳定的 id 定位优先 idusername // 按 input 的 name 属性定位支持 form 提交的场景 namelogin_name // 按 CSS 类定位点选按钮时常用 css.btn-primary // 按 XPath 文本定位按钮文字变化时才需要改 xpath//button[contains(text(),登录)] // 相对定位锁定表单区域内的一个输入框 cssdiv.login-form input[typetext]参数说明contains(text(),登录)是模糊匹配能容忍按钮文字前后多出的空格div.login-form input[typetext]是在表单区域内找输入框这种带上下文的定位方式比全局找稳得多。录制完脚本后我会逐个点开带xpath的命令凡是看到绝对路径就手动改掉这是把「录出来的脚本」变成「能长期使用的脚本」的关键一步。还有一个很容易被忽视的细节KR 录制时如果页面上多个元素指向同一个定位器它不会提示冲突只在回放时报错「element not interactable」或「click intercepted」。所以录完后重点检查有没有多个命令的 target 完全一样如果它们操作的是不同的元素必须拆开定位器让它能唯一指向。我一般会在 Chrome DevTools 的 Elements 面板里先按 CtrlF 输入定位器表达式确认能定位到的元素数量再粘回 KR。这个「先在 DevTools 验证、再回 KR 改 target」的流程比我之前凭感觉改 xpath 的效率高很多。4.2 录制后的修正流程变量、注释与去绝对化一段录完直接拿去跑的脚本和一段能在团队里流动使用的脚本差别就在录制之后那半小时的打磨。打磨的第一步是把脚本里所有硬编码的测试数据抽成变量。KR 的命令属性面板支持${变量名}格式项目设置里有变量管理页把账号、密码、测试环境地址都放到变量里脚本就不再是“一个人写的死数据用例”。[ { command: open, target: https://${TEST_ENV}/login, value: }, { command: type, target: idusername, value: ${ACCOUNT} }, { command: type, target: css#password, value: ${PASSWORD} }, { command: clickAndWait, target: xpath//button[contains(text(),登录)], value: }, { command: assertElementPresent, target: css.user-panel, value: }, { command: echo, target: 登录用例执行通过, value: } ]这段脚本里的TEST_ENV、ACCOUNT、PASSWORD都是变量可以在 KR 的项目设置里为每个环境维护一组值切换环境时只改变量不碰脚本逻辑。echo命令用于回放时在日志里打印自定义信息执行到哪一步出了问题日志里直接能看到业务上下文比盯着英文报错猜省事得多。修正流程的第二步是加注释。KR 支持在命令列表里插入comment命令它不执行任何操作只作为可读标记。我通常在一条业务链路开始前加注释「这里开始登录」在提交订单前加「提交订单并等待跳转」这样回放失败时别人打开脚本立刻知道这段在做什么。第三步是检查每个命令的语义。录制时 KR 会把所有点击都记成click但如果你点的是一个会触发页面跳转的元素应该手动改成clickAndWait如果点的是一个弹窗里的确认按钮页面不会跳转保持click就好。这个区别直接决定回放时脚本是否会过早执行下一步命令。我养成的习惯是录制结束后从第一条命令往下读一遍凡是「点击之后页面内容会替换」的地方统一改用clickAndWait或补一条delay。独立可回放性也是一个值得养成的习惯。一段脚本如果假设了自己登录了、自己跳转到了某个页面、自己打开了某个面板那它只有按顺序跑才有效。为了适用回归场景我会给脚本开头加打开 Base URL 并登出的命令让脚本无论从什么状态启动都能从头跑起来。这个「自恢复」设计是录制脚本能不能进 CI 的分水岭。5. 避坑排查五个真实回放失败案例与解决路径5.1 元素加载太慢导致误报失败现象回放跑到某个click或type命令时报错提示找不到元素但手动打开页面时元素明明存在且加载很快。原因录制时你的操作发生在页面完全加载完成后回放则是一条命令接着一条命令往下走页面跳转后新界面里的元素还没渲染完脚本已经尝试操作它了。这是录制脚本最常见的失败原因。解决在页面跳转命令后主动插入delay命令value 设为 2000 到 3000或者在需要等待的元素前使用waitForElementPresent命令KR 录制命令列表里可以手动添加这种显式等待。如果频繁出现加载慢检查是否回放的网络比录制时差必要时把全局速度调低。5.2 多个匹配元素导致点了错误的控件现象回放没报错但实际点到的元素不是录制时想点的那个后续断言跟着失败。比如一个页面上有两个「确认」按钮录的时候点了下面的回放却点了上面的。原因KR 生成的定位器不够唯一xpath 或 css 匹配到了多个元素driver 默认操作第一个匹配项导致点击位置偏离预期。解决在 DevTools 的 Elements 面板里用 CtrlF 验证 target 的匹配数量改成带上下文或带文本过滤的定位器例如xpath//div[classfooter]//button[contains(text(),确认)]把范围限定到某个区域匹配唯一后再粘回 KR。另一个办法是给目标元素增加 index 标记例如xpath(//button[typesubmit])[2]但 index 更容易受页面结构变化影响不如带上下文的写法稳定。5.3 换环境就废的绝对 URL现象脚本在测试环境跑得好好的换到预发环境所有open命令直接 404 或跳到错误首页。原因录制时页面地址被记成了绝对完整路径比如https://uat.example.com/orders/...换环境后域名不同脚本仍然沿用了旧地址。解决回到第 2 章说的 Base URL 设置把脚本里所有open命令的 target 改成相对路径例如/orders/list或者在脚本中统一使用${TEST_ENV}变量拼接完整地址。打开 KR 项目设置把变量值按环境维护好切换环境时只在变量层面改动。5.4 iframe 内的点击录不上或回放找不到现象页面上嵌套了 iframe录制时可以在 iframe 内正常操作但回放时对应的click、type命令全部报元素不存在。原因iframe 内部是一个独立的文档定位器找到的元素不在当前主文档里WebDriver 不支持直接跨文档查找需要先切换到 iframe 上下文才能继续操作。解决在操作 iframe 内元素之前手动插入 KR 的selectFrame命令target 填 iframe 的 id 或 name操作结束后再插入selectFrame回到相对上级避免后续命令在错误的文档上下文里执行。我在这类场景里的习惯是把 iframe 操作尽量独立成一个脚本单独维护不和其他主文档操作混在一起排查定位器问题时更清晰。5.5 浏览器系统级弹窗或文件下载导致脚本中断现象回放时点击触发了一个原生 alert 或 confirm 弹窗脚本停在原地不动后续命令全部失效或者触发了文件下载后脚本仍在执行但找不到下一个元素。原因这些是浏览器原生控件不属于页面 DOMWebDriver 的定位和点击命令无法操作它们KR 录制的命令序列也捕捉不到这些原生弹窗。解决在触发弹窗的按钮命令之前先手动处理比如用chooseOkOnNextConfirmation或answerOnNextPrompt这样的命令预置对话框行为对于文件下载不要试图在脚本里下载并验证文件建议把验证点放在下载按钮出现或下载任务开始这个层面文件内容的校验交给专门的文件校验工具。录制之前排除掉弹窗和下载这类系统级动作是减少无效脚本的最有效手段。以上五个问题前三个占了录制脚本回放失败的大头后两个是特定场景才会遇到但在实际项目中一旦碰到就极其耗时。排查顺序我建议是先看脚本停在哪条命令再看那条命令的 target 是否唯一最后看这条命令的前一步有没有完成页面跳转。按这个顺序大多数失败都能在几分钟内定位到根因。6. 进阶用法把录出来的脚本改造成能复用的数据驱动用例6.1 用变量抽离 URL 与账号数据录制脚本进入维护阶段后最值得投入的一件事是把它改造成数据驱动模式。KR 具备变量系统我不仅用它管理环境地址还把测试账号、密码、订单号、商品名称等业务数据全抽出来一条脚本通过修改变量值就能覆盖多组测试数据。实际操作里我会在项目设置中维护一组变量列表例如USERNAME_01 tester01 PASSWORD_01 Pssw0rd USERNAME_02 tester02 PASSWORD_02 Pssw0rd TEST_ENV https://demo.example.com脚本里的type命令 target value 直接填${USERNAME_01}回放时 KR 自动完成替换。这样同样的登录脚本通过复制用例改引用变量就能验证不同账号的数据权限差异比把账号硬编码在每一条脚本里好维护得多。6.2 验证可重复性连续回放整个测试套件脚本改造成数据驱动后一个常被忽视的问题是重复执行稳定性。录制回放最大的隐性风险是「第一次能过、第二次就挂」因此我把验证方法固定为连续回放同一个测试套件三遍观察失败率。第一遍失败多半是脚本问题第二遍失败怀疑资源释放不干净第三遍仍然失败则大概率是定位器选择不当或隐式等待覆盖不足。我还会统计一下脚本里delay命令的数量和时长如果某条脚本一半以上都是固定等 3 秒、5 秒我会考虑用显式等待命令替代比如waitForElementPresent它的等待时长上限可控元素出现就立即继续不会像固定延迟那样白白浪费时间。对于页面结构经常变动的前端项目我会和开发约定在关键元素上增加style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />
返回列表