AI 辅助 UI 测试工作流设计(元素定位与自愈)
当 UI 测试因页面元素变化(如 ID、类名修改)而失败时,AI 能自动分析新页面结构,生成新的元素定位器(XPath/CSS Selector),并修复测试脚本,实现“自愈”。评估技术选型:选择 DeepSeek API、ChromaDB、Playwright 等工具。
·
1. 目标
当 UI 测试因页面元素变化(如 ID、类名修改)而失败时,AI 能自动分析新页面结构,生成新的元素定位器(XPath/CSS Selector),并修复测试脚本,实现“自愈”。
2. 工作流概览
flowchart TD
A[UI 测试失败] --> B[捕获失败截图与 HTML]
B --> C[AI 服务接收失败数据]
C --> D[分析旧定位器与新页面结构]
D --> E[生成候选定位器]
E --> F[验证定位器有效性]
F --> G[选择最优定位器]
G --> H[自动更新测试脚本]
H --> I[提交修复代码到 Git]
I --> J[重新执行测试]
J --> K{成功?}
K -->|是| L[标记为自愈成功]
K -->|否| M[通知人工介入]
3. 详细步骤
步骤 1:捕获失败数据
- 触发条件:Selenium 测试执行失败(
NoSuchElementException、TimeoutException)。 - 自动捕获:
- 当前页面 HTML 源码(
driver.getPageSource()) - 失败元素的截图(
((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE)) - 原始定位器(如
By.id("login-btn")) - 失败堆栈信息
- 当前页面 HTML 源码(
- 存储:保存到
target/failures/目录,按时间戳命名(如failure_20260304_120000/)。
步骤 2:AI 服务接收请求
- 测试平台通过 HTTP POST 将失败数据发送到 AI 服务:
{ "page_html": "<html>...</html>", "screenshot_base64": "iVBORw0KGgo...", "original_locator": "By.id(\"login-btn\")", "test_class": "ui.UiLoginTest", "test_method": "testLoginSuccess" }
步骤 3:分析页面结构
AI 服务执行:
- 解析 HTML:使用 BeautifulSoup 或 jsoup 提取 DOM 树。
- 定位器分析:
- 识别原始定位器对应的元素(如
id="login-btn")。 - 检查该元素是否仍存在,属性是否变化(如
id变为id="login-button-123")。
- 识别原始定位器对应的元素(如
- 上下文理解:
- 查找语义相似的元素(如包含“登录”、“sign in”、“submit”等文本的按钮)。
- 分析父级/兄弟元素结构,推断元素功能。
步骤 4:生成候选定位器
AI 模型(如 DeepSeek)根据提示词生成多个候选定位器:
提示词示例:
你是一个资深 UI 测试工程师。请根据以下失败的测试信息,生成新的元素定位器。
原始定位器:By.id("login-btn")
页面 HTML:
{page_html}
失败原因:元素未找到,可能因为 ID 变更。
请生成 3 个候选定位器,按优先级排序:
1. 使用 ID(如果存在)
2. 使用 CSS Selector(推荐)
3. 使用 XPath(作为备选)
要求:
- 定位器必须唯一、稳定、不依赖动态属性。
- 优先使用语义化属性(如 text、aria-label)。
- 输出格式:["css: button:has-text('登录')", "xpath: //button[contains(text(), '登录')]", "id: login-button-123"]
输出示例:
["css: button:has-text('登录')", "xpath: //button[contains(text(), '登录')]", "id: login-button-123"]
步骤 5:验证定位器有效性
AI 服务使用模拟器或轻量级浏览器(如 Playwright)验证每个候选定位器:
- 检查是否能定位到唯一元素。
- 检查元素是否可见、可点击。
- 选择第一个有效的定位器。
步骤 6:自动更新测试脚本
- 定位:在项目中找到
UiLoginTest.java文件。 - 修改:使用
apply_diff工具替换旧定位器:// 原始代码 WebElement loginBtn = driver.findElement(By.id("login-btn")); // 替换为 WebElement loginBtn = driver.findElement(By.cssSelector("button:has-text('登录')")); - 提交:自动提交到 Git 分支
ai-self-healing。
步骤 7:重新执行与反馈
- Jenkins 自动触发该测试的重新执行。
- 如果成功,标记为“AI 自愈成功”,并记录日志。
- 如果失败,通知测试工程师人工介入。
4. 技术实现要点
- AI 模型:DeepSeek-V3(支持长文本、代码生成)。
- HTML 解析:Python + BeautifulSoup。
- 定位器验证:Playwright(轻量级,可嵌入服务)。
- 代码修改:使用
apply_diff工具(精确匹配)。 - 安全:不上传生产环境页面,仅使用测试环境截图。
5. 优势与价值
| 传统方式 | AI 自愈 |
|---|---|
| 手动修改每个失败的测试 | 自动修复,节省 80% 维护时间 |
| 需要开发/测试人员介入 | 无人值守,持续集成 |
| 修复周期长(小时/天) | 修复周期短(分钟) |
| 依赖人工经验 | 基于模式学习,持续优化 |
6. 下一步
评估技术选型:选择 DeepSeek API、ChromaDB、Playwright 等工具。
更多推荐


所有评论(0)