Assertions и ожидания

В Playwright Assertions и ожидания играют ключевую роль при тестировании веб-приложений. Они позволяют проверять корректность состояния элементов на странице, наличие определённого текста, атрибутов, видимости компонентов и других аспектов поведения интерфейса. Основной механизм работы строится вокруг асинхронных ожиданий (expect), которые интегрированы с возможностями Playwright по автоматическому ожиданию элементов.


Основы expect

expect — это встроенная функция Playwright, предоставляющая мощные средства для проверки состояния элементов. Она поддерживает как синхронные проверки, так и асинхронные ожидания с таймаутом.

Пример базовой проверки текста элемента:

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

test('Проверка текста кнопки', async ({ page }) => {
  await page.goto('https://example.com');
  const button = page.locator('button#submit');
  await expect(button).toHaveText('Отправить');
});

В этом примере Playwright автоматически ожидает появления элемента и текста в течение стандартного таймаута (по умолчанию 5 секунд).


Проверка видимости и состояния элементов

Playwright позволяет проверять, видим ли элемент, активен ли он, содержит ли определённые атрибуты или классы.

Варианты проверок:

await expect(element).toBeVisible();      // Элемент видим
await expect(element).toBeHidden();       // Элемент скрыт
await expect(element).toBeEnabled();      // Элемент активен (не disabled)
await expect(element).toBeDisabled();     // Элемент заблокирован
await expect(element).toHaveAttribute('href', '/home'); // Атрибут href равен /home
await expect(element).toHaveClass(/active/);           // Класс содержит 'active'

Все эти методы автоматически повторяют проверку до достижения таймаута, что уменьшает необходимость ручного написания циклов ожидания.


Работа с текстом и значениями

Проверка текста, значений инпутов и других свойств является одной из наиболее частых задач. toHaveText и toHaveValue позволяют задавать точное совпадение или регулярное выражение.

await expect(input).toHaveValue('admin');            // Точное совпадение
await expect(header).toHaveText(/Привет, .+/);       // Совпадение по регулярному выражению

Playwright позволяет также проверять частичный текст с помощью параметра useInnerText или strict: false.


Асинхронные ожидания с таймаутом

Каждый метод expect принимает опциональный объект конфигурации с таймаутом. Это позволяет адаптировать ожидания под динамическое поведение страницы.

await expect(alert).toHaveText('Успешно', { timeout: 10000 }); // Ожидание до 10 секунд

Если условие не выполняется в течение указанного таймаута, тест завершится ошибкой.


Комбинированные ожидания

Иногда необходимо проверять сразу несколько условий. Playwright позволяет комбинировать проверки через цепочки промисов или несколько expect подряд:

await expect(element).toBeVisible();
await expect(element).toHaveText('Готово');
await expect(element).toHaveClass(/success/);

Использование последовательных ожиданий гарантирует, что каждый шаг проверяется в момент своего выполнения.


Работа с коллекциями элементов

Для проверки нескольких элементов на странице применяются методы коллекций locator.all() или locator.nth():

const items = page.locator('ul#list li');
await expect(items).toHaveCount(5);                  // Проверка количества элементов
await expect(items.nth(0)).toHaveText('Первый');     // Проверка конкретного элемента

Метод toHaveCount автоматически ждёт появления заданного количества элементов в DOM.


Совместное использование с условиями

Assertions хорошо интегрируются с условными конструкциями для динамических проверок:

if (await element.isVisible()) {
  await expect(element).toHaveText('Активен');
}

Это полезно для тестов, где элементы могут появляться или исчезать в зависимости от действий пользователя.


Настройка глобальных таймаутов

Playwright позволяет настраивать таймауты ожиданий как для отдельных проверок, так и глобально для всего теста:

test.setTimeout(20000);       // Таймаут всего теста 20 секунд
await expect(element).toBeVisible({ timeout: 10000 }); // Локальный таймаут

Гибкое управление таймаутами повышает надёжность тестов на динамических страницах.


Проверка ошибок и сообщений

Для тестирования появления уведомлений, алертов или сообщений об ошибках используются методы:

await expect(page.locator('.error')).toHaveText('Неверный пароль');
await expect(page.locator('.notification')).toBeVisible();

Комбинация видимости и текста позволяет точно проверять пользовательский интерфейс и реакции системы на действия пользователя.


Примеры нестандартных проверок

Playwright предоставляет расширенные возможности проверки:

await expect(element).toHaveCount(3);                     // Проверка количества элементов
await expect(element).not.toBeVisible();                  // Элемент не видим
await expect(element).toHaveCSS('color', 'rgb(255, 0, 0)'); // Проверка CSS свойства
await expect(element).toHaveJSProperty('disabled', true);   // Проверка JS свойства

Эти методы позволяют создавать точные и надёжные тесты, полностью контролируя состояние страницы.


Assertions в Playwright строятся вокруг автоматического ожидания, что снимает необходимость ручного использования waitForTimeout или сложных цепочек промисов. Это делает тесты короткими, читаемыми и устойчивыми к изменениям интерфейса, одновременно обеспечивая точное и надёжное проверочное покрытие.