page.getByText('Success').isVisible() devuelve un booleano verificando el DOM exactamente una vez: si el elemento todavía no se renderizó, obtienes false aunque aparezca 200ms después. expect(page.getByText('Success')).toBeVisible() reintenta durante hasta 5 segundos antes de fallar. Ese comportamiento de reintento es el núcleo del diseño de aserciones de Playwright, y la mayoría de los errores de principiantes vienen de no saber qué métodos lo tienen. Esta guía cubre cada tipo de aserción, la negación con not, las soft assertions para recolectar todos los fallos, y los patrones que deshabilitan el auto-reintento en silencio.

Cómo funcionan las aserciones de Playwright

Las aserciones de Playwright usan la función expect() de @playwright/test. No son las mismas que el expect de Jest. La versión de Playwright es async y tiene lógica de reintento integrada.

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

La diferencia clave respecto a la mayoría de los frameworks de testing: las aserciones de Playwright reintentan automáticamente. Cuando escribes:

await expect(page.getByText('Bienvenido')).toBeVisible();

Playwright no solo verifica una vez. Verifica repetidamente durante hasta 5 segundos (el expect timeout por defecto), esperando a que la condición sea verdadera. Eso elimina la necesidad de llamadas manuales a waitFor en el 90% de los casos.

Si la condición nunca se vuelve verdadera dentro del timeout, el test falla con un mensaje claro que muestra qué se esperaba y qué existía realmente.

Aserciones de elementos (basadas en locators)

Estas verifican propiedades de un elemento específico en la página.

toBeVisible / toBeHidden

// El elemento está renderizado y es visible para el usuario
await expect(page.getByText('Dashboard')).toBeVisible();

// El elemento no está presente, o está presente pero oculto (display:none, visibility:hidden, opacity:0)
await expect(page.getByRole('dialog')).toBeHidden();

toBeHidden() es verdadero si el elemento no existe O si existe pero es invisible. Usa not.toBeAttached() si específicamente necesitas confirmar que el elemento no está en el DOM.

toHaveText / toContainText

// Coincidencia exacta de texto (recorta espacios automáticamente)
await expect(page.getByRole('heading', { level: 1 })).toHaveText('Mis Ítems de Viaje');

// Coincidencia parcial de texto
await expect(page.getByRole('heading')).toContainText('Viaje');

// Array: verificar texto de múltiples elementos
await expect(page.getByRole('listitem')).toHaveText(['Tokio', 'París', 'Londres']);

// Regex: coincidencia de patrón
await expect(page.getByTestId('price')).toHaveText(/\$\d+\.\d{2}/);

toHaveText con un array verifica el texto completo de cada elemento en orden. Muy útil para verificar filas de tablas o listas ordenadas.

toHaveValue

Para elementos ,