Проблемы производительности

Основные источники замедлений

В тестах на Playwright производительность может снижаться по нескольким причинам:

  1. Избыточные ожидания (waits) Использование page.waitForTimeout() или постоянные page.waitForSelector() без явной необходимости создают ненужные задержки. Каждый лишний вызов увеличивает общее время выполнения теста, особенно при большом количестве сценариев.

  2. Неоптимальные селекторы Сложные CSS- или XPath-селекторы могут потреблять больше времени на поиск элементов на странице. В больших и динамических приложениях это приводит к значительному замедлению. Оптимизация селекторов и использование уникальных идентификаторов сокращает время поиска элементов.

  3. Множество браузерных контекстов Создание нового browserContext для каждого теста повышает изоляцию, но увеличивает накладные расходы на инициализацию и запуск. Необходимо балансировать между изоляцией и производительностью.

  4. Сложные сценарии и тяжелые страницы Загрузка больших страниц с множеством ресурсов (скрипты, изображения, видео) напрямую влияет на скорость тестов. Необходимость тестирования всех ресурсов часто избыточна; можно использовать фильтрацию или эмуляцию запросов для ускорения.

Практики оптимизации

1. Использование page.locator() вместо page.$() Locator создается лениво и позволяет повторно обращаться к элементу без повторного поиска. Это снижает накладные расходы при взаимодействиях с динамическими элементами.

const loginButton = page.locator('#login');
await loginButton.click();
await loginButton.waitFor({ state: 'hidden' });

2. Параллельное выполнение тестов Playwright Test поддерживает параллельное выполнение через workers. Количество одновременно работающих процессов можно настраивать под ресурсы машины:

// playwright.config.js
module.exports = {
  workers: 4,
};

3. Ограничение загрузки ресурсов Для ускорения тестов можно блокировать загрузку тяжелых ресурсов:

await page.route('**/*.{png,jpg,css}', route => route.abort());

4. Кеширование и reuse контекстов Вместо создания нового контекста для каждого теста можно использовать общий контекст для группы тестов, если изоляция не критична. Это снижает затраты на инициализацию браузера и ускоряет запуск.

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

// playwright.config.js
module.exports = {
  use: {
    screenshot: 'only-on-failure',
    video: 'retain-on-failure',
  },
};

Метрики и анализ производительности

Для выявления узких мест можно использовать:

  • Playwright Trace Viewer – инструмент для анализа всех действий теста, времени загрузки страниц, запросов и ошибок.
  • Логирование времени выполнения тестов – замер каждого сценария и ключевых действий, чтобы определить самые медленные участки.
  • CI/CD профилирование – запуск тестов с различным количеством воркеров и нагрузкой, чтобы определить оптимальный баланс между скоростью и стабильностью.

Особенности асинхронности

Playwright активно использует асинхронные операции. Частая ошибка – последовательное ожидание всех действий без параллелизации:

await page.click('#button1');
await page.click('#button2');
await page.click('#button3');

Вместо этого можно параллельно ожидать загрузку нескольких элементов:

await Promise.all([
  page.click('#button1'),
  page.click('#button2'),
  page.click('#button3')
]);

Это уменьшает суммарное время выполнения, особенно на сложных страницах.

Оптимизация сетевых запросов

Для страниц с большим количеством API-запросов или медленных серверов можно использовать:

  • Мокинг запросов (page.route) – ускоряет тесты, возвращая заранее подготовленные ответы.
  • Эмуляцию сети – ограничение пропускной способности и задержек для проверки устойчивости без ожидания реального медленного сервера.
await page.route('**/api/data', route =>
  route.fulfill({ status: 200, body: JSON.stringify({ success: true }) })
);

Баланс между надежностью и скоростью

Высокая производительность не должна снижать стабильность тестов. Основные рекомендации:

  • Минимизировать фиксированные таймауты, использовать ожидания состояния элементов (visible, attached, hidden).
  • Параллелить тесты, но не перегружать машину.
  • Использовать селекторы, которые минимально подвержены изменениям DOM.
  • Ограничивать ресурсоемкие действия, включая видео и скриншоты, только там, где это необходимо для отладки.

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