简介:这份资源面向Web自动化测试初学者与需要快速生成测试脚本的测试工程师,核心是Chrome浏览器下的脚本录制与回放工具,可将手工操作转化为可执行的Selenium WebDriver脚本,降低自动化测试的入门门槛。压缩包共4个文件,约3.95MB,包含2个crx扩展与2个html说明文档:前者用于在Chrome中安装录制插件及新标签页增强工具,后者提供安装步骤与使用指南,便于对照完成环境配置。目前已有1516人学习下载,说明该工具在测试社区中具有一定关注度。通过内置编辑器,读者可查看并修改录制脚本,添加断言、循环等逻辑以应对复杂测试场景;配合社区教程与示例,还能逐步掌握元素识别、脚本调试与用例组织思路,适合希望以较低学习成本切入自动化测试的开发者参考使用。
1. 自动化脚本录制:从手动点击到可回放用例的落地路径
很多做测试的同行都经历过这样的场景:一个后台管理系统有几十个表单页面,每次发版前都要把核心流程手动点一遍,点完两小时过去了,人还容易走神漏掉步骤。Katalon Recorder 这类浏览器端的脚本录制工具,解决的正是这个「重复点击」的问题——它把你在页面上的操作录成可回放的自动化脚本,下次直接跑,不用再手点。这份资源是一个 zip 包,解压后是浏览器扩展的安装文件,装进 Chrome 或 Firefox 就能用。它适合两类人:一是刚接触自动化测试、还没搞明白 Selenium 怎么搭环境的新手,二是需要快速产出回归用例、不想为每个小需求写代码的熟手。核心价值就一句话:把手工操作变成可重复执行的脚本,降低自动化的起步门槛。
2. 录制工具的核心机制与安装配置
2.1 录制回放的底层逻辑
Katalon Recorder 的工作方式并不复杂,但理解它的机制能帮你少踩很多坑。它本质上是一个浏览器扩展,通过监听 DOM 事件来捕获你的操作——点击、输入、选择下拉框、勾选复选框,每触发一个动作,它就把这个动作翻译成一条命令,存进一个脚本列表里。每条命令包含三部分:命令名(比如 click、type)、目标元素定位器(比如 id=username、xpath=//button)、以及可选的参数值(比如输入框里填的内容)。
回放的时候,它按顺序执行这些命令,通过定位器找到页面元素,然后模拟对应的操作。这里的关键在于定位器——如果页面结构变了,定位器找不到元素,回放就会失败。所以录制出来的脚本不能录完就扔,得检查定位器是否稳定。常见做法是优先用 id 和 name,其次用 CSS 选择器,最后才用 xpath,因为 xpath 对页面结构变化最敏感。
另一个需要理解的点是等待机制。页面加载有快有慢,如果脚本执行到某一步时元素还没渲染出来,就会报错。Katalon Recorder 提供了 waitForElementPresent 这类命令,但录制时它不会自动加,需要你手动插入。我一般会在页面跳转或 AJAX 加载之后,手动补一条等待命令,超时设 10 到 15 秒,这样能过滤掉大部分因加载延迟导致的偶发失败。
2.2 安装与初始配置
这份资源是 zip 包,解压后你会看到一个包含 manifest.json 的文件夹。安装方式取决于浏览器:Chrome 系走「扩展程序」页面的「加载已解压的扩展程序」,Firefox 走「临时载入附加组件」。具体步骤下面用代码块演示,但注意这是浏览器操作,不是命令行,代码块里写的是操作路径和关键配置项。
# 这不是终端命令,是操作路径说明 # Chrome 安装步骤: # 1. 地址栏输入 chrome://extensions/ 回车 # 2. 右上角打开「开发者模式」开关 # 3. 点击「加载已解压的扩展程序」 # 4. 选择解压后的文件夹(含 manifest.json 那一层) # 5. 扩展栏出现 Katalon Recorder 图标即成功 # Firefox 安装步骤: # 1. 地址栏输入 about:debugging#/runtime/this-firefox 回车 # 2. 点击「临时载入附加组件」 # 3. 选择解压文件夹里的 manifest.json 文件 # 4. 注意:Firefox 临时载入的扩展重启浏览器后会失效,需重新载入安装完成后,点击扩展图标会弹出一个面板,面板分三个区域:左侧是测试用例列表,中间是命令表格,右侧是参数编辑区。第一次用建议先点「New Test Case」建一个空用例,然后点「Record」开始录制。录制时面板会变成红色,表示正在捕获操作。停止录制后,命令表格里会出现你刚才的操作记录。
这里有个配置项容易被忽略:录制时是否捕获「断言」。断言是用来验证页面状态的,比如验证某个文本是否存在、某个元素是否可见。默认录制不会加断言,但回归测试里断言才是真正判断通过与否的依据。我一般会在录制完成后,手动在关键步骤后面插入 assertText 或 verifyElementPresent,这样脚本才有校验能力,不然只是「点了一遍」而已。
2.3 脚本导出与格式选择
录完的脚本可以导出成多种格式,常见的有 HTML、JSON、CSV,以及直接导出成 WebDriver 代码(Java、Python、C# 等)。导出格式决定了你后续怎么用这份脚本。
如果只是想在 Katalon Recorder 里回放,用默认的 HTML 格式就行,它保存了完整的命令序列和定位器。如果想集成到 Selenium 项目里,就导出成对应语言的 WebDriver 代码,比如 Python 的 unittest 或 pytest 格式。导出后的代码里,每条命令会变成对应的 WebDriver API 调用,定位器会转成 By.id、By.xpath 等形式。
# 导出为 Python WebDriver 代码后的片段示例 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get("https://example.com/login") # 对应录制时的 type 命令 driver.find_element(By.ID, "username").send_keys("testuser") driver.find_element(By.ID, "password").send_keys("password123") # 对应录制时的 click 命令 driver.find_element(By.XPATH, "//button[@type='submit']").click() # 对应手动插入的等待命令 driver.implicitly_wait(10) # 对应手动插入的断言命令 assert "欢迎" in driver.page_source driver.quit()导出代码的逻辑说明:type 命令转成 send_keys,click 命令转成 click(),waitForElementPresent 转成 implicitly_wait 或 WebDriverWait。参数方面,定位器类型决定了用 By.id 还是 By.xpath,输入值直接作为 send_keys 的参数。注意导出的代码不会自动加异常处理和清理逻辑,实际集成时需要自己补 try/except 和 driver.quit()。
3. 录制脚本的实战流程与参数调优
3.1 一个完整登录流程的录制与回放
拿一个典型的登录加查询场景来走一遍。假设有个内部管理系统,登录后要进入订单列表页,输入订单号查询,然后验证查询结果。手动操作是:打开登录页、输入用户名密码、点登录、等跳转、点订单菜单、输入订单号、点查询、看结果。这一套录下来大概十几步,下面拆解关键步骤。
第一步,打开目标页面,点扩展图标,新建用例,点 Record。第二步,在页面上正常操作:输入用户名、输入密码、点登录按钮。第三步,页面跳转后,等订单列表加载出来,点订单菜单。第四步,在查询框输入订单号,点查询按钮。第五步,看到结果后,停止录制。
停止后检查命令表格,你会发现几个问题:登录后的跳转没有等待命令,查询按钮的定位器可能是 xpath 且很长,查询结果没有断言。这三个问题分别对应三类调优操作。
等待命令的插入:在点击登录按钮的命令后面,右键插入「waitForElementPresent」,目标填订单菜单的定位器,超时设 15000 毫秒。这样脚本会等菜单出现后再继续,避免跳转未完成就执行下一步。
定位器优化:选中查询按钮那条命令,看它的 target 字段。如果是一长串 xpath,试着改成 id 或 CSS 选择器。比如原来是xpath=//div[@class='toolbar']/button[2],如果按钮有 id 就用id=searchBtn,没有 id 就用css=.toolbar button.search。定位器越短越稳定,这是血泪经验。
断言添加:在查询结果出现后,插入「assertText」或「verifyElementPresent」,目标填结果区域的定位器,期望值填订单号或「查询成功」之类的文本。断言是判断测试通过与否的依据,没有断言的脚本只是「跑了一遍」,没有验证能力。
3.2 参数化与数据驱动
录制的脚本里,输入的用户名、密码、订单号都是写死的。如果要用不同账号或不同订单号跑多组数据,就得参数化。Katalon Recorder 支持从 CSV 文件读取数据,每条命令的 value 字段可以引用 CSV 的列名。
操作方式:先准备一个 CSV 文件,第一行是列名,比如 username,password,orderId,下面每行是一组数据。然后在 Katalon Recorder 里点「Test Data」标签,导入这个 CSV。接着在命令表格里,把原来写死的值改成${username}、${password}、${orderId}这种变量形式。最后在用例设置里勾选「Data Driven」,选择 CSV 文件,设置循环次数。
username,password,orderId testuser1,pass123,ORD001 testuser2,pass456,ORD002 testuser3,pass789,ORD003参数说明:CSV 的列名要和脚本里的变量名一致,大小写敏感。循环次数可以设成「所有行」或指定数字。回放时,脚本会按行读取数据,每行跑一遍完整流程。注意如果某行数据导致脚本失败,默认会继续跑下一行,但可以在设置里改成失败即停。数据驱动适合回归测试场景,比如用不同账号验证权限,或用不同订单号验证查询逻辑。
3.3 定位器的选择策略与稳定性
定位器是录制脚本里最容易出问题的部分。同一个按钮,可以用 id、name、class、xpath、css 等多种方式定位,但稳定性差别很大。下面这张表是我在实际项目里总结的优先级和适用场景。
| 定位器类型 | 优先级 | 适用场景 | 稳定性 |
|---|---|---|---|
| id | 最高 | 元素有唯一 id | 高,除非开发改了 id |
| name | 高 | 表单元素有 name | 高,常用于输入框 |
| css | 中 | 有稳定的 class 或层级 | 中,class 可能变 |
| xpath | 低 | 以上都没有时 | 低,页面结构一变就失效 |
| linkText | 中 | 链接文本固定 | 中,文本可能改 |
| text | 中 | 按钮或标签文本固定 | 中,文本可能改 |
选择策略:先看元素有没有 id,有就用 id。没有 id 看 name,没有 name 看有没有稳定的 class。如果都没有,用 css 选择器写层级关系,比如css=#loginForm .submit-btn。最后才用 xpath,而且尽量用相对路径加属性匹配,别用绝对路径。绝对路径像/html/body/div[3]/div[2]/form/button,页面加一层 div 就废了。
还有一个技巧:如果元素是动态生成的,id 里带随机数,比如id=button_1689234567,这种 id 不能用。这时候找它父级的稳定 id,然后用 css 的>或空格往下找,比如css=#stableParent button。或者用 xpath 的 contains 匹配部分固定文本,比如xpath=//button[contains(text(),'查询')]。
4. 避坑与常见问题排查
4.1 回放失败但手动操作正常
现象:脚本录制时操作没问题,回放时某一步报错,提示元素找不到,但手动在页面上点同样的位置是好的。
原因:最常见的是等待时间不够。录制时你是人眼看到页面加载完了才点的,脚本执行速度比人快,元素还没渲染出来就去定位了。其次是定位器不稳定,录制时生成的 xpath 依赖了当时的页面结构,回放时页面结构有细微变化。还有一种情况是 iframe,如果目标元素在 iframe 里,脚本默认在主文档里找,找不到。
解决:在报错步骤前插入 waitForElementPresent,超时设 10 到 15 秒。检查定位器,换成更稳定的 id 或 css。如果是 iframe,用 selectFrame 命令先切进 iframe,操作完再用 selectFrame 切回主文档。我一般会在每个页面跳转后都加一条等待,宁可多等几秒,也别让脚本因为加载慢而翻车。
4.2 断言通过但实际结果不对
现象:脚本回放显示全部通过,但人工检查发现查询结果不对,或者页面显示了错误提示但脚本没报错。
原因:断言写得太弱或位置不对。比如只断言了「查询按钮存在」,没断言「查询结果包含预期订单号」。或者断言的目标元素是隐藏的,脚本认为它存在就通过了,但用户根本看不到。还有一种情况是断言在页面跳转前执行了,验证的是旧页面的内容。
解决:断言要针对业务结果,不是针对页面元素。查询场景就断言结果列表里包含预期订单号,登录场景就断言跳转后的页面有用户名或欢迎语。断言前确保页面已经加载完成,必要时加等待。对于隐藏元素,用 verifyElementVisible 而不是 verifyElementPresent,前者检查可见性,后者只检查存在性。
4.3 数据驱动时变量未替换
现象:CSV 文件导入了,变量也写了${username},但回放时输入框里填的还是${username}这个字符串,不是 CSV 里的实际值。
原因:变量引用的语法不对,或者 CSV 列名和变量名不匹配。Katalon Recorder 的变量语法是${列名},列名要和 CSV 第一行完全一致,包括大小写。另一个常见原因是 CSV 文件编码问题,如果文件是 GBK 编码但工具按 UTF-8 读,中文列名会乱码,导致匹配不上。
解决:检查 CSV 第一行的列名,确保和脚本里的变量名一字不差。CSV 文件保存为 UTF-8 编码,可以用记事本或编辑器另存为时选 UTF-8。如果列名有中文,建议改成英文,避免编码问题。测试时先用一行数据跑,确认变量替换成功后再加多行。
4.4 扩展安装后图标不显示或面板打不开
现象:按步骤加载了扩展,但浏览器工具栏没有图标,或者点了图标面板不弹出。
原因:Chrome 系浏览器加载解压扩展后,如果 manifest.json 格式有问题,扩展会加载失败但不一定有明显提示。Firefox 临时载入的扩展在重启后会失效,需要重新载入。还有一种情况是扩展和当前浏览器版本不兼容,manifest 版本号对不上。
解决:在扩展管理页面看有没有报错信息,Chrome 会显示「错误」按钮,点开看具体原因。检查 manifest.json 的 manifest_version 字段,Chrome 现在要求 v3,老扩展可能是 v2,需要改。Firefox 每次重启后重新载入一次,或者用开发者版签名。如果还是不行,换个浏览器试,Chrome 和 Firefox 对扩展的支持有差异。
4.5 录制时捕获了多余的操作
现象:录制出来的脚本里有很多不需要的命令,比如鼠标移动、悬停、滚动,或者重复的点击。
原因:录制模式会捕获所有 DOM 事件,包括你不经意的鼠标移动和悬停。有些页面有鼠标悬停触发菜单的逻辑,你移动鼠标经过就触发了,录制时也记下来了。重复点击可能是因为你点了一次没反应又点了一次。
解决:录制时尽量用键盘 Tab 键切换焦点,减少鼠标移动。录制完成后手动删除多余命令,选中行按 Delete 就行。对于悬停触发的菜单,可以用 mouseOver 命令显式触发,而不是靠鼠标移动。回放前先跑一遍,看哪些命令是多余的,删掉再保存。
5. 从录制脚本到可维护用例的进阶技巧
录制的脚本能跑,但能不能长期维护是另一回事。我见过太多人录完脚本就扔在那,过两周页面改了个按钮 id,脚本全挂,然后就不想再用了。要让录制脚本真正产生价值,得做几件事。
第一件事是抽离公共步骤。登录流程在每个用例里都要用,不要每个用例都录一遍登录。把登录单独录成一个用例,然后在其他用例里用「Call Test Case」命令调用它。这样登录页面改了,只改一个地方。Katalon Recorder 支持用例之间的调用,在命令表格里选 callTestCase,目标填被调用用例的名字。
第二件事是统一命名规范。用例名、命令的注释、断言的描述,都按一个规则来。比如用例名用「模块_场景_预期结果」的格式,像「订单_查询有效订单号_返回订单详情」。命令的 comment 字段写清楚这步在干什么,别只写「点击按钮」。过一个月回头看,没有注释的脚本跟天书一样。
第三件事是定期回归。脚本写完不是就完了,每次发版后跑一遍,看哪些挂了,是页面变了还是真有 bug。挂了的脚本及时修定位器,别攒着。我一般会在每次迭代结束前留半小时跑一遍核心用例,挂了就当场修,修完记录一下改了什么。这样脚本的存活周期能长很多。
第四件事是导出成代码后做版本管理。如果脚本要长期用,建议导出成 Python 或 Java 代码,放进 Git 仓库。这样有变更记录,多人协作也方便。导出的代码可以进一步封装成 Page Object 模式,把页面元素和操作分离,维护性更好。当然这是进阶玩法,刚开始用录制工具的话,先把上面三件事做好就够了。
# 导出后的代码做简单封装的示例 class LoginPage: def __init__(self, driver): self.driver = driver self.username_input = (By.ID, "username") self.password_input = (By.ID, "password") self.login_button = (By.XPATH, "//button[@type='submit']") def login(self, username, password): self.driver.find_element(*self.username_input).send_keys(username) self.driver.find_element(*self.password_input).send_keys(password) self.driver.find_element(*self.login_button).click() # 等待跳转完成 WebDriverWait(self.driver, 15).until( EC.presence_of_element_located((By.ID, "orderMenu")) )封装后的代码逻辑说明:把定位器和操作分离,页面元素变了只改类属性,不改测试逻辑。参数方面,WebDriverWait 的超时设 15 秒,EC.presence_of_element_located 检查元素是否出现。这种写法比直接录制的脚本好维护,但需要一定的代码基础。如果团队里没人写代码,就先用录制工具的原生格式,把公共步骤抽离和命名规范做好,也能撑一段时间。
从那以后我每次录完脚本,都会强制走一遍「加等待、换定位器、补断言」这三步,不然不保存。这个习惯帮我省了很多回放失败的排查时间。希望帮到你。
本文还有配套的精品资源,点击获取