Playwright: que es, como funciona, y por que todo el mundo lo esta adoptando


17 de marzo de 2026

En la planificacion de sprint ha salido "investigar Playwright para testing". Si es la primera vez que lo escuchas, este post es para ti.

Que es Playwright

Un framework de testing end-to-end para web, creado por Microsoft. Lo hizo el mismo equipo que creo Puppeteer en Google antes de irse a Microsoft.

La idea: controlas un navegador real desde codigo. Abres paginas, haces clicks, rellenas formularios, verificas que todo funciona. Pero a diferencia de Selenium (que lleva desde 2004), Playwright esta diseñado para que los tests no sean fragiles.

El problema que resuelve

Los tests end-to-end tienen mala fama. Son lentos, se rompen sin razon, y nadie quiere mantenerlos.

Playwright ataca las tres causas principales:

Tests fragiles (flaky tests)

El 80% de los tests fragiles vienen de problemas de timing: el test hace click antes de que el boton este visible, o lee un texto antes de que la API responda.

Playwright tiene auto-wait. Antes de cada accion (click, fill, assert), espera automaticamente a que el elemento este visible, habilitado, estable, y listo para recibir eventos. No escribes sleep(2). No escribes waitForElement. Solo dices "click aqui" y Playwright espera lo justo.

Lentitud

Selenium abre una conexion HTTP nueva por cada comando. Click: HTTP request. Leer texto: HTTP request. Cada uno con su latencia.

Playwright usa un WebSocket persistente. Un solo canal abierto todo el rato. Los comandos viajan instantaneos. Resultado: los tests corren en la mitad de tiempo.

Ademas, ejecucion paralela de serie. Cada archivo de tests corre en su propio worker. Sin plugins, sin configuracion, sin pagar nada.

Solo funciona en Chrome

Cypress solo testea Chrome (Firefox con limitaciones). Puppeteer solo Chrome. Selenium soporta todo pero con un setup doloroso.

Playwright controla Chromium (Chrome, Edge), Firefox y WebKit (Safari) con la misma API. Escribes el test una vez, corre en los tres motores.

Como funciona por dentro

Tres capas:

Tu test (JS/TS, Python, Java, C#)
    | WebSocket persistente
    v
Playwright Server (Node.js)
    | protocolo nativo del navegador
    v
Browser (Chromium / Firefox / WebKit)

La clave es el concepto de Browser Context. Cada test recibe su propio contexto, que es como una ventana de incognito: cookies propias, localStorage propio, sesion propia. Crear un contexto tarda milisegundos. Asi los tests no se contaminan entre si y puedes correr muchos en paralelo sobre el mismo navegador.

Browser (una instancia)
  +-- Context 1 (test A) -- aislado
  |     +-- Page 1
  +-- Context 2 (test B) -- aislado
        +-- Page 1

Un test real

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

test('crear un todo y verlo en la lista', async ({ page }) => {
  // Abre la app
  await page.goto('http://localhost:8080');

  // Escribe en el input
  await page.getByPlaceholder('What needs to be done?').fill('Comprar cafe');

  // Click en Add
  await page.getByRole('button', { name: 'Add' }).click();

  // Verifica que aparece en la lista
  await expect(page.getByText('Comprar cafe')).toBeVisible();
});

No hay sleep. No hay waitFor. Playwright espera solo. Si el boton tarda 50ms en estar listo, espera 50ms. Si tarda 2 segundos, espera 2 segundos. Si no aparece nunca, falla con un mensaje claro.

Instalacion

npm init playwright@latest

Te pregunta idioma (TS/JS), carpeta de tests, y si quieres un workflow de GitHub Actions. Descarga los navegadores (~500MB) y listo.

Para correr:

npx playwright test              # todos, headless, paralelo
npx playwright test --headed     # ves el navegador
npx playwright test --ui         # modo interactivo
npx playwright show-report       # informe HTML

Las features que importan

Codegen: graba tests sin escribir codigo

npx playwright codegen http://localhost:8080

Abre un navegador. Tu navegas y haces clicks. Playwright genera el codigo del test en tiempo real. Copias, pegas, ajustas. Ideal para empezar rapido.

Trace Viewer: debug de CI como si estuvieras ahi

Cuando un test falla en CI, Playwright guarda un "trace": capturas del DOM en cada paso, llamadas de red, logs de consola, y un screencast. Lo abres en el navegador y ves exactamente que paso. No mas "funciona en mi maquina".

Interceptar red

await page.route('**/api/todos', route => {
  route.fulfill({
    body: JSON.stringify([{ id: '1', title: 'Mock', completed: false }]),
  });
});

Puedes mockear APIs, bloquear requests, o modificar respuestas al vuelo. Util para testear errores de red, estados vacios, o datos especificos.

Visual regression

await expect(page).toHaveScreenshot('homepage.png');

La primera vez crea la imagen de referencia. Las siguientes veces compara pixel a pixel. Si algo cambia, el test falla y te muestra el diff.

Tests de API sin navegador

test('API devuelve todos', async ({ request }) => {
  const response = await request.get('/todos');
  expect(response.ok()).toBeTruthy();
  const todos = await response.json();
  expect(todos).toHaveLength(3);
});

Puedes mezclar tests de UI y de API en el mismo proyecto.

Comparativa honesta

Playwright Cypress Selenium
Velocidad La mas rapida La mas lenta Rapida
Navegadores Chromium, Firefox, WebKit Principalmente Chrome Todos
Idiomas JS/TS, Python, Java, C# Solo JS/TS Todos
Auto-wait Si Si No
Paralelo De serie, gratis Requiere pago Requiere Selenium Grid
Movil real No (emulacion) No Si (via Appium)
Curva Media Baja Alta

Cuando NO elegir Playwright

Los numeros de 2026

Playwright + Cohete

Para nosotros, Playwright es la pieza que falta para testear el frontend del skeleton. El plan seria:

test('crear todo via UI', async ({ page }) => {
  await page.goto('http://localhost:8080');
  await page.getByPlaceholder('What needs to be done?').fill('Test e2e');
  await page.getByRole('button', { name: 'Add' }).click();
  await expect(page.getByText('Test e2e')).toBeVisible();
});

test('marcar todo como completado', async ({ page }) => {
  // crear via API para tener datos
  await page.request.post('/todos', {
    data: { title: 'Toggle test' }
  });
  await page.goto('http://localhost:8080');
  // click en el checkbox del todo
  // verificar que tiene tachado
});

Levantamos el server async con php src/bootstrap.php, Playwright se conecta, testea la UI contra la API real. Cero mocks. E2E de verdad.

Para quien investiga esto en su sprint

Si tu equipo esta evaluando Playwright, la respuesta corta es: si. Es lo que el mercado esta adoptando. La curva es razonable si el equipo sabe programar, la documentacion es solida, y la comunidad esta activa.

El consejo: empezad con npx playwright codegen grabando tests de los flujos criticos. Luego refinad a mano. Los traces os van a ahorrar horas de debug en CI.

Documentacion oficial: playwright.dev

Comparte este post:

Es tu post

Estas seguro? Esto no se puede deshacer.

Comentarios (0)

Sin comentarios todavia. Se el primero!

Deja un comentario