用 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

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

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

小夜