В тестах на Playwright производительность может снижаться по нескольким причинам:
Избыточные ожидания (waits) Использование
page.waitForTimeout() или постоянные
page.waitForSelector() без явной необходимости создают
ненужные задержки. Каждый лишний вызов увеличивает общее время
выполнения теста, особенно при большом количестве сценариев.
Неоптимальные селекторы Сложные CSS- или XPath-селекторы могут потреблять больше времени на поиск элементов на странице. В больших и динамических приложениях это приводит к значительному замедлению. Оптимизация селекторов и использование уникальных идентификаторов сокращает время поиска элементов.
Множество браузерных контекстов Создание нового
browserContext для каждого теста повышает изоляцию, но
увеличивает накладные расходы на инициализацию и запуск. Необходимо
балансировать между изоляцией и производительностью.
Сложные сценарии и тяжелые страницы Загрузка больших страниц с множеством ресурсов (скрипты, изображения, видео) напрямую влияет на скорость тестов. Необходимость тестирования всех ресурсов часто избыточна; можно использовать фильтрацию или эмуляцию запросов для ускорения.
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 активно использует асинхронные операции. Частая ошибка – последовательное ожидание всех действий без параллелизации:
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).Эффективное управление этими аспектами позволяет создавать быстрые, стабильные и поддерживаемые тестовые сценарии с Playwright.