Playwright Test Agents 上手:测试自动化从写脚本,变成审核计划

作者:Administrator 发布时间: 2026-04-28 阅读量:4 评论数:0

以前聊 Playwright,重点多半落在“怎么点按钮、怎么找元素、怎么稳定跑 CI”。到了 Agent 这一步,问题其实变了:不是让 AI 多会操作浏览器,而是让它别把测试写成一锅粥。

Playwright Test Agents 有意思的地方就在这儿。它没有把“写测试”塞给一个万能 Agent,而是拆成三个角色:Planner 先把测试计划写出来,Generator 再生成代码,Healer 最后处理失败测试。中间产物是 Markdown 计划和 Playwright spec 文件,人能看、能改、能追责。

官方资料:playwright.dev/docs/test-agents
适合场景:给已有 Web 项目补 E2E 覆盖、把 PRD 转测试场景、批量修复因 UI 变动挂掉的测试。

它不是又一个 MCP

Playwright MCP 给 Agent 一双“眼睛”:把页面结构、可访问性树、操作结果喂给编码工具,让它在对话里帮你一步步写测试。

Playwright CLI 更像一套“命令手”:导航、点击、填表、截图都能被脚本化调用,适合放进更大的自动化流程里。

Test Agents 往前走了一步。它不是工具,而是一条面向测试的流水线:

  • Planner:探索应用,输出人能读懂的测试计划。
  • Generator:把测试计划变成可执行的 Playwright Test。
  • Healer:测试失败后回放现场,尝试修复选择器、等待、断言或测试数据。

这三个角色可以单独用,也可以顺序接力。关键不是“AI 自动点网页”,而是把测试建设从“开发者手写脚本”改成“开发者审核计划和 diff”。这就靠谱多了,不然 Agent 一顿猛写,最后没人知道它测了啥、没测啥。

Playwright Test Agents 把 E2E 测试拆成 Seed、Planner、Generator、Healer 和 Review 五个可审计环节
Playwright Test Agents 把 E2E 测试拆成 Seed、Planner、Generator、Healer 和 Review 五个可审计环节

先把 Agent 定义放进项目

在已有 Playwright 项目里,先执行:

npx playwright init-agents

如果你在 Claude Code、VS Code 或 OpenCode 里跑,可以按官方文档选择对应 loop,例如:

npx playwright init-agents --loop=claude

这一步会把 Playwright 提供的 Agent 定义写进项目。它们本质上是“给编码 Agent 看的操作手册”:有哪些 MCP 工具、每个阶段该读什么文件、产物应该放哪儿、失败后怎么处理。

有个细节别忽略:Playwright 升级以后,最好重新跑一次 `init-agents`。Agent 定义不是魔法,它跟着 Playwright 工具和指令变化走;版本升了,说明书也要同步。

Seed 文件决定上限

Test Agents 工作流里最容易被低估的是 `seed.spec.ts`。它不是为了断言某个业务功能,而是为了告诉 Agent:这个项目怎么进门。

比如登录、创建测试账号、加载 fixture、切换租户、进入目标页面,这些最好写进 seed。Planner 会先跑 seed,让环境进入一个可探索状态;Generator 也会把 seed 当成测试风格样本,沿用你的 fixture、封装和断言习惯。

一个简化版 seed 可以像这样:

import { test, expect } from './fixtures';

test('seed', async ({ page }) => {
  await page.goto('/login');
  await page.getByLabel('Email').fill(process.env.E2E_USER!);
  await page.getByLabel('Password').fill(process.env.E2E_PASSWORD!);
  await page.getByRole('button', { name: 'Sign in' }).click();
  await expect(page.getByRole('navigation')).toBeVisible();
});

这里不一定要测完整业务,但要把“进系统”这件事做稳。没有 seed,Planner 很容易卡在登录页、权限页、引导页,然后生成一堆看起来像测试、实际跑不起来的东西。

一个更稳的实战流程

别一上来就说“帮我给整个系统生成测试”。Agent 最怕目标太大,最后变成一堆泛泛的点击流。

更稳的做法是按模块走:

1. 准备 seed.spec.ts,让环境能进入目标模块。
2. 让 Planner 为“购物车结算流程”生成测试计划。
3. 人先审 specs/checkout-flow.md,补边界条件和异常路径。
4. 让 Generator 基于这份计划生成 tests/checkout-flow.spec.ts。
5. 本地跑测试,失败的交给 Healer 修。
6. 人审最终 diff,再合并到仓库。

Planner 的产物应该先看一眼。它可能漏掉优惠券、库存不足、地址为空、支付失败这些边界;也可能把“看起来能点通”误认为“真正应该覆盖”。这一步人不需要写代码,但需要像测试负责人一样判断覆盖面。

Generator 会把 Markdown 计划翻译成 `.spec.ts`,并在生成过程中验证选择器和断言。它比纯文本生成代码靠谱,因为会真的面对浏览器。但“能跑”不等于“测试质量好”。断言是不是太浅?有没有只检查 toast,不检查数据库状态?测试之间会不会互相污染?这些仍然要看。

Healer 适合处理前端小改动带来的失败,比如按钮文案变了、DOM 层级调整、等待条件不稳定。它不适合处理需求变化。产品逻辑改了,接口 schema 改了,旧测试本来就应该失败,这时候让 Healer 硬修,容易把 bug 修成“测试沉默”。

别把自愈直接接到主分支

测试自愈听着爽,但生产里要收着点用。比较安全的落地方式是:

  • Healer 只能在临时分支或 PR 里提交修复,不能直接推主分支。
  • 修复 PR 必须带上失败原因、修改文件、重新运行结果和 trace 链接。
  • 如果 Healer 选择 skip,必须把 skip 原因写进 issue,不能当成通过。
  • 对核心链路设置更严格规则:登录、支付、权限、数据删除这类测试不能自动降级。
  • CI 里保留 trace、video、screenshot,方便人复查 Agent 到底看到了什么。

这套规则有点啰嗦,但很必要。测试是质量闸门,不是为了让红灯变绿。Agent 可以修脚本,但不应该替团队决定“这个失败不重要”。

和传统测试工程怎么配合

比较现实的分工是:

  • 人负责测试策略、核心路径、边界条件、断言标准。
  • Planner 负责把目标模块拆成可执行场景。
  • Generator 负责把计划落成 Playwright 代码。
  • Healer 负责处理因 UI 小变动导致的测试维护成本。

这样用,Test Agents 不是“替代测试工程师”,更像把重复劳动往后推了一层。以前你花半天搭第一版 E2E,现在可能先花半小时审计划,再把生成和修复交给 Agent。省下来的不是脑子,是那些反复找 selector、补 wait、看 trace 的体力活。

顺手提一嘴:如果你想把 Playwright、预发环境和测试 Agent 放在一台隔离机器上跑,别直接塞进生产服务器。可以用一台轻量云主机单独做 E2E runner,环境坏了也好重建。雨云这类云服务器/对象存储适合拿来搭实验环境:https://www.rainyun.com/NDcxMTIz_。重点是隔离,不是堆配置。

什么时候该用,什么时候别上头

适合用 Test Agents 的场景很明确:项目已经有基本 Playwright 配置;你要补某个模块的 E2E 覆盖;需求相对清楚;团队愿意审测试计划和代码 diff。

不适合的场景也很明确:页面还在天天改;需求没有定;系统登录和测试数据都没理顺;团队只是想“一键生成全部测试”。这种时候 Agent 只会把混乱放大。

Playwright Test Agents 真正带来的变化,不是“AI 帮我写了几个测试”,而是把 E2E 测试变成一条可审计的 Agent 流程:先计划,再生成,再修复,最后由人判断能不能进仓库。这个顺序对了,测试自动化才有机会从苦力活变成工程资产。

评论