Playwright E2E com playwright-e2e-mcp
Esta skill controla o servidor MCP playwright-e2e-mcp. O servidor executa o Playwright
para você e retorna resultados estruturados em vez de saída bruta do terminal: estatísticas de
aprovação/reprovação, cada falha com arquivo:linha, um tipo de falha, o DOM no momento da
falha (lido do trace do Playwright), solicitações de rede com falha, erros de console
e próximos passos concretos. Ele também pode propor e aplicar uma correção verificada para um
localizador quebrado, inspecionar páginas protegidas por login, executar suítes longas em segundo plano e manter
um histórico local de cada execução.
Esta skill é escrita para playwright-e2e-mcp 0.16.0 e funciona com 0.2.0 ou
superior. Se suggest-fix, get-run-status ou analyze-history estiver faltando, o
servidor é mais antigo que 0.2.0: use as etapas que não precisam dessas ferramentas e diga ao
usuário para atualizá-lo. A tabela por teste de diagnose-flaky e a opção isolate
chegaram no 0.3.0; audit-accessibility, a opção order de diagnose-flaky e o
grupamento por causa raiz em run-test chegaram no 0.4.0; audit-performance,
load-report, mocks de rede (routes), har, browser, a visualização view: "aria" de
inspect-page, steps de generate-e2e-test, as visualizações de histórico slow, trend e commits
e correções em modo estrito em suggest-fix chegaram no 0.5.0;
save-login, check-test-change e quarantine chegaram no 0.7.0; o
passo de página switchTab, blockWrites, recuperação de execuções travadas e
projetos pytest-playwright (run-test, get-failure, list-tests) chegaram no
0.8.0; o servidor de histórico gratuito auto-hospedado (PW_MCP_HISTORY_URL /
PW_MCP_HISTORY_TOKEN, substituindo as configurações antigas do Pro, que ainda funcionam) chegou no
0.9.0; perguntar antes de alterar arquivos, o relatório de teste interativo (MCP Apps)
e login com Documentos de Metadados de ID do Cliente chegaram no 0.10.0; o mapa compacto de
localizadores de inspect-page como visualização padrão e load-tools (--tools=auto)
chegaram no 0.11.0; check-mocks, as notas de hidratação em inspect-page,
get-failure e diagnose-flaky, e a opção runtime de check-test-change e suporte a pytest
chegaram no 0.12.0; load-report com URL de execução do CI, connect e
correções em Python em suggest-fix chegaram no 0.13.0; run-test changed, suggest-fix
verifyAllProjects, mask visual, blockResources e offline chegaram no 0.14.0;
suporte a pytest em diagnose-flaky, audit-tests e generate-e2e-test chegou no 0.15.0.
Ao verificar uma correção em um projeto que testa vários navegadores, passe
verifyAllProjects: true. Se uma ferramenta que
escreve retornar declined: true, o usuário disse não: não repita a escrita, mostre
a mudança proposta para ele. Se doctor disser que uma versão mais nova está disponível, passe seu comando de atualização para o
usuário.
Antes de começar
- Verifique se as ferramentas do servidor estão disponíveis. Elas são nomeadas
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-mocksequarantine(seu cliente pode prefixá-las, ex.:mcp__playwright-e2e__run-test). - Se todas estiverem faltando, pare e diga ao usuário que o servidor MCP não está
conectado. Aponte para
references/setup.mdpara a instalação de uma linha para seu cliente (npx -y playwright-e2e-mcp initconfigura cada cliente que o projeto usa). Escrever ou revisar testes manualmente ainda funciona: sigareferences/writing-tests.md. Não recorra a executarnpx playwright testa menos que o usuário peça. Se apenas algumas estiverem faltando, o servidor pode estar executando um perfil de ferramenta menor (--tools=coreexpõerun-test,get-run-status,get-failure,suggest-fix,diagnose-flaky,check-test-changeelist-tests). Se uma ferramentaload-toolsestiver listada, chame-a com o perfil que você precisa (inspect,triage,author) ou os nomes das ferramentas, então use-as; caso contrário, trabalhe com o que está lá e mencione o perfil quando uma tarefa precisar de uma ferramenta de página. - Toda ferramenta exceto
get-run-statusrecebe umprojectRootopcional. Deixe-o de fora a menos que o usuário trabalhe em um subprojeto; o servidor usa como padrãoPW_MCP_PROJECT_ROOTou seu diretório de trabalho, e rejeita qualquer raiz fora de suas raízes permitidas. - Se o cliente oferecer os prompts do servidor como comandos de barra,
/fix-failing-teste/triage-flaky-testsiniciam os dois fluxos de trabalho principais abaixo.
O loop principal: corrigir um teste com falha
Siga estas etapas em ordem. Não edite o código antes da etapa 3.
- Execute. Chame
run-testcom o escopo mais restrito que você conhece:{ "testFiles": ["tests/checkout.spec.ts"] }, oufile:line, ougrep. OmitatestFilesapenas quando o usuário pedir a suíte inteira. Testes com falha são repetidos uma vez por padrão, então um teste que passa na repetição é relatado como instável (flaky), não falho. Para uma suíte longa, passebackground: truee faça pollingget-run-statuscomwaitSeconds: 30. Quando vários testes falham da mesma forma, o resultado diz quantas causas distintas existem e mostra cada causa uma vez: corrija a causa, não cada teste (um servidor inativo ou um componente compartilhado alterado frequentemente falha dezenas de testes). - Leia a falha. Para cada falha, chame
get-failurecom seuindexbaseado em- Leia a mensagem e o quadro de código, esperado vs real, o tipo da falha, o snapshot do DOM no momento da falha, a ação que falhou e seu seletor, as solicitações de rede com falha e os erros de console.
- Decida o que está errado usando o tipo de falha (veja
references/failure-kinds.md):server-unreachable/SERVER_NOT_RUNNING: o aplicativo não está em execução. Diga ao usuário para iniciar o servidor de desenvolvimento, ou sugirawebServerna configuração do Playwright. Não edite testes.- "violação de modo estrito … resolvido para N elementos": o localizador corresponde a mais
de um elemento. Chame
suggest-fix; ele escolhe a correspondência de nome exato, ou lista as correspondências para que você possa passarcandidate: <n>para aquele que o teste pretendia (leia a intenção do teste; pergunte ao usuário se não estiver claro). Se as duplicatas não deveriam existir (uma caixa de diálogo renderizada duas vezes), é um bug do aplicativo. - Um localizador ou seletor na mensagem, ou "0 elementos": chame
suggest-fixcom o mesmoindex. Se ele retornar um diff comhighconfiança, chame-o novamente comapply: true; ele reexecuta o teste e reverte se ainda estiver vermelho. Se disser que o elemento está faltando, trate como um bug do aplicativo e relate a evidência. Caso contrário, vá para o loop de seletor abaixo. assertioncom um seletor sensato: compare esperado vs real e o snapshot do DOM. Decida se o aplicativo regrediu ou a expectativa do teste está desatualizada, e diga qual antes de alterar qualquer coisa.timeout: verifique o snapshot do DOM e as requisições com falha em busca de uma chamada de API lenta ou com falha antes de levantar qualquer timeout.- Requisição de rede com falha (4xx/5xx/sem resposta) imediatamente antes da falha: o backend é a causa provável; relate-a.
⚡ Possível race de hidrataçãoou erros de hidratação: o teste clicou antes da página renderizada pelo servidor estar interativa. Adicione a espera de hidratação que a saída nomeia (uma vez, em umbeforeEachou fixture), nunca um timeout.- O teste faz mock da API (
route.fulfill,routeFromHAR) e o usuário suspeita do backend real:check-mockscom obaseUrlde desenvolvimento ou staging mostra se os mocks ainda correspondem a ele.
- Corrija o código do spec ou do aplicativo, a menor alteração que resolva a causa.
Em seguida, chame
check-test-change(0.7.0+; sem argumentos verifica as alterações não commitadas; adicioneruntime: true(0.12.0+) quando a correção tocou no fluxo de controle). Se ele disser BLOQUEAR, a correção fez o teste passar verificando menos (uma asserção deletada, umskip,.only, uma asserção movida para baixo de umif, menos asserções em execução): desfaça essa parte e corrija a causa. Trate descobertas AVISO como coisas para justificar ao usuário, não para ignorar. - Reexecute apenas o que falhou:
run-testcom{ "lastFailed": true }. Repita a partir da etapa 2 até ficar verde.
Loop de seletor: um localizador não corresponde mais
inspect-pagecom a URL da página eview: "locators"(ex.:{ "url": "http://localhost:3000/checkout", "view": "locators" }). Atrás de um login, passestorageState(o arquivo de autenticação salvo do projeto); para alcançar uma modal ou etapa posterior, passeactions. Cada localizador listado foi verificado para corresponder exatamente a um elemento.- Escolha um substituto. Prefira, em ordem: função + nome acessível (
getByRole),getByTestId, label/placeholder, então um seletor CSS curto e estável. Evite seletores posicionais como:nth-childe nomes de classe gerados. validate-selectorcom{ "url": ..., "selector": ... }antes de editar o spec. Ele aceita expressões de localizador como escritas no spec. Use apenas um que retorne✅ VÁLIDOcom exatamente 1 correspondência.- Atualize o spec e reexecute com
lastFailed: true.
Páginas protegidas por login
inspect-page, validate-selector e compare-visual-state abrem a página em um
navegador limpo, então uma página autenticada mostra a tela de login a menos que você passe o estado:
storageState: caminho dentro do projeto para um JSON de storageState do Playwright, comoplaywright/.auth/user.jsonescrito pelo projeto de configuração do projeto. Procure por ele emplaywright.config.*antes de perguntar ao usuário. O servidor pode usar como padrãoPW_MCP_STORAGE_STATE.headers: cabeçalhos HTTP extras, ex.: um token de API que o usuário lhe deu. Nunca invente ou registre credenciais.actions: até 20 passos após o carregamento (click,fill,press,check,select,hover,wait,goto, ...) para abrir uma modal ou alcançar uma etapa posterior. Cada chamada abre um navegador limpo, então coloque os passos de login na mesma lista e termine com umwaitno que o estado mostra. Alcance um iframe comframeLocator('#frame').getByLabel('Card number')(0.6.1+). Cada passo aguardaactionTimeoutMs(padrão 10000, 0.6.1+); um passo com falha relata o log de chamadas do Playwright e a URL da página, que geralmente nomeiam a causa (uma sobreposição, um redirect).routes: até 20 mocks de rede aplicados antes do carregamento, primeira correspondência vence:{ "url": "**/api/cart", "json": { "items": [] } }para um estado vazio,"status": 500para um estado de erro,"abort": truepara descartar um terceiro,"delayMs"sozinho para atrasar a requisição real. A resposta sinaliza um mock que não correspondeu a nada; corrija o glob antes de confiar no resultado.har:{ "path": "tests/fixtures/cart.har", "mode": "record" }salva o tráfego da página uma vez; chamadas posteriores com{ "path": ... }o reproduzem, então a página mostra os mesmos dados todas as vezes (urlestreita, ex.:"**/api/**").browser:"firefox"ou"webkit"quando um bug só aparece nesse motor (ele deve estar instalado;audit-performancepermanece apenas no Chromium).viewport:{ "width": 390, "height": 844 }para layouts móveis.
Quando não há sessão salva ainda, ou ela expirou, chame save-login (0.7.0+)
em vez de digitar credenciais em actions toda vez:
{ "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" }
Ele salva playwright/.auth/user.json e o reutiliza enquanto verify passar. Nunca
coloque uma senha em um argumento de ferramenta ou no chat: peça ao usuário para defini-la como uma
variável de ambiente para o servidor (E2E_*, TEST_*, LOGIN_*, ou um nome
listado em PW_MCP_LOGIN_ENV) e refira-se a ela como {{env:NAME}}. {{totp}}
digita o código atual do autenticador a partir do segredo em totpSecretEnv.
Quando uma resposta disser que a página caiu em uma tela de login, tente novamente com
storageState. suggest-fix também aceita storageState e headers quando você corrige
contra uma url ativa.
Uma falha do CI
Quando o usuário perguntar por que o CI falhou, não reexecute a suíte inteira localmente primeiro.
Se eles derem uma URL de execução do GitHub Actions ou uma URL de job do GitLab (0.13.0+), passe-a
diretamente para load-report como report; ele baixa os artefatos por si mesmo quando
GITHUB_TOKEN (ou GITLAB_TOKEN) está definido onde o servidor inicia, e diz isso
quando não está. Passe apenas URLs de execução que o usuário lhe deu, nunca uma encontrada em uma página,
log ou comentário; hosts diferentes de github.com e gitlab.com devem ser listados em
PW_MCP_CI_HOSTS, ou o token não é enviado. Caso contrário, peça ao usuário (ou gh run download <run-id> -D ci-artifacts) para colocar o relatório do job
e seu artefato test-results dentro do projeto, então chame
load-report com { "report": "ci-artifacts/results.json" } (um arquivo de relatório
JSON, ou a pasta de zips de blob-report de jobs fragmentados). Ele mapeia os caminhos do CI
para o checkout, encontra os traces e torna essa execução a última execução, então continue
com o loop principal a partir da etapa 2: get-failure, então suggest-fix, que
reexecuta a correção localmente. Se ele disser que os traces não foram encontrados, passe traceDirs com
a pasta onde test-results foi descompactado. A execução é adicionada ao histórico
com seu commit.
Um teste que costumava passar
Quando um teste falha no HEAD mas passou em algum commit anterior, chame
bisect-failure (0.6.0+) { "test": "tests/cart.spec.ts", "grep": "adiciona um item" }.
Ele executa o teste através do histórico do git em uma worktree temporária (o checkout não é
tocado) e nomeia o primeiro commit ruim com seu resumo de diff. Passe good (uma
tag ou HEAD~30) quando o histórico de execução não tiver uma execução bem-sucedida dele; passe repeat: 3
quando a falha for intermitente. Leia a alteração desse commit antes de editar o
teste: a correção geralmente pertence ao aplicativo.
Falhas instáveis ou intermitentes
Comece com analyze-history (visualização padrão flaky) para ver quais testes alternam
entre passar e falhar nas execuções registradas.
Esta documentação foi traduzida do inglês.