在 Web UI 自动化测试中,最常见的失败并不是业务断言出错,而是页面改版后原有选择器找不到元素。为降低这类维护成本,“自愈定位”被寄予厚望:当旧定位方式失效时,系统自动寻找新的元素定位。但从开源项目的源码来看,这条路径并不像宣传中那样已经高度智能化。老牌项目 Healenium 的核心机制仍以规则打分为主,而真正引入大模型的 robotframework-selfhealing-agents,也需要依赖确定性校验和人工复核。
老牌项目的“自愈”,主要是规则打分
Healenium 是该领域 star 数较高的开源项目之一,当前为 201 star,最近一次提交时间为 2026-09-07,仍在维护。其 README 提到“利用机器学习让 Selenium 测试自我修复”。但源码层面可以看到,主要自愈流程并不包含训练数据或模型推理。
运行时,SelfHealingEngine 会在定位失败后解析当前 DOM,再交给 tree-comparing 0.4.14 做树匹配。匹配逻辑先用最长公共子序列比较历史路径和当前节点路径,再用启发式距离为候选节点打分。整个过程更像一套确定性规则引擎,而不是模型学习。
会算“相似”,但难判断“用途”
Healenium 的打分逻辑由 PathFinder.findScoresToNodes() 和 HeuristicNodeDistance.distance() 完成。公式先计算路径结构相似度:score = LCSDistance / curPathHeight * 100.0;随后叠加节点属性分数,总上限为 350.0,最后归一化到 [0, 1]。
- 标签相同加 100.0 分;
- ID 相似度最高加 50.0 分;
- class 交集比例最高加 40.0 分;
- 文本内容与其他属性的编辑距离相似度分别有 30.0 分权重。
最终结果会经过 score-cap 阈值过滤,默认值为 .6,测试配置中为 .55。超过阈值的候选节点按分数降序排列,逐个转换为 CSS 选择器或 XPath,并通过 driver.findElements() 验证是否能唯一定位。
这套机制能处理 login-btn 改成 signin-btn 一类变化,因为编辑距离较小;但若改成语义相同但字符串差异更大的 submit-auth,分数会明显下降。原因在于,它比较的是标签、ID、class、文本和属性层面的相似程度,而不是元素在页面中的功能。
Healenium 也保留了另一条路径:RestClient 中的 getXpathSelector 方法会向独立 AI 服务发送节点信息,默认地址为 http://localhost:6565,且只在 selector-type 配置为 xpath 时作为备选路径调用。如果返回 404,代码会直接提示需要付费的 hlm-ai 服务。这说明纯规则打分不足以覆盖所有场景,但相关语义能力被放在闭源商业组件中。
LLM 入场:从“元素在哪”走向“元素在做什么”
与 Healenium 不同,MarketSquare 的 robotframework-selfhealing-agents 是一个能在源码中看到真实 LLM API 调用的开源实现。该项目 27 star,采用 Apache-2.0 协议,创建于 2025-04,最近提交为 2026-02。它作为 Robot Framework 的 Listener 插件,在定位失败后介入。
架构分为两层。OrchestratorAgent 基于 PydanticAI,先判断错误是否属于定位器失败;如果不是,例如断言失败或网络问题,则返回 NoHealingNeededResponse,避免消耗 token。确认定位失败后,系统再调用负责修复的定位器智能体。
定位器智能体提供两种取向:一种更依赖 LLM 生成候选定位器,覆盖面更广,但可能出现语法正确却选不到元素的输出;另一种更依赖 DOM 工具做确定性枚举,更保守,但受限于枚举能找到的内容。项目通过 use_llm_for_locator_generation 配置切换,默认值为 True。
该项目没有直接采信模型输出。output_validator 会对候选定位器做确定性过滤:能唯一定位元素的候选会被排前;针对 click、tap、select 等场景,还会过滤出真正可点击或可选择的元素。如果没有候选通过校验,系统会触发 ModelRetry,而不是返回可能错误的结果。
成本和模型配置也被显式约束。orchestrator_agent_provider 和 locator_agent_provider 支持 openai 与 azure,默认模型为 gpt-4o-mini;request_limit 默认 5,total_tokens_limit 默认 6000,用于限制请求次数和 token 消耗。
自愈结果不是终点,而是复核线索
将两类方案放在一起看,可以看到自愈定位的共同边界:它们判断的是“新页面上是否存在一个与旧元素相似的组件”,而不是“这次页面变化是否符合产品预期”。因此,一次无害的 ID 重命名,和一次误删按钮后又补上相似但功能不同的新按钮,在规则打分或语义判断中都可能被误认为可修复。
这也意味着,自愈结果更适合作为留痕和复核对象,而不是自动让测试通过的最终结论。robotframework-selfhealing-agents 会生成 healed_files_report 和 diff_files_report,把自愈记录为需要回顾的变更;Healenium 也提供 backlight-healing 配置,默认值为 true,用于在测试报告中标记相关元素。
对测试团队而言,这类工具的价值不在于消除所有定位失败,而在于把脆弱的选择器维护变成一条可追踪的工程线索。当页面变化被自动修复时,真正需要确认的是:这次变化究竟是一次普通实现调整,还是一次应被发现的 UI 回归。
原创文章,作者:点点,如若转载,请注明出处:https://www.dian8dian.com/dang-zi-dong-hua-ce-shi-zhao-bu-dao-an-niu-zi-yu-ding-wei