用 recording-browser-flow-as-test:在浏览器里走一遍流程,自动生成 Playwright 测试

前言

写端到端(E2E)测试时,最耗时间的往往不是断言本身,而是把「用户在页面上点了什么、填了什么」准确翻译成稳定的选择器。很多人会先手点一遍流程,再对着 DevTools 抄 CSS;过一阵子 DOM 一变,测试就开始飘红。Playwright 自带 Codegen 能录操作,但录出来的选择器质量参差不齐,后续仍要人工整理。

recording-browser-flow-as-test 把这件事交给 Agent Skill:在 Cursor 内置浏览器里逐步走查用户流程,每一步用无障碍树(accessibility tree)记下角色与名称,最后输出一份可回放的 Playwright 测试文件。它来自 spencerpauly 维护的 awesome-cursor-skills 仓库,官方说明见该仓库下的 resources/recording-browser-flow-as-test/SKILL.md

这是什么

一句话定位:把 Cursor 的 browser MCP 当「录制器」用——导航、点击、填写、按键都会记成结构化步骤,再翻译成基于 getByRole / getByLabel 等稳定定位的 Playwright 脚本。

官方 frontmatter 描述如下:

  • namerecording-browser-flow-as-test
  • description:在 Cursor 内置浏览器中逐步执行用户流程并记录每一步,再生成使用无障碍树派生稳定选择器的 Playwright 测试,用于回放同一流程
  • user-invocabletrue(可在对话里用 / 手动唤起)

Skill 原文强调:这是 Cursor 原生工作流,依赖 browser_snapshot(refs + roles + names)与结构化操作,而不是单独装一个浏览器录制扩展。

核心功能与亮点

根据官方 SKILL.md,能力可以概括为下面几点。

  1. 边走查边记录
    Agent 对每一步先 browser_snapshot 拿到无障碍树与元素 ref,再做最小交互(browser_click / browser_fill / browser_type / browser_select_option / browser_navigate),并把步骤记进结构化列表。

  2. 优先稳定定位,而不是坐标或脆弱 CSS
    写给 Playwright 的定位策略优先顺序是:
    - getByRole('button', { name: '...' })
    - getByLabel('...')
    - getByPlaceholder('...')
    - 应用已使用 test id 时再用 getByTestId('...')
    官方提示:角色与可访问名称通常比从 DevTools 抄来的 CSS 更稳;名称含糊时,可在应用里补 data-testid

  3. DOM 变化后重新快照
    导航或会改 DOM 的操作之后,要求再拍一次 browser_snapshot 再继续;异步内容可用 browser_wait_for 或按 cursor-ide-browser 指引做短等待,然后再快照。

  4. 生成可落地的测试文件并加固
    默认输出类似 tests/recorded/<flow-name>.spec.ts 的文件,包含 test.describe / test(...),步骤写成 page.gotogetByRole(...).click() 等。最终文件里不能留下 snapshot 的 raw ref(那是会话临时的)。生成后建议:

npx playwright test tests/recorded/<flow-name>.spec.ts

加固建议包括:点击前用 expect(locator).toBeVisible();异步列表用 toPass() 重试;尽量避免随意的 waitForTimeout

  1. 断言底线
    至少要有:URL 相关断言(toHaveURL 或 URL 片段),以及一个可见结果(文本、角色或 test id)。

安装与启用

该 Skill 收录在 spencerpauly/awesome-cursor-skills 中。可用 skills CLI 按名称安装:

npx skills add spencerpauly/awesome-cursor-skills --skill recording-browser-flow-as-test

若只要装到某个 Agent,可加 -a,例如 Claude Code:

npx skills add spencerpauly/awesome-cursor-skills --skill recording-browser-flow-as-test --agent claude-code

也可以整库安装(会装上该集合里的多个 Skill):

npx skills add spencerpauly/awesome-cursor-skills

按 Cursor 官方文档,项目级 Skill 会从 .agents/skills/.cursor/skills/ 等目录自动发现;用户级则对应 ~/.agents/skills/~/.cursor/skills/。手动方式就是把官方 SKILL.md 放到例如:

.cursor/skills/recording-browser-flow-as-test/SKILL.md

或:

.agents/skills/recording-browser-flow-as-test/SKILL.md

启用后:在 Agent 对话里输入 /,搜索 recording-browser-flow-as-test 即可手动调用;描述匹配时,Agent 也可能自动选用该 Skill。

说明:Skill 文件本身是通用的 SKILL.md 格式,Claude Code、Codex 等支持 Agent Skills 的工具也能装。但本 Skill 的工作流明确依赖 Cursor 内置浏览器 / browser MCP(browser_snapshot 等),在非 Cursor 环境里即使装了文件,完整「录流程 → 出 Playwright」链路也未必可用,需以各工具实际浏览器能力为准。

典型用法示例

前置条件

官方要求:

  • 目标应用可访问(例如本地 dev server 已启动;需要找端口时,同仓库还有 finding-dev-server-url Skill)
  • 仓库已安装或即将安装 Playwright(@playwright/test);没有的话可用同仓库的 adding-e2e-tests,或按项目既有方式接入

录制流程(与官方一致)

1. 先用一句话界定范围,例如:

登录,打开 Settings,切换深色模式,保存。

2. 对每一步按顺序执行

  1. browser_snapshot 获取无障碍树与 ref
  2. 选择最小交互(优先用 snapshot 的 ref 点击,而不是坐标点击)
  3. 在 Agent 维护的列表里记录:步骤号、动作动词(navigate / click / fill / press / select)、Playwright 定位策略、填写值或 URL、可选短断言
  4. DOM 或导航变化后再 snapshot
  5. 需要等异步内容时,browser_wait_for 后再 snapshot

3. 补断言 → 生成 tests/recorded/...spec.ts → 跑测并加固

你可以在 Cursor 里直接这样唤起(表述接近官方示例即可):

请按 recording-browser-flow-as-test:在浏览器里走查「登录 → 打开 Settings → 切换深色模式 → 保存」,
每步用 browser_snapshot,记录稳定定位,最后生成 Playwright 测试到 tests/recorded/dark-mode-settings.spec.ts,并跑一遍。

生成文件应包含官方要求的结构:test.describetest('...', async ({ page }) => { ... }),步骤写成 await page.goto(...)await page.getByRole(...).click() 等。示意如下(定位字符串必须以当次 browser_snapshot 的 role/name 为准,不可照抄):

import { test, expect } from '@playwright/test';

test.describe('<flow-name>', () => {
  test('<one-sentence scope>', async ({ page }) => {
    await page.goto('<app-url>');
    // 录制日志里的 navigate / click / fill / press / select
    // 优先: getByRole / getByLabel / getByPlaceholder / getByTestId
    await page.getByRole('button', { name: '<from snapshot>' }).click();
    await expect(page).toHaveURL(/<expected-path>/);
    await expect(page.getByRole('<role>', { name: '<from snapshot>' })).toBeVisible();
  });
});

官方还强调:最终文件里不要写入 snapshot 的 raw ref(它们只在当次浏览器会话有效)。

适用场景与注意事项

适合

  • 需要把一条清晰的前端用户路径沉淀成 Playwright 回归用例
  • 希望定位器尽量走 role / label / placeholder / test id,减少脆弱 CSS
  • 已在 Cursor 里用内置浏览器做验证,想顺手留下可重复执行的测试资产

官方明确不建议 / 需要停下询问的情况

  • 流程依赖人工二次验证(2FA)、验证码(captcha)或邮件链接——应停下,向用户要测试旁路或 mock

其他官方 Tips

  • 鉴权:需要登录时,用环境变量存测试凭据,或使用 Playwright 的 storageState不要把密钥提交进仓库
  • 并行跑测:注意测试数据不要与其他用例冲突
  • 同集合里相关 Skill:adding-e2e-tests(搭 Playwright)、finding-dev-server-url(找本地服务地址)

小结

recording-browser-flow-as-test 把「在 Cursor 浏览器里走查」和「写出可维护的 Playwright 脚本」连成一条固定工作流:快照 → 最小操作 → 记结构化步骤 → 用无障碍信息生成稳定定位 → 跑测加固。它不能替代测试设计本身,但对「流程已经能点通、缺的是可回归脚本」这类场景,能明显缩短从手测到自动化的路径。

官方地址:
https://github.com/spencerpauly/awesome-cursor-skills/tree/main/resources/recording-browser-flow-as-test

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜