9lives 场景:AI 编码 Agent 改坏了你的测试?让 9lives 自动修复
你的 Claude Code 刚重构了一个按钮的实现,CI 瞬间飘红。你切过去一看——Playwright 测试中 page.getByRole('button', { name: '提交订单' }) 找不到了,因为按钮的文字被你改成了”确认提交”。
以前的做法:打开测试文件,手动找定位器,改一下,重新跑。如果 Agent 一天改 10 个地方,你就得修 10 次测试。
9lives 就是来解决这个问题的——一个自愈式测试运行器(Self-healing QA),专为 AI 编码 Agent 时代设计。当你的 Agent 改了代码把测试搞坏了,9lives 自动分析失败原因、修复定位器、重跑验证,全程不需要你手动改一行测试。MIT 开源,pip install 9lives 一键安装,支持 Playwright、Cypress 和 Selenium。
安装
9lives 提供多种安装方式:
pip install 9lives uv tool install 9lives curl -sL 9lives.run | sh 9l doctor
需要 Node.js ≥ 18(Playwright 本身依赖 Node.js 运行时),你的 Playwright 项目结构保持不变。
场景一:Agent 改了按钮,测试自动修复
这是 9lives 最核心的场景——Selector Drift(定位器漂移)。你的 AI 编码 Agent 改了 UI 文案,Playwright 测试找不到元素了:
9l heal tests/login.spec.ts
9lives 做了四件事:
- 运行测试,捕获失败时的页面快照和错误信息
- Tier 1 离线修复:用快照中的 DOM 重新查找目标元素(按 text、testid、id、class、aria-label 多维度搜索),自动重写定位器——完全离线,零 API 调用
- 重跑验证,确认修复后的测试通过
- 展示 diff,等你确认后写入文件
整个过程在你的机器上完成,不需要任何 API key。输出是标准的 unified diff 格式,改动一目了然。
场景二:结构性变更,需要 Agent 的推理能力
如果定位器漂移发生在更复杂的场景——比如整个组件被重写、DOM 结构调整——Tier 1 的离线模式不够用。这时 9lives 自动升级到 Tier 2:
9l heal checkout.spec.ts
Tier 2 会把当前失败测试、页面快照和错误信息打包成一个 prompt,直接调用你本机已安装的 Claude Code、Codex 或 OpenCode CLI。这意味着:
- 使用你已有的订阅(你的 Agent CLI 已经登录了账号),不需要额外申请 API key
- Agent 的推理能力用于理解 DOM 结构变化,而不仅仅是匹配选择器
- 修复后的 diff 仍然需要你确认后才写入
如果某个 Agent CLI 不可用,9lives 自动降级到下一个可用 CLI。你也可以通过环境变量强制指定:
NINELIVES_PROVIDER=anthropic 9l heal checkout.spec.ts
场景三:给 Agent 的 MCP 工具——开发循环内自愈
9lives 提供了一个 MCP 服务器,让 AI 编码 Agent 在写代码的循环中就能自愈测试,而不必等到 CI 阶段:
claude mcp add 9lives -- 9l mcp
注册后,Agent 可以调用 heal_test 和 run_test 两个 MCP 工具。Agent 写完代码跑测试发现失败时,不用等你介入——它自己调用 heal_test,修复定位器,确认 diff 后继续工作。
Agent 的 assertion 失败不会被静默修复——9lives 会明确标记为 needs-human,并提示”强制变绿会掩盖真正的 bug”。
其他实用命令
9l watch tests/ --yes 9l heal e2e/login.spec.ts --yes 9l report 9l report --md brittle-selectors.md
9l watch 配合 --yes 可以把修复嵌入编辑-保存循环——你改代码保存,测试自动修复,完全无感。
GitHub Actions 集成
在你的流水线中加一步,CI 自愈:
- uses: quality-max/9lives/action@v1
with:
specs: "tests/**/*.spec.ts"
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
commit-healed: "true"
在你自己的 runner 上运行,用你自己的 API key,修复后的测试自动提交回分支,PR 上还会贴一份 🐾 报告。
支持三种测试框架
9lives 不只是 Playwright 的专属工具:
| 框架 | 检测方式 | 工作流 |
|---|---|---|
| Playwright | .spec.ts / 项目依赖 | 原生支持,自动 scaffold |
| Cypress | .cy.js / .cy.ts | 在你的项目中运行 npx cypress run |
| Selenium | .py | 在你的 pytest 环境中运行 |
9l heal cypress/e2e/login.cy.js # Cypress 测试 9l heal tests/test_checkout.py # Selenium 测试
Cypress 的定位错误包装在 AssertionError 中,9lives 能识别出这是 selector drift 而非真正的断言失败——不会误判。
不会掩盖真正的 bug
这是 9lives 最重要的设计原则。assertion 失败不会被自动修复——如果测试中的断言(”页面包含’支付成功'”)失败了,说明应用的行为发生了变化,而不是选择器漂移。9lives 拒绝重写 assertion 来强制测试变绿,这是它与”傻瓜式自愈工具”的核心区别。
如果你正在开发阶段确实想更新断言(比如文案从”支付成功”改成了”订单已提交”),可以通过环境变量启用:
NINELIVES_HEAL_ASSERTIONS=1 9l heal payment.spec.ts
隐私与安全
- Tier 1 完全离线,不发送任何数据
- Tier 2 的 prompt 构建自失败测试和页面快照;在 subscription 模式下通过本地 Agent CLI 处理,在你的机器上完成
- 测试记录(
.9lives/history.jsonl)始终存在本地,不上传任何第三方 - 所有操作都在你的机器或你的 CI runner 上执行
相关链接