Оптимизация скриптов автоматизации

Оптимизация скриптов автоматизации с использованием Puppeteer имеет большое значение для повышения производительности и эффективности тестирования веб-приложений. Важно не только получить корректные результаты тестов, но и обеспечить быстрое выполнение скриптов, особенно в условиях больших проектов или при интеграции с системами CI/CD. Рассмотрим ключевые аспекты, которые влияют на оптимизацию Puppeteer-скриптов, и методы их реализации.

  1. Использование безголового режима

Puppeteer по умолчанию работает в безголовом режиме, что значительно ускоряет выполнение тестов. Безголовый браузер не отображает графику, элементы интерфейса и не выполняет другие ресурсоёмкие операции. Это существенно снижает нагрузку на систему и ускоряет выполнение тестов.

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

const browser = await puppeteer.launch({ headless: true });

  1. Управление ресурсами страницы

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

const page = await browser.newPage(); await
page.setRequestInterception(true);


page.on(& if (request.resourceType() === 'image' ||
request.resourceType() === 'stylesheet') { request.abort(); } else {
request.continue(); } });

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

  1. Использование waitFor с оптимальными таймингами

Вместо использования жестких задержек (например, setTimeout) для ожидания загрузки страницы или элементов, Puppeteer предоставляет методы, которые позволяют ожидать события в динамично загружаемых приложениях. Использование waitForSelector или waitForFunction позволяет дожидаться появления элементов на странице, что снижает избыточные задержки и повышает точность тестов.

await page.waitForSelector('.submit-button', { visible: true });

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

  1. Параллельное выполнение тестов

Когда тестов становится много, полезно распараллелить их выполнение. Puppeteer позволяет запускать несколько экземпляров браузера одновременно, что особенно актуально для многозадачных тестов или при необходимости выполнения нескольких сценариев в одном тесте.

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

const browser = await puppeteer.launch({ headless: true }); const
pages = await Promise.all([ browser.newPage(), browser.newPage(),
browser.newPage()]);


await Promise.all(pages.map(page =>
page.goto('https://example.com')));

  1. Использование networkidle0 и networkidle2 в методе goto

Метод page.goto() позволяет настроить ожидания загрузки страницы. В зависимости от сложности страницы можно использовать параметры networkidle0 или networkidle2, чтобы уменьшить время ожидания после загрузки контента. Эти параметры указывают на то, что страница считается загруженной, когда сетевые запросы прекратились.

  • networkidle0 – страница считается загруженной, когда не происходит сетевых запросов.
  • networkidle2 – страница считается загруженной, когда происходит не более двух сетевых запросов в течение 500 миллисекунд.
await page.goto('https://example.com', { waitUntil: 'networkidle0' });

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

  1. Уменьшение количества операций с DOM

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

const submitButton = await page.$('.submit-button');
await submitButton.click();

Такой подход снижает нагрузку на браузер и ускоряет выполнение тестов.

  1. Снижение качества скриншотов и видеозаписей

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

Для скриншотов можно указать более низкое качество:

await page.screenshot({ path: 'screenshot.png', quality: 50 });

Для записи видео можно уменьшить разрешение или частоту кадров, если качество не критично для анализа.

  1. Очищение ресурсов после выполнения тестов

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

await page.close();
await browser.close();

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

  1. Адаптация к серверной среде

В случае интеграции с CI/CD важно учитывать, что ресурсы могут быть ограничены, а выполнение тестов — в условиях удалённых серверов или виртуальных машин. Оптимизация скриптов для таких сред включает в себя:

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

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

  1. Логирование и мониторинг

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

page.on('console', msg => {
console.log(msg.text());
});

Мониторинг времени выполнения различных частей тестов позволяет точнее настроить оптимизацию.


Применение этих техник позволяет значительно ускорить выполнение скриптов автоматизации на Puppeteer и улучшить стабильность тестов, особенно в условиях большого объёма тестирования и ограниченных системных ресурсов.