Por que seus testes automatizados falham? 7 erros comuns no Playwright (e como corrigir)

Se seus testes com Playwright estão falhando de forma intermitente, lentos ou difíceis de manter… você não está sozinho. A maioria dos QAs que começam na automação comete alguns erros que parecem pequenos, mas que impactam diretamente a confiabilidade dos testes. Neste artigo, você vai ver os erros mais comuns — e como corrigir de forma prática.

1. Usar seletores frágeis (CSS genérico ou dinâmico)

❌ Problema:

await page.click('button.btn-primary')
Isso quebra facilmente quando o layout muda.

✅ Solução:

Priorize:
  • getByRole
  • getByTestId
  • getByLabel

await page.getByRole('button', { name: 'Finalizar compra' }).click()
💡 Dica: combine com estratégia de test ids no projeto.

2. Não esperar corretamente os elementos

❌ Problema:

await page.click('#submit')
await expect(page.locator('.success')).toBeVisible()
Pode gerar flakiness.

✅ Solução:

Use esperas automáticas do Playwright:

await expect(page.locator('.success')).toBeVisible()
ou

await page.waitForSelector('.success')

3. Testes dependentes entre si

❌ Problema:

test('criar usuário', async ({ page }) => {
  await page.goto('/cadastro')
  await page.fill('#email', 'teste@email.com')
  await page.fill('#senha', '123456')
  await page.click('#cadastrar')
})

test('login com usuário criado', async ({ page }) => {
  await page.goto('/login')
  await page.fill('#email', 'teste@email.com')
  await page.fill('#senha', '123456')
  await page.click('#entrar')

  await expect(page.locator('.dashboard')).toBeVisible()
})
  • Um teste depende do outro
  • Quebra tudo quando roda isolado

✅ Solução:


test.beforeEach(async ({ page }) => {
  await page.goto('/cadastro')
  await page.fill('#email', `teste${Date.now()}@email.com`)
  await page.fill('#senha', '123456')
  await page.click('#cadastrar')
})

test('login com usuário válido', async ({ page }) => {
  await page.goto('/login')
  await page.fill('#email', 'usuario_valido@email.com')
  await page.fill('#senha', '123456')
  await page.click('#entrar')

  await expect(page.locator('.dashboard')).toBeVisible()
})
  • Testes independentes
  • Use beforeEach para setup

4. Não isolar dados de teste

❌ Exemplo ERRADO (dados fixos)

test('criar usuário', async ({ page }) => {
  await page.goto('/cadastro')

  await page.fill('#email', 'teste@email.com')
  await page.fill('#senha', '123456')

  await page.click('#cadastrar')

  await expect(page.locator('.sucesso')).toBeVisible()
})
❌ Problema:
  • Se o usuário já existir → teste falha
  • Pode funcionar localmente e quebrar no CI
  • Dificulta execução em paralelo
✅ Solução:

import { faker } from '@faker-js/faker'

test('criar usuário', async ({ page }) => {
  const email = faker.internet.email()

  await page.goto('/cadastro')

  await page.fill('#email', email)
  await page.fill('#senha', '123456')

  await page.click('#cadastrar')

  await expect(page.locator('.sucesso')).toBeVisible()
})
  • Gerar dados dinâmicos
  • Usar fixtures

💡 Dica estratégica (aqui você ganha autoridade)

👉 “Em projetos reais, usamos bibliotecas como Faker para simular dados reais e evitar conflitos.”

5. Ignorar retries e paralelismo

❌ Problema: Falhas ocasionais quebram pipeline

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

test('deve exibir mensagem de sucesso', async ({ page }) => {
  await page.goto('/checkout')
  await page.click('#finalizar')

  await expect(page.locator('.sucesso')).toBeVisible()
})

✅ Solução:


// playwright.config.js
export default {
  retries: 2
}

6. Não usar boas práticas de organização

❌ Exemplo ERRADO (código desorganizado)

Tudo dentro de um único arquivo:


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

test('fluxo completo', async ({ page }) => {
  await page.goto('/login')
  await page.fill('#email', 'teste@email.com')
  await page.fill('#senha', '123456')
  await page.click('#entrar')

  await page.goto('/produtos')
  await page.click('.produto-1')
  await page.click('#comprar')

  await expect(page.locator('.sucesso')).toBeVisible()
})
🚨 Problemas:
  • Difícil de manter
  • Repetição de código
  • Baixa reutilização
  • Testes ficam confusos conforme crescem
❌ Outro erro comum (duplicação)

test('login válido', async ({ page }) => {
  await page.goto('/login')
  await page.fill('#email', 'teste@email.com')
  await page.fill('#senha', '123456')
  await page.click('#entrar')
})

test('comprar produto', async ({ page }) => {
  await page.goto('/login')
  await page.fill('#email', 'teste@email.com')
  await page.fill('#senha', '123456')
  await page.click('#entrar')

  await page.goto('/produtos')
})

👉 Login duplicado = manutenção ruim

✅ Exemplo CORRETO (usando actions) Você já usa actions — então aqui você mostra seu diferencial 👇

📁 Estrutura

tests/
actions/ loginActions.js
produtoActions.js

7. Não analisar falhas corretamente

❌ Problema:

Um dos maiores erros em automação é tratar sintomas em vez da causa. Quando um teste falha, o objetivo não é “fazer passar” — é entender o motivo. Ferramentas como o Trace Viewer ajudam a investigar o problema com precisão.

✅ Solução:

Use trace viewer

npx playwright show-trace trace.zip

🚀 Conclusão

A maioria dos problemas em automação não está na ferramenta — está na forma como os testes são escritos.

Corrigindo esses pontos, você já melhora:

  • estabilidade
  • velocidade
  • confiança nos testes

Comentários

Postagens mais visitadas deste blog