AI 测试提效 | 脚本能跑但总挂?分享我的 ui-testscript-enhancer + Skill UI 自动化健壮性增强方案

上一篇我们用 ui-testscript-generator 解决了「脚本批量生成」的问题,几分钟就拿到了完整的 UI 自动化工程。

但如果你真的拿这些脚本去跑一遍,大概率会遇到这样的情况:

本地跑得好好的,一上 CI 就挂。昨天还能过,今天突然挂。环境没变,但偶尔就挂。

这不是你的脚本逻辑写错了,是脚本不够「健壮」。

写过 UI 自动化的同学,下面的场景应该都很熟悉:

  • 硬编码 sleep,时灵时不灵。 等 3 秒可能够了,也可能不够,网络慢一点就超时。更坑的是,等多久全靠拍脑袋,换台机器就不一样。
  • 验证码拦路,自动化直接卡死。 登录页一个图形验证码,就能让整个测试流程断掉。手动输入?CI 环境谁帮你输?
  • 意外弹窗突然蹦出来。 广告弹窗、权限申请、系统通知、Cookie 提示......脚本没有处理逻辑,直接报错中断。
  • iframe 和 Shadow DOM 穿不进去。 页面里嵌了一层 iframe,或者用了 Shadow DOM 封装组件,定位策略在主文档里找不到元素,脚本报 NoSuchElementException。
  • 失败了不知道为什么。 脚本挂了,终端只有一行 AssertionError,没有截图,没有录屏,没有网络日志,你完全不知道挂的那一刻页面长什么样。
  • 偶发失败,重跑又过了。 网络波动、动画未完成、元素延迟加载,这些偶发问题导致脚本不稳定,大家开始习惯性地「重跑一下试试」,测试结果可信度越来越低。

能跑的脚本和跑得稳的脚本,中间隔着一整层工程化逻辑。 这层逻辑,就是「健壮性」。

那能不能用 Agent Skill 把这层健壮性逻辑自动补全?

答案当然是可以。

核心思路是,AI 负责扫描和增强,人负责确认和微调。

这篇文章就带你完整拆解这个过程。

一、ui-testscript-enhancer 在整条链路中的位置

先看一下这个 Skill 在完整链路里的位置:

页面 URL / DOM 结构 / 用例描述
  │
  ▼
ui-page-parser ──→ 标准化页面定义 (pages.yaml)
  │
  ▼
ui-testscript-generator ──→ POM + 测试脚本 + 测试数据
  │
  ▼
ui-testscript-enhancer ──→ 健壮性增强(等待+异常+弹窗+验证码+截图)  ← 这一篇
  │
  ├──→ ui-visual-assert ──→ 视觉断言 + 多浏览器适配
  │         │
  │         ▼
  │   ui-auto-maintainer ──→ 页面变更检测 + 定位自愈
  │
  └──→ 增强后的脚本可直接接入 CI/CD 执行

上一步 ui-testscript-generator 输出的是「能跑」的基础脚本。ui-testscript-enhancer 做的事情,就是把这些基础脚本升级成「跑得稳」的生产级脚本。

它解决的核心问题是,区分「demo 级脚本」和「生产级脚本」的那道分水岭。

脚本类型 特征 问题
demo 级脚本 逻辑正确,本地能跑 上 CI 就挂、偶发失败、失败无法追溯
生产级脚本 智能等待、异常容错、失败追溯、验证码处理 稳定可靠、可维护、可诊断

从 demo 级到生产级,中间需要补的东西,就是这个 Skill 的工作量。

二、ui-testscript-enhancer skill 技能介绍

为什么这一步绕不过去?

很多人觉得,脚本生成完了不就可以跑了吗,为什么还需要单独一步「增强」?

因为 UI 自动化的运行环境太复杂了。

网络时序不确定。 页面加载、Ajax 请求、动画过渡,这些都是异步的。你用 sleep(3) 等待,可能 90% 的时候够了,但剩下 10% 的时候网络一慢就超时了。CI 环境的资源通常比本地差,超时概率更高。

页面干扰因素太多。 弹窗、Toast、广告浮层、Cookie 授权条......这些在手动测试时随手关掉就行,但在自动化脚本里,一个未处理的 dialog 事件就能让整个用例挂掉。

验证码是硬门槛。 登录页的验证码不解决,后续所有需要登录态的测试都跑不了。这在实际项目中是最常见的「卡脖子」场景。

失败场景缺乏诊断信息。 脚本挂了之后,如果只有一行错误日志,你根本不知道当时页面是什么状态。是元素没加载出来?还是页面跳转了?还是弹窗挡住了?没有截图和录屏,排查全靠猜。

这些问题不会在开发阶段全部暴露,但一旦上 CI、跑回归、跑定时任务,就会集中爆发。 所以健壮性增强这一步,不是锦上添花,是生产级 UI 自动化的必经之路。

我的方案

ui-testscript-enhancer 是专门用于对已生成的基础 UI 测试脚本进行自动化增强的 Skill。

它接收基础脚本及页面交互规则,逐文件扫描分析,自动补全智能等待、弹窗处理、iframe 切换、异常重试、失败截图与录屏、验证码识别等能力,完成脚本加固,提升运行稳定性。

核心能力(六大增强维度):

1. 智能等待补全

等待场景 传统做法 增强后
页面初始加载 sleep(3) 硬编码 page.goto(url, wait_until="networkidle")
元素可见性 轮询 isDisplayed() expect(locator).toBeVisible()
Ajax 异步请求 固定等待 + 重试 page.waitForResponse()
动画过渡效果 盲目等待 检测 CSS transition,等待动画完成
元素状态变更 频繁轮询 expect(locator).toBeEnabled()
弹窗/Toast 出现 固定等待后查找 page.waitForSelector() 或事件监听

2. 弹窗与干扰处理

自动检测意外弹窗(广告、权限申请、Cookie 提示),尝试关闭并继续执行。Toast 消息自动捕获与断言。

3. iframe / Shadow DOM 处理

自动识别 iframe 嵌套,切换上下文,定位内部元素。Shadow DOM 穿透定位,不再卡在「找不到元素」。

4. 异常重试与容错

异常场景 增强逻辑
元素未找到 自动重试 3 次 → 截图存档 → 记录日志 → 标记失败
页面崩溃/无响应 自动刷新页面 → 恢复执行上下文 → 或标记失败并录屏
网络断开/超时 自动重试请求 → 检查网络状态 → 超时后优雅失败
浏览器兼容性差异 自动检测浏览器类型 → 适配特定行为

5. 失败追溯增强

自动截图(失败时全页截图)、自动录屏(Trace 文件)、自动记录网络请求日志。脚本挂了之后,你能看到挂的那一刻页面到底长什么样。

6. 登录验证码识别

验证码类型 识别方案 说明
图形验证码 OCR(ddddocr) 开源 OCR,离线识别,轻量高效
滑动验证码 视觉分析 + 模拟拖拽 计算滑块偏移量
文字点选验证码 OCR + 坐标匹配 识别文字位置
计算题验证码 表达式解析 提取并计算
短信验证码 API/数据库查询 从后端获取
第三方验证码 打码平台 API 2Captcha / 超级鹰等

输入:

  1. ui-testscript-generator 输出的基础 UI 测试脚本
  2. 页面交互规则和特殊处理(验证码机制、异步加载模式、弹窗触发条件)

实操演示

将技能安装好,在技能列表中,选择 ui-testscript-enhancer 技能。

img

输入项目脚本路径和增强需求:

/ui-testscript-enhancer
请对 /ui-test-automation 项目中的基础脚本进行增强,
登录页有图形验证码,请自动识别处理。

img

接下来,Skill 会自动完成四步增强:

第一步,逐文件扫描,分析需要增强的场景。

Skill 会读取所有基础测试脚本,对每个 _page.py 文件和 test_*.py 文件进行逐项检查:

检查项 增强动作
navigate() 使用 page.goto(url) 替换为 page.goto(url, wait_until="networkidle")
直接 .click() 无等待 替换为 safe_click()(先等待可见再点击)
直接 .fill() 无等待 替换为 safe_fill()(先等待可编辑再填写)
无异常捕获的操作方法 添加重试装饰器
页面跳转方法无等待目标页 添加 expect(page).to_have_url() 等待
含 iframe/Shadow DOM 的页面 生成 iframe 切换方法
登录页含验证码逻辑 接入验证码识别方案

对测试文件也会逐项检查:

检查项 增强动作
无失败截图机制 注入 pytest hook 自动截图
无 Trace 录制配置 添加 playwright 配置
弹窗未处理 添加 page.on("dialog") 监听
无网络请求监控 添加 page.on("response") 日志
无全局异常处理 添加 pytest_exception_interact hook

第二步,替换基类,升级为增强版。

将原有的 base_page.py 替换为增强版 enhanced_base_page.py,所有页面类自动继承增强后的公共方法(safe_click、safe_fill、safe_navigate 等)。

第三步,添加重试和容错机制。

为 POM 方法添加 @retry_on_failure 装饰器,元素未找到时自动重试 3 次,而不是直接报错。

第四步,接入验证码识别。

根据用户提供的验证码类型,选择对应的识别策略。比如图形验证码,会接入 ddddocr 库实现自动识别。

关于 ddddocr

ddddocr(俗称「带带弟弟」)是一款轻量级、离线、高准确率的开源验证码识别 OCR 库,专为自动化测试、爬虫与逆向场景设计。使用前需要安装:pip install ddddocr。不依赖 AI 视觉大模型,纯本地运行,落地成本极低。

增强完成后,建议人工打开测试脚本检查一下逻辑:

验证码专项测试

如果你想单独验证验证码识别功能是否可用,不需要跑完整测试流程。可以优化 Skill,增加专项检测功能:

/ui-testscript-enhancer
请对 http://localhost:3000/login 进行验证码识别专项测试,跑 3 轮

Skill 会自动加载页面、定位验证码区域、完成识别后打印输出识别结果,同时截取验证码图片供人工对比。

三轮测试结果:

  • 第一轮识别结果,cpew
  • 第二轮识别结果,zkr7
  • 第三轮实际是 s4ab,识别出来 s+ab,有轻微偏差

整体来看,验证码识别的准确率还是不错的。 而且这个能力并非依托 AI 视觉大模型实现,而是基于开源免费的 ddddocr 库,轻量高效,落地成本极低。

最终输出什么?

增强完成后的脚本,相比基础脚本,新增了以下能力:

增强维度 具体产出
智能等待 6 种场景的等待策略,替代所有硬编码 sleep
安全操作 safe_clicksafe_fillsafe_navigate 等封装方法
异常容错 @retry_on_failure 装饰器,自动重试 3 次
弹窗处理 page.on("dialog") 全局监听,自动关闭意外弹窗
iframe 切换 自动识别嵌套 iframe,生成上下文切换方法
失败追溯 失败时自动截图、录屏(Trace)、记录网络日志
验证码识别 根据类型自动接入对应识别方案

核心价值:解决 AI 生成脚本的「脆弱」问题,让脚本从「能跑」进化为「跑得稳」,真正具备上 CI、跑回归、进流水线的生产级能力。

三、全流程串联回顾

把上面整个过程用命令行风格串起来:

# 1. 准备输入(上一步 ui-testscript-generator 的产出)
ui-test-automation/        ← 基础 UI 测试脚本工程
├── pages/                 ← POM 页面对象类
├── tests/                 ← 测试用例脚本
├── data/                  ← 测试数据
└── ...

# 2. 一句指令启动增强
/ui-testscript-enhancer 请对项目脚本进行增强,登录页有图形验证码

# 3. AI 自动完成四步增强(逐文件扫描 → 替换基类 → 添加容错 → 接入验证码)
   ├─ Step 1: 逐文件扫描 → 生成增强清单
   │   ├─ _page.py: sleep替换、safe_click注入、retry装饰器、iframe处理
   │   └─ test_*.py: 失败截图、Trace录制、弹窗监听、网络日志、全局异常
   ├─ Step 2: base_page.py → enhanced_base_page.py(升级基类)
   ├─ Step 3: @retry_on_failure 装饰器(自动重试 3 次)
   └─ Step 4: 验证码识别策略接入(ddddocr / 滑动 / 点选 / 计算 / 短信 / 打码)

# 4. 最终产出
   ui-test-automation/(增强后)
   ├── pages/enhanced_base_page.py    ← 增强版基类
   ├── pages/*/xxx_page.py            ← 增强后的 POM(safe_click/safe_fill)
   ├── tests/test_*.py                ← 增强后的用例(截图/录屏/弹窗/异常)
   ├── config/playwright.config.py    ← Trace 录制 + 多浏览器配置
   ├── utils/retry_decorator.py       ← 重试装饰器
   └── utils/captcha_solver.py        ← 验证码识别模块

# 5. 下游直接消费(下一篇内容)
   增强脚本 → ui-visual-assert → 视觉断言 + 多浏览器适配
   增强脚本 → 直接接入 CI/CD 流水线执行

四、AI 负责增强,人负责确认

这里同样需要说清楚人机边界。AI 自动补全的健壮性逻辑,并不是直接就完美可用,需要人工确认和微调。

ui-testscript-enhancer 能帮你完成的是「扫描 + 补全」这个动作,把数天的手工加固工作压缩到几分钟。但以下这些事情,仍然需要人来把关:

AI 负责的事 人负责的事
逐文件扫描,识别需要增强的场景 确认增强项是否遗漏(有没有特殊的交互场景)
替换硬编码 sleep 为智能等待 调试等待策略是否符合真实页面加载行为
注入弹窗监听和异常处理 确认弹窗处理逻辑是否会影响正常业务流程
添加重试装饰器 校验重试次数和超时阈值是否合理
接入验证码识别方案 验证码识别准确率是否满足业务要求
生成失败截图和录屏配置 确认截图路径、Trace 存储是否符合 CI 规范

特别提醒几点:

第一,验证码识别准确率不是 100%。 上面的实测中,三轮识别有一轮出现了轻微偏差(s4ab 识别成 s+ab)。对于登录场景,建议结合重试机制使用,或者考虑短信验证码 / 后端 Token 注入等更稳定的方案。

第二,增强后的脚本建议在本地先跑一轮。 确认所有增强逻辑(safe_click、弹窗监听、重试机制)不会影响正常的测试流程,再推到 CI 环境。

第三,弹窗监听要确认范围。 page.on("dialog") 会拦截所有 dialog 事件,如果你的业务流程中某些弹窗是需要断言的(比如确认删除弹窗),需要把监听逻辑和断言逻辑区分开,避免误关。

AI 负责把健壮性逻辑从 0 补到 80,人负责确认和微调到 100。 这样既大幅提升了效率,又不会失去对质量的控制。

五、Skill 源码与完整教程

大家可以自己根据本文提供的思路进行开发 skill,如果需要现成的教程和 skill,也可以加入「狂师 . AI 进化社」获取,里面有各类 AI 技术落地保姆级图文教程、视频教程,包括 AI 赋能测试全流程的实战教程(保姆级手把手喂饭教程,跟着步骤操作,零基础也能快速上手,目前含有 30 多个 AI 测试全场景的 Agent Skill)

温馨提醒,「AI 测试」只是 AI 进化社八大技能版块之一。

写在最后

回顾一下整个流程:

痛点: 硬编码 sleep 时灵时不灵、验证码拦路、弹窗干扰、iframe 穿不进去、失败后无法追溯、偶发失败没人敢信。

方案:ui-testscript-enhancer Skill,对基础脚本进行六大维度增强:智能等待补全、弹窗与干扰处理、iframe/Shadow DOM 处理、异常重试与容错、失败追溯增强、验证码识别。

效果: 传统模式下,人工逐个文件加固健壮性逻辑,一个 20 页面的项目至少需要 3-5 天。而 ui-testscript-enhancer 只需要几分钟,就能完成全量扫描和增强,让脚本从「能跑」进化为「跑得稳」。

边界: AI 负责扫描和补全,人负责确认和微调。验证码识别准确率需要实测验证,增强后的脚本建议先本地跑一轮再上 CI。

这里再聊一个设计上的考量。为什么把「健壮性增强」单独拆成一个 Skill,而不是直接在 ui-testscript-generator 里就把这些逻辑加上?

因为关注点不同ui-testscript-generator 的核心职责是「生成」,解决的是从 0 到 1 的问题;ui-testscript-enhancer 的核心职责是「增强」,解决的是从 1 到 100 的问题。拆开之后,每个 Skill 逻辑更聚焦,也更灵活。比如你有一批存量脚本(不是 AI 生成的),只想做健壮性增强,直接调 ui-testscript-enhancer 就行,不需要重新走一遍生成流程。

单一职责,闭环衔接。 这是整套 Skill 设计的核心原则。

目前这套 AI 测试赋能的 Skill 技能组合,「狂师 . AI 进化社」的成员都在使用,很多同学反馈,脚本稳定性显著提升,CI 上的偶发失败大幅减少,终于不用每天对着测试报告「重跑试试」了。

下一篇,我们聚焦 ui-visual-assert,聊聊如何为 UI 脚本补充视觉断言能力,实现跨浏览器、跨分辨率的界面兼容性校验,让脚本不仅「跑得稳」,还能「看得准」。

posted @ 2026-08-04 09:27  狂师  阅读(88)  评论(0)    收藏  举报