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.
actions/ loginActions.js
produtoActions.js
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
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
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
Postar um comentário