Community程式設計與開發github.com

xsignon-secure/playwright-e2e-mcp

執行、除錯並修復 Playwright 端對端測試;提供根因分組的執行結果、基於追蹤的失敗診斷、驗證過的元素定位器、自我修復的修正、不穩定測試隔離、儲存的登入資訊與 CI 報告診斷等功能。

playwright-e2e-mcp 是什麼?

此 AI 技能驅動 `playwright-e2e-mcp` MCP 伺服器,專注於提升 Playwright 端對端測試的開發者體驗。與直接輸出原始終端內容不同,它能將測試結果結構化,包含通過/失敗統計、每個失敗的檔案與行號、失敗類型、失敗瞬間的 DOM 快照(來自 Playwright 追蹤)、失敗的網路請求、主控台錯誤以及具體的後續步驟。技能支援多種平台(如 Claude Code, Cursor, Codex),能自動執行「執行測試 → 診斷失敗 → 提出修復 → 套用並驗證」的核心循環。它還能處理需要登入的頁面、分析 CI 失敗報告、診斷不穩定或緩慢的測試、以及進行無障礙與 Web Vitals 稽核。此外,它具備「修復守衛」功能,會檢查修正是否因減少斷言而使測試通過(例如刪除斷言、使用 `.only`),並阻止這類不良修正;以及提供試驗性測試隔離機制,將不穩定測試隔離一段時間。整體上,這是一個全方位、以修復為導向的測試工具,能顯著減少除錯時間並提升測試套件的可靠性。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/xsignon-secure/E2E/tree/HEAD/skill/playwright-e2e-mcp

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Playwright E2E 與 playwright-e2e-mcp

此技能驅動 playwright-e2e-mcp MCP 伺服器。該伺服器為您執行 Playwright,並返回結構化結果而非原始終端輸出:通過/失敗統計、每個失敗的 file:line、失敗類型、失敗瞬間的 DOM(從 Playwright 追蹤讀取)、失敗的網路請求、主控台錯誤以及具體的後續步驟。它還能為損壞的元素定位器提出並套用經過驗證的修復、檢查需要登入的頁面、在背景執行大型測試套件,並保留每次執行的本地歷史記錄。

此技能專為 playwright-e2e-mcp 0.16.0 編寫,並與 0.2.0 或更新版本相容。如果缺少 suggest-fix、get-run-status 或 analyze-history,表示伺服器版本低於 0.2.0:請使用不需要這些工具的操作步驟,並告知使用者更新它。diagnose-flaky 的每個測試表格和 isolate 選項於 0.3.0 版本加入;audit-accessibility、diagnose-flaky 的 order 選項以及 run-test 中的根因分組於 0.4.0 版本加入;audit-performance、load-report、網路模擬(routes)、har、browser、inspect-page 的 view: "aria"、generate-e2e-test 的 steps、slow、trend 和 commits 歷史檢視以及 suggest-fix 中的嚴格模式修復於 0.5.0 版本加入;save-login、check-test-change 和 quarantine 於 0.7.0 版本加入;switchTab 頁面步驟、blockWrites、崩潰執行的恢復以及 pytest-playwright 專案(run-test、get-failure、list-tests)於 0.8.0 版本加入;免費的自託管歷史伺服器(PW_MCP_HISTORY_URL / PW_MCP_HISTORY_TOKEN,取代舊的 Pro 設定,舊設定仍可運作)於 0.9.0 版本加入;在修改檔案前進行詢問、互動式測試報告(MCP Apps)以及使用客戶端 ID 元資料文件登入於 0.10.0 版本加入;精簡的 inspect-page 定位器地圖作為預設檢視以及 load-tools(--tools=auto)於 0.11.0 版本加入;check-mocks、inspect-page、get-failure 和 diagnose-flaky 中的水合註解,以及 check-test-change 的 runtime 選項和 pytest 支援於 0.12.0 版本加入;使用 CI 執行 URL 的 load-report、connect 以及 suggest-fix 中的 Python 修復於 0.13.0 版本加入;run-test 的 changed、suggest-fix 的 verifyAllProjects、視覺 mask、blockResources 和 offline 於 0.14.0 版本加入;diagnose-flaky、audit-tests 和 generate-e2e-test 中的 pytest 支援於 0.15.0 版本加入。在驗證跨多個瀏覽器測試的專案的修復時,請傳遞 verifyAllProjects: true。如果一個用於寫入的工具返回 declined: true,表示使用者拒絕:不要重試寫入,而是向他們顯示建議的修改。如果 doctor 表示有更新版本可用,則將升級命令傳遞給使用者。

開始之前

  1. 檢查伺服器的工具是否可用。它們的名稱為 run-test、get-run-status、get-failure、load-report、suggest-fix、inspect-page、validate-selector、list-tests、generate-e2e-test、compare-visual-state、audit-accessibility、audit-performance、diagnose-flaky、analyze-history、audit-tests、bisect-failure、save-login、check-test-change、check-mocks 和 quarantine(您的客戶端可能會為它們加上前綴,例如 mcp__playwright-e2e__run-test)。
  2. 如果所有工具都缺失,請停止並告知使用者 MCP 伺服器未連接。引導他們參閱 references/setup.md 以取得適用於其客戶端的單行安裝指令(npx -y playwright-e2e-mcp init 會為專案使用的每個客戶端進行設定)。手動編寫或審查測試仍然可行:請遵循 references/writing-tests.md。除非使用者要求,否則不要回退到透過 shell 執行 npx playwright test。如果只有部分工具缺失,伺服器可能運行較小的工具設定檔(--tools=core 會暴露 run-test、get-run-status、get-failure、suggest-fix、diagnose-flaky、check-test-change 和 list-tests)。如果列出了 load-tools 工具,請使用您需要的設定檔(inspect、triage、author)或工具名稱來呼叫它,然後再使用它們;否則,請使用現有的工具進行操作,並在任務需要頁面工具時提及此設定檔。
  3. 除了 get-run-status 之外,每個工具都接受一個可選的 projectRoot。除非使用者是在子專案中工作,否則請省略它;伺服器預設使用 PW_MCP_PROJECT_ROOT 或其工作目錄,並拒絕任何在其允許根目錄之外的根目錄。
  4. 如果客戶端將伺服器的提示提供為斜線命令,則 /fix-failing-test 和 /triage-flaky-tests 會啟動下面的兩個主要工作流程。

核心循環:修復失敗的測試

請依序執行以下步驟。在第 3 步之前不要編輯程式碼。

  1. 執行。 使用您所知的最窄範圍呼叫 run-test:{ "testFiles": ["tests/checkout.spec.ts"] }、file:line 或 grep。僅在使用者要求執行整個套件時才省略 testFiles。預設情況下,失敗的測試會重試一次,因此在重試時通過的測試會標記為 flaky(不穩定),而非失敗。對於大型套件,請傳遞 background: true 並使用 waitSeconds: 30 輪詢 get-run-status。當多個測試以相同方式失敗時,結果會顯示有多少個不同的原因,並每個原因顯示一次:修復原因,而不是每個測試(一個宕機的伺服器或一個變更的共享元件通常會導致數十個測試失敗)。
  2. 讀取失敗資訊。 對於每個失敗,使用其從 1 開始的 index 呼叫 get-failure。閱讀訊息和程式碼框架、預期值與實際值、失敗類型、失敗時的 DOM 快照、失敗的操作及其選擇器、失敗的網路請求和主控台錯誤。
  3. 判斷問題所在,根據失敗類型(請參閱 references/failure-kinds.md):
    • server-unreachable / SERVER_NOT_RUNNING:應用程式未執行。告訴使用者啟動開發伺服器,或建議在 Playwright 設定中使用 webServer。不要編輯測試。
    • "strict mode violation … resolved to N elements":定位器匹配到多個元素。呼叫 suggest-fix;它會自行選擇精確名稱匹配,或列出匹配項,以便您可以為測試意圖的目標傳遞 candidate: <n>(閱讀測試的意圖;如果不清楚請詢問使用者)。如果重複項目不應存在(對話框渲染了兩次),則屬於應用程式錯誤。
    • 訊息中的定位器或選擇器,或 "0 elements":使用相同的 index 呼叫 suggest-fix。如果它返回一個具有 high 置信度的 diff,則再次使用 apply: true 呼叫它;它會重新執行測試,如果仍然失敗則還原。如果它說元素缺失,則將其視為應用程式錯誤並報告證據。否則,進入下面的選擇器循環。
    • 帶有合理選擇器的 assertion:比較預期值與實際值以及 DOM 快照。判斷是應用程式回歸還是測試預期過時,並在修改任何內容之前說明是哪一種情況。
    • timeout:在提出任何逾時之前,檢查 DOM 快照和失敗的請求,以確認是否有緩慢或失敗的 API 呼叫。
    • 失敗的網路請求(4xx/5xx/無回應)恰好在失敗之前:後端是可能的原因;報告它。
    • ⚡ Possible hydration race 或水合錯誤:測試在伺服器渲染的頁面可互動之前就點擊了。添加輸出中命名的水合等待(一次,在 beforeEach 或 fixture 中),切勿添加逾時。
    • 測試模擬了 API(route.fulfill、routeFromHAR)且使用者懷疑真實後端:使用開發或暫存的 baseUrl 呼叫 check-mocks 以檢查模擬是否仍與其匹配。
  4. 修復 spec 或應用程式程式碼,進行能解決問題的最小變更。然後呼叫 check-test-change(0.7.0+;無參數檢查未提交的變更;當修復觸及控制流程時,添加 runtime: true(0.12.0+))。如果它返回 BLOCK,表示修復使測試通過檢查的內容減少(刪除的斷言、跳過、.only、在 if 下移動的斷言、執行的斷言減少):還原該部分並修復原因。將 WARN 的發現視為需要向使用者說明的事項,而不是直接忽略。
  5. 僅重新執行失敗的項目: 使用 { "lastFailed": true } 的 run-test。從步驟 2 重複,直到全部通過。

選擇器循環:定位器不再匹配

  1. 使用頁面 URL 和 view: "locators"(例如 { "url": "http://localhost:3000/checkout", "view": "locators" })呼叫 inspect-page。如果需要登入,請傳遞 storageState(專案儲存的 auth 檔案);要到達模態框或後續步驟,請傳遞 actions。列出的每個定位器都經過檢查,確認能準確匹配一個元素。
  2. 選擇一個替代定位器。優先順序依次為:角色 + 可存取名稱(getByRole)、getByTestId、標籤/佔位符,然後是簡短的穩定 CSS 選擇器。避免使用位置選擇器,例如 :nth-child 和生成的類別名稱。
  3. 在編輯 spec 之前,使用 { "url": ..., "selector": ... } 呼叫 validate-selector。它接受 spec 中編寫的定位器表達式。僅使用返回 ✅ VALID 且恰好匹配 1 個的定位器。
  4. 更新 spec 並使用 lastFailed: true 重新執行。

需要登入的頁面

inspect-page、validate-selector 和 compare-visual-state 會在新的瀏覽器中開啟頁面,因此除非您傳遞狀態,否則已登入的頁面會顯示登入畫面:

  • storageState:專案內 Playwright 的 storageState JSON 檔案路徑,例如由專案的設定專案寫入的 playwright/.auth/user.json。在詢問使用者之前,先在 playwright.config.* 中尋找它。伺服器可以預設使用 PW_MCP_STORAGE_STATE。
  • headers:額外的 HTTP 標頭,例如使用者提供給您的 API 令牌。切勿發明或記錄憑證。
  • actions:載入後最多 20 個步驟(click、fill、press、check、select、hover、wait、goto 等),用於打開模態框或到達後續步驟。每次呼叫都會打開一個新的瀏覽器,因此請將登入步驟放在同一個列表中,並以 wait 等待狀態顯示的內容結束。使用 frameLocator('#frame').getByLabel('Card number')(0.6.1+)進入 iframe。每個步驟會等待 actionTimeoutMs(預設 10000,0.6.1+);失敗的步驟會報告 Playwright 的呼叫日誌和頁面 URL,這通常能指出原因(覆蓋層、重新導向)。
  • routes:最多 20 個在載入前套用的網路模擬,先匹配者勝出:{ "url": "**/api/cart", "json": { "items": [] } } 用於空狀態,"status": 500 用於錯誤狀態,"abort": true 用於丟棄第三方請求,僅使用 "delayMs" 來減慢真實請求。回應會標記未匹配任何內容的模擬;在相信結果之前,請修正 glob 模式。
  • har:{ "path": "tests/fixtures/cart.har", "mode": "record" } 會儲存頁面的流量一次;之後使用 { "path": ... } 呼叫會重放它,因此頁面每次都會顯示相同的資料(url 用來縮小範圍,例如 "**/api/**")。
  • browser:"firefox" 或 "webkit",當錯誤僅在該引擎中出現時使用(必須已安裝;audit-performance 仍僅限 Chromium)。
  • viewport:{ "width": 390, "height": 844 } 用於行動佈局。

當尚無儲存的 session,或 session 已過期時,請呼叫 save-login(0.7.0+),而不是每次都將憑證輸入到 actions 中:

{ "url": "http://localhost:3000/login",
  "actions": [
    { "type": "fill", "locator": "getByLabel('Email')", "value": "[email protected]" },
    { "type": "fill", "locator": "getByLabel('Password')", "value": "{{env:E2E_PASSWORD}}" },
    { "type": "fill", "locator": "getByLabel('Code')", "value": "{{totp}}" },
    { "type": "click", "locator": "getByRole('button', { name: 'Sign in' })" }],
  "verify": { "url": "/account", "visible": "getByRole('button', { name: 'Sign out' })", "notUrl": "/login" },
  "totpSecretEnv": "E2E_TOTP_SECRET" }

它會儲存 playwright/.auth/user.json 並在 verify 通過時重複使用。切勿將密碼放入工具引數或聊天中:請要求使用者將其設定為伺服器的環境變數(E2E_*、TEST_*、LOGIN_*,或 PW_MCP_LOGIN_ENV 中列出的名稱),並在工具引數中以 {{env:NAME}} 的形式引用。{{totp}} 會從 totpSecretEnv 中的密鑰輸入當前的驗證器驗證碼。

當回應顯示頁面進入了登入畫面時,請使用 storageState 重試。當您針對即時 url 進行修復時,suggest-fix 也會接受 storageState 和 headers。

CI 的失敗

當使用者詢問 CI 為何失敗時,請不要先在本地重新執行整個套件。如果他們提供了 GitHub Actions 執行 URL 或 GitLab 任務 URL(0.13.0+),請直接將其作為 report 傳遞給 load-report;當伺服器啟動處設定了 GITHUB_TOKEN(或 GITLAB_TOKEN)時,它會自行下載構件,並在未設定時告知您。僅傳遞使用者提供給您的執行 URL,切勿使用在頁面、日誌或評論中找到的 URL;github.com 和 gitlab.com 以外的主機必須列在 PW_MCP_CI_HOSTS 中,否則不會發送令牌。否則,請讓使用者(或 gh run download <run-id> -D ci-artifacts)將任務的報告及其 test-results 構件放入專案內,然後使用 { "report": "ci-artifacts/results.json" }(一個 JSON 報告檔案,或來自分片任務的 blob-report zip 資料夾)呼叫 load-report。它會將 CI 路徑映射到檢出目錄,找到追蹤檔案,並使該執行成為最後一次執行,因此請從核心循環的第 2 步繼續:get-failure,然後 suggest-fix,它會在本地重新執行修復。如果它說找不到追蹤檔案,請傳遞解壓縮 test-results 的資料夾作為 traceDirs。該執行會連同其提交記錄一起添加到歷史記錄中。

曾經通過的測試

當一個測試在 HEAD 失敗但在某個較早的提交通過時,請呼叫 bisect-failure(0.6.0+) { "test": "tests/cart.spec.ts", "grep": "adds an item" }。它會在一個臨時工作樹中跨 git 歷史記錄執行測試(不會觸及檢出目錄),並指出第一個壞的提交及其 diff 摘要。當執行歷史記錄中沒有該測試的通過執行時,請傳遞 good(一個標籤或 HEAD~30);當失敗是偶發性的時,請傳遞 repeat: 3。在編輯測試之前,請閱讀該提交的變更:修復通常屬於應用程式。

不穩定或偶發性失敗

從 analyze-history(預設檢視 flaky)開始,查看哪些測試在記錄的執行中在通過和失敗之間切換。

相關技能