我构建了使用能够自我修复的 AI 的 Selenium Self-Healing 测试(方法如下)

发布: (2025年12月11日 GMT+8 02:33)
7 min read
原文: Dev.to

Source: Dev.to

Selenium 自愈演示

每个 QA 自动化工程师都会遇到的问题

你在星期五写了一个完美的 Selenium 测试。星期一早上,它就失败了。开发者把按钮的 ID 从 submit-btn 改成了 submit-button。你的测试坏了,你只能花时间修复定位器,而不是去测试新功能。

听起来很熟悉吧?我也遇到过很多次。正因如此,我构建了一个框架,让 AI 自动修复失效的定位器——再也不用担心维护噩梦。

如果测试能够自我修复呢?

传统测试:
测试运行 → 找不到元素 → 测试失败 → 你手动修复

自愈测试:
测试运行 → 找不到元素 → AI 分析页面 → AI 找到新定位器 → 测试继续

第二种情景现在已经可以实现,我将在下面一步步展示如何构建它。

我的解决方案:AI 驱动的自愈

我创建了一个框架,结合了:

  • 行为驱动开发(BDD)用于可读的测试
  • Selenium 用于浏览器自动化
  • 本地 AI 用于智能定位器修复

最棒的是?它完全在你的机器上运行,使用免费、开源的工具。

一个真实案例

Gherkin 场景

Scenario: Search Wikipedia
    Given I navigate to "https://www.wikipedia.org"
    When I search for "Selenium"
    Then the page should contain "Selenium"

故意写错的定位器

private readonly By _searchBox = By.Id("searchBox");  // 错误!
// 实际 ID 是 "searchInput"

当测试运行时:

  1. 尝试使用 By.Id("searchBox") 找元素 → ❌ 失败
  2. AI 分析页面 HTML → 找到合适的定位器
  3. 测试使用新定位器 → ✅ 成功

测试在没有任何人工干预的情况下自行修复。

实际工作原理

架构

  1. 第 1 层 – 测试(BDD) – 测试使用 Gherkin 编写,人人都能读懂。
  2. 第 2 层 – 自愈引擎 – 当定位器失效时捕获页面 HTML 并将其连同上下文一起发送给 AI。
  3. 第 3 层 – AI – 本地运行(如 Ollama 或 GPT),根据提供的描述给出新定位器。

代码流程

// 步骤 1:正常查找元素
try
{
    return driver.FindElement(locator);
}
catch (NoSuchElementException)
{
    // 未找到元素 - 启动自愈
}

// 步骤 2:请求 AI 帮助
var pageHTML = driver.PageSource;
var suggestion = await aiClient.GetSuggestedLocator(
    pageHTML,
    failedLocator,
    "Search box"  // 人工描述
);

// 步骤 3:尝试 AI 的建议
var element = driver.FindElement(By.XPath(suggestion));
// 成功!

整个过程大约耗时 2–3 秒。

为什么这种方式有效

  • 上下文感知:AI 能理解元素描述(例如 “登录按钮”),并找到相匹配的元素。
  • 无需训练:直接利用模型对 HTML 的通用知识,无需自定义机器学习训练。
  • 免费且私密:全部本地运行——没有 API 费用,数据也不离开你的网络(使用 Ollama 时)。
  • 语言无关:适用于 React、Angular、Vue 或纯 HTML;AI 只读取渲染后的 HTML。

快速上手(其实很简单)

步骤 1 – 安装前置条件

  • .NET 9 SDK(免费)
  • Ollama(免费,本地 AI)或 OpenAI API Key
  • Chrome 浏览器

步骤 2 – 下载 AI 模型

ollama pull qwen3-coder:480b-cloud

步骤 3 – 运行演示

dotnet restore
dotnet build
dotnet test

三条命令,你就能看到 AI 自愈的实际效果。

构建过程中的收获

  • AI 需要上下文:提供类似 “search box” 的描述对准确建议至关重要。
  • 本地 AI 已足够:免费模型如 Qwen3‑Coder 在定位器修复上表现优秀。
  • 重试逻辑重要:实现多次重试后成功率从约 70 % 提升到约 95 %。
  • 温度参数关键:低温度(如 0.1)能产生一致、可复现的定位器建议。

何时适合使用?

适用场景

  • 经常失效的回归套件
  • UI 变化频繁的应用
  • 需要“魔法”演示的 Demo
  • QA 人力有限的团队

不适用场景

  • 生产监控(对速度有严格要求)
  • 性能测试(AI 会带来额外开销)
  • 需要像素级精准定位的场景
  • 必须绝对避免误报的测试

技术细节

AI 集成

一个简单的 HTTP 客户端与 Ollama 的 API 通讯:

var response = await httpClient.PostAsync(
    "http://localhost:11434/api/generate",
    jsonContent
);

提示示例

You are a Selenium expert.
This locator failed: By.Id('searchBox')
Element description: Search input box
Here's the HTML: [truncated HTML]
Suggest a new locator that will work.
Return only the locator, nothing else.

缓存策略

如果同一定位器在同一页面上第二次失效,直接复用上一次的 AI 建议,可将重复失效的修复时间降低约 90 %。

错误处理

如果所有 AI 尝试均失败,测试会像往常一样以清晰的错误信息失败——不会出现静默错误。

扩展框架

  • 添加新站点:只需用纯英文创建新的 feature 文件,自愈功能会自动生效。
  • 切换 AI:通过修改单个配置文件即可切换到 OpenAI:
{
  "Provider": "OpenAI",
  "ApiKey": "sk-your-key",
  "Model": "gpt-4o"
}
  • 自定义修复逻辑:引擎是可扩展的,你可以为特定元素类型添加自定义策略。

亲自尝试

完整框架已提供,包含:

  • 完整注释的代码
  • 可运行的演示测试
  • 设置步骤
  • 文档

所有内容均面向初学者设计。即使你从未编写过 Selenium 测试,也能在 10 分钟内跑通。仓库里自带一个故意写错定位器的 Wikipedia 搜索测试,用来实时展示 AI 如何修复。

GitHub Repo:

Back to Blog

相关文章

阅读更多 »