page.getByText('Success').isVisible() retorna um booleano verificando o DOM exatamente uma vez: se o elemento ainda não renderizou, você recebe false mesmo que ele apareça 200ms depois. expect(page.getByText('Success')).toBeVisible() tenta novamente por até 5 segundos antes de falhar. Esse comportamento de retry é o núcleo do design de assertions do Playwright, e a maioria dos erros de iniciantes vem de não saber quais métodos o têm.

Como as assertions do Playwright funcionam

As assertions do Playwright usam a função expect() do @playwright/test. Não são as mesmas do expect do Jest. A versão do Playwright é assíncrona e tem lógica de retry nativa.

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

A diferença principal em relação à maioria dos frameworks de teste: as assertions do Playwright fazem retry automaticamente. Quando você escreve:

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

O Playwright não verifica só uma vez. Verifica repetidamente por até 5 segundos (o expect timeout padrão), aguardando a condição se tornar verdadeira. Isso elimina a necessidade de chamadas manuais de waitFor em 90% dos casos.

Se a condição nunca se tornar verdadeira dentro do timeout, o teste falha com uma mensagem clara mostrando o que era esperado e o que realmente existia.

Assertions de elemento (baseadas em locator)

Essas verificam propriedades de um elemento específico na página.

toBeVisible / toBeHidden

// Elemento está renderizado e visível para o usuário
await expect(page.getByText('Dashboard')).toBeVisible();

// Elemento não está presente, ou está presente mas oculto (display:none, visibility:hidden, opacity:0)
await expect(page.getByRole('dialog')).toBeHidden();

toBeHidden() é verdadeiro se o elemento não existe OU se existe mas está invisível. Use not.toBeAttached() se precisar confirmar especificamente que o elemento não está no DOM.

toHaveText / toContainText

// Correspondência exata de texto (remove espaços em branco automaticamente)
await expect(page.getByRole('heading', { level: 1 })).toHaveText('My Travel Items');

// Correspondência parcial de texto
await expect(page.getByRole('heading')).toContainText('Travel');

// Array: verificar texto de múltiplos elementos
await expect(page.getByRole('listitem')).toHaveText(['Tokyo', 'Paris', 'London']);

// Regex: correspondência por padrão
await expect(page.getByTestId('price')).toHaveText(/\$\d+\.\d{2}/);

toHaveText com array verifica o texto completo de cada elemento na ordem. Muito útil para confirmar linhas de tabela ou listas ordenadas.

toHaveValue

Para elementos ,