Skip to content
article

5 cosas que hacen tus tests de Playwright flaky (y cómo arreglarlas sin poner sleep)

Lo que aprendí con 900 tests nocturnos y un martes maldito

Luis Treviño@luis_qa_mty

October 12, 2026 · 3 min read

Qué onda raza. Después del post del martes maldito (el test que solo fallaba los martes, búsquenlo) varios me preguntaron por DM cómo le hacemos para mantener 900 tests e2e sin volvernos locos. Aquí va lo que neta nos funcionó. Nada de magia, pura chamba.

1. Deja de usar waitForTimeout

Si tienes await page.waitForTimeout(3000), ya perdiste. En tu máquina 3 segundos sobran, en CI con 2 CPUs no alcanzan. Usa las aserciones que reintentan solas:

// mal
await page.click('#guardar')
await page.waitForTimeout(3000)
expect(await page.textContent('.toast')).toBe('Guardado')

// bien
await page.getByRole('button', { name: 'Guardar' }).click()
await expect(page.getByText('Guardado')).toBeVisible()

await expect(locator).toBeVisible() reintenta hasta el timeout. expect(await ...) no reintenta nada: evalúa una vez y ya.

2. Locators por rol, no por clase CSS

La clase .btn-primary-v2-final la cambia el de frontend el viernes sin avisar. El rol y el texto que ve el usuario cambian mucho menos. getByRole, getByLabel, getByText, y getByTestId cuando no hay de otra.

3. Cada test crea sus propios datos

Nada de cuentas compartidas (ya saben por qué 🤣). Usamos fixtures que crean el usuario por API y lo borran al final:

import { test as base } from '@playwright/test'

export const test = base.extend({
  usuario: async ({ request }, use, testInfo) => {
    const email = 'qa-' + testInfo.workerIndex + '-' + Date.now() + '@example.test'
    const res = await request.post('/api/test/users', { data: { email } })
    const usuario = await res.json()
    await use(usuario)
    await request.delete('/api/test/users/' + usuario.id)
  },
})

4. Controla el tiempo y la zona horaria

En playwright.config.ts fija timezoneId y locale. Y si el test depende de la fecha, congélala con page.clock.setFixedTime(). El reloj real es el enemigo.

5. Retries solo en CI, y que duelan

// playwright.config.ts
retries: process.env.CI ? 2 : 0,
use: {
  trace: 'on-first-retry',
},

Y aquí lo importante: un test que pasó en el segundo intento no pasó. Playwright ya te lo marca como flaky en el reporte, y alguien lo tiene que revisar esa misma semana. Si no, los retries nada más esconden la basura debajo del tapete.

Bonus: la cuarentena con dueño

Si un test entra a cuarentena, lleva nombre del responsable y fecha de vencimiento. Si pasan dos semanas, se discute en la daily. Desde que hicimos eso bajamos de 31 tests en cuarentena a 4.

Y ya. Si tienen dudas pregunten aquí, ahorita les contesto (y esta vez sí es ahorita, no el ahorita mexicano 🤣).

Written by

Luis Treviño

QA Automation en Monterrey 🇲🇽 Cypress, Playwright y romper cosas por chamba. Si no lo probaste, no funciona, wey.

Get the best of #flaky_test_society weekly

One email each Monday with the most useful posts. No spam; unsubscribe in one click.

Comments

10

Sign in to join the conversation.

Sign in to comment
Sofía Ramírez@sofi_dev_mx#7 in Flaky Test Society
Guardadísimo 💜 el punto 1 lo voy a imprimir para mi equipo, tenemos waitForTimeout por todos lados jaja
0 net votes
Iván Ochoa@ivan_tj#10 in Flaky Test Society
carnal esto es exactamente lo que me enseñaste cuando armamos mi suite, ahora sí entiendo por qué me regañabas por el sleep 😂
1 net votes
Luis Treviño@luis_qa_mty#1 in Flaky Test Society
te regañaba con amor, wey 🤣
0 net votes
Camilo Restrepo@camilo_parce#7 in Flaky Test Society
Muy bueno parce. Una duda: ¿los fixtures que crean usuarios por API no hacen más lenta la suite? Tenemos como 600 tests
0 net votes
Luis Treviño@luis_qa_mty#1 in Flaky Test Society
un poquito, como 1 o 2 segundos por test, pero corren en paralelo. y te ahorras horas de debuggear datos sucios. vale la pena, neta
1 net votes
Andrea Villalobos@andreavillalobos#10 in Flaky Test Society
No soy QA pero se lo voy a mandar al equipo de mi trabajo, siempre se quejan de los tests que fallan 😅
0 net votes
Rosa Quispe@rosa_aprende#10 in Flaky Test Society
Estoy aprendiendo testing y esto me ayudó mucho, gracias Luis. ¿Recomiendas empezar con Playwright o con Cypress?
1 net votes
Luis Treviño@luis_qa_mty#1 in Flaky Test Society
Playwright, sin duda. Es gratis completo, corre en varios navegadores y la documentación está muy bien. Cypress también es bueno, pero hoy empezaría con Playwright. Ánimo Rosa 💪
0 net votes
Trần Phương Thảo@thao_qa#4 in Flaky Test Society
I read with Google Translate and still very useful 🐞 number 5, "a test that pass on second try did not pass", I very agree
0 net votes
Iryna Melnyk@iryna_qa#3 in Flaky Test Society
Very good list, I understood with translator) the fixture example is clean. And +1 for quarantine with owner
1 net votes