Оптимизация ресурсов при многостраничной работе

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

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

Отключение ненужных запросов

Для ускорения загрузки страниц и экономии сетевых ресурсов полезно отключить загрузку несущественных файлов. Puppeteer позволяет перехватывать сетевые запросы и отменять их, если они не важны для теста. Например, можно отключить загрузку изображений или шрифтов с помощью метода page.setRequestInterception(true):

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

page.on(&
  if (['image', 'font', 'stylesheet'].includes(request.resourceType())) {
    request.abort();  // Отменить запрос
  } else {
    request.continue();  // Пропустить остальные запросы
  }
});

await page.goto('https://example.com');

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

Управление кешированием

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

const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });

При использовании параметра waitUntil: ‘domcontentloaded’ Puppeteer дождется, пока DOM страницы будет полностью загружен, не ожидая загрузки всех сетевых ресурсов (которые могут быть загружены асинхронно). Это значительно ускоряет процесс тестирования, особенно при работе с динамическими веб-приложениями.

  1. Эмуляция мобильных устройств и экономия ресурсов

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

Выбор мобильного устройства

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

const page = await browser.newPage();
const iphone = puppeteer.devices['iPhone 6'];
await page.emulate(iphone);
await page.goto('https://example.com');

Кроме того, следует отключить JavaScript или использовать минимальное количество фреймов и компонентов, если эти элементы не имеют значения для тестирования функционала. Это снизит нагрузку на систему.

Эмуляция сети

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

const page = await browser.newPage();
await page.emulateNetworkConditions(puppeteer.networkConditions['Slow 3G']);
await page.goto('https://example.com');

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

  1. Параллельные тесты и управление памятью

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

Запуск нескольких браузеров

Можно создавать несколько экземпляров браузера и страниц в одном процессе Node.js, что позволяет выполнять параллельные тесты. Это важно для многозадачности и ускорения общего времени выполнения тестов:

const browser1 = await puppeteer.launch(); const browser2 = await
puppeteer.launch();


const page1 = await browser1.newPage(); const page2 = await browser2.newPage();

await Promise.all([ page1.goto('https://example.com/page1'), page2.goto('https://example.com/page2')]);

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

Управление использованием памяти

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

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

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

  1. Управление таймаутами и ожиданиями

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

Умные таймауты

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

await page.goto('https://example.com', { timeout: 30000, waitUntil: 'domcontentloaded' });

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

Ожидания для элементов

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

await page.waitForSelector('.some-element', { visible: true });

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

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

Запуск браузера без графического интерфейса (headless) является стандартом для большинства тестов с Puppeteer. Это уменьшает использование ресурсов, так как отсутствует необходимость в рендеринге графики и интерфейса. Включение опции headless в puppeteer.launch() позволяет запускать браузер в фоновом режиме:

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

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


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