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 测试执行失败(NoSuchElementExceptionTimeoutException)。
  • 自动捕获
    • 当前页面 HTML 源码(driver.getPageSource()
    • 失败元素的截图(((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE)
    • 原始定位器(如 By.id("login-btn")
    • 失败堆栈信息
  • 存储:保存到 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 服务执行:

  1. 解析 HTML:使用 BeautifulSoup 或 jsoup 提取 DOM 树。
  2. 定位器分析
    • 识别原始定位器对应的元素(如 id="login-btn")。
    • 检查该元素是否仍存在,属性是否变化(如 id 变为 id="login-button-123")。
  3. 上下文理解
    • 查找语义相似的元素(如包含“登录”、“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 等工具。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐