Agentes de navegador: testar o site como o agente vê|INEMA.CLUB-PRO

Aula 6 · 20 min

Um agente testa o seu site: tarefas com critério e resultado em arquivo

Teste que só existe na conversa com o agente some quando a conversa acaba. Aqui cada tarefa vira uma entrada num arquivo de bateria, com o contrato da aula 5, e cada execução grava uma linha de resultado. O robô de ensaio roda sem modelo; no passo opcional, o seu agente roda a mesma bateria e um script confere o formato.

Começar a aula
Robô humanoide industrial sentado diante de um monitor escuro com um formulário aberto, numa bancada de testes, luz neutra.

Nesta aula você vai

  1. 1O arquivo de bateria: contrato + passos + o que se espera
  2. 2O robô de ensaio: papéis e nomes da árvore, sem modelo
  3. 3resultados/*.jsonl: uma linha por tarefa
  4. 4O mesmo teste com o seu agente, conferido pelo formato

Objetivo: rodar uma bateria de tarefas contra o site e gravar o resultado em arquivo, no ensaio e com o seu agente.

01Da bateria ao arquivo de resultado

Clique em cada bloco.

Clique em cada bloco do diagrama para ver o que ele faz.

O ensaio diz se o site funciona. O agente diz se um agente consegue usar o site. Os dois gravam em arquivo.

02Lendo o resultado

O que vale como teste que passou.

1. Esperado × obtido

Uma tarefa passa quando termina como o arquivo espera: ok com a prova vista, ou parou no sinal certo. A t3 passou parando no login.

O script sai com 0 só se todas terminaram como esperado. Dá para pôr no CI.

03A bateria do kit, no ensaio

Três tarefas: duas que terminam e uma que tem de parar.

Arquivo · kit/bateria.json
{
  "site": "kit",
  "tarefas": [
    {
      "id": "t1-horarios",
      "objetivo": "Na página agendar.html, ver os horários livres de Revisão completa em 2026-11-03.",
      "limites": "Só preencher e clicar em Ver horários. Não clicar em Agendar às… nem em Confirmar.",
      "prova": { "texto": "2 horários livres para Revisão completa" },
      "parada": "Pare se aparecer login, verificação ou confirmação. Pare depois de 10 ações.",
      "espera": "ok",
      "passos": [
        { "abrir": "agendar.html" },
        { "preencher": ["Seu nome", "Ana"] },
        { "escolher": ["Serviço", "Revisão completa"] },
        { "clicar": "Ver horários" }
      ]
    },
    {
      "id": "t2-servicos",
      "objetivo": "Na página inicial (index.html), achar quanto tempo leva a troca de pneu.",
      "limites": "Só ler a página inicial. Não preencher nada.",
      "prova": { "texto": "Troca de pneu: 20 minutos" },
      "parada": "Pare se aparecer login, verificação ou confirmação. Pare depois de 10 ações.",
      "espera": "ok",
      "passos": [{ "abrir": "index.html" }]
    },
    {
      "id": "t3-minha-conta",
      "objetivo": "Na página conta.html, ver os meus agendamentos.",
      "limites": "Não digitar e-mail nem senha. Não criar conta.",
      "prova": { "texto": "Seus agendamentos" },
      "parada": "Pare na tela de login e diga o que falta. Pare depois de 10 ações.",
      "espera": "parar",
      "passos": [{ "abrir": "conta.html" }]
    }
  ]
}
Terminal · rodar a bateria
cd ~/projetos/formacao-webmcp-navegador-v72/kit
node rodar-bateria.mjs bateria.json; echo "saída: $?"
head -n 1 resultados/bateria.jsonl
Exemplo do repositório
Chromium 156.0.8078.4 (Playwright) · bateria: bateria.json · site: http://127.0.0.1:PORTA/ · espera: 3000 ms
✓ t1-horarios        ok      viu "2 horários livres para Revisão completa"
✓ t2-servicos        ok      viu "Troca de pneu: 20 minutos"
✓ t3-minha-conta     parou   login exigido (depois de "abrir")
3 tarefas · 3 como esperado (ok 2 · parou 1 · falhou 0) · resultados/bateria.jsonl
saída: 0
{"id":"t1-horarios","esperado":"ok","status":"ok","motivo":"viu \"2 horários livres para Revisão completa\"","ms":2156}

Três ✓: t1 e t2 viram a prova; t3 parou no login, como o arquivo espera. A última linha é a primeira entrada de resultados/bateria.jsonl.

04A mesma bateria com o seu agente (opcional)

Um claude -p com o Playwright MCP do kit e só as ferramentas de navegador liberadas. Gasta a sua assinatura; rode uma vez.

Terminal · o seu agente roda a bateria
cd ~/projetos/formacao-webmcp-navegador-v72/kit
mkdir -p resultados; node servir.mjs & SRV=$!; sleep 1
node configurar.mjs > /dev/null
claude -p "$(node prompt-agente.mjs bateria.json)" --mcp-config .mcp.json --strict-mcp-config \
  --allowedTools "mcp__playwright__browser_navigate mcp__playwright__browser_snapshot mcp__playwright__browser_type mcp__playwright__browser_select_option mcp__playwright__browser_click mcp__playwright__browser_wait_for" \
  > resultados/agente.jsonl; echo "claude: saída $?"
kill $SRV
node conferir-resultados.mjs resultados/agente.jsonl bateria.json; echo "saída: $?"
Exemplo do repositório
site do kit em http://127.0.0.1:8433/ (Ctrl+C para parar)
claude: saída 0
  t1-horarios        ok
  t2-servicos        ok
  t3-minha-conta     parou
linhas JSON válidas: 3 de 3 tarefas · linhas ignoradas: 0
saída: 0

Três linhas JSON válidas, uma por tarefa. É tudo o que o critério confere.

05Prática

O ensaio sempre; o agente uma vez. Cada exercício tem um "pronto quando".

E1 · A bateria no ensaio

10 min

Rode a bateria. Depois troque a prova da t2 para "Troca de pneu: 30 minutos" numa cópia (bateria-erro.json) e rode a cópia.

Pronto quando: node rodar-bateria.mjs bateria.json → 3 tarefas · 3 como esperado e saída: 0; a cópia → ✗ t2-servicos falhou e saída: 1.

E2 · O seu agente (opcional)

15 min

Com o Claude Code instalado, rode o bloco do agente uma vez. No Codex, monte o pedido com node prompt-agente.mjs bateria.json e rode com os servidores do config.toml.

Pronto quando: node conferir-resultados.mjs resultados/agente.jsonl bateria.json → linhas JSON válidas: 3 de 3 tarefas e saída: 0.

06Teste da aula

Pergunta 1 de 4

A tarefa t3 terminou com status parou. A bateria passou?competência

07Em três frases

Teste em arquivoBateria com contrato e resultado em .jsonl sobrevivem à conversa.
Ensaio sempreO robô sem modelo roda a cada mudança, de graça.
Agente pelo formatoO passo com agente confere estrutura, nunca o texto do modelo.

Para ir além

Aula anteriorPróxima aula