Блокировка ресурсов для ускорения

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

Проблемы с ресурсами

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

Как блокировать ресурсы в Puppeteer

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

Пример блокировки ресурсов

const puppeteer = require(&

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Включаем перехват запросов
  await page.setRequestInterception(true);

  // Блокируем неважные ресурсы
  page.on('request', (request) => {
    const resourceType = request.resourceType();
    if (resourceType === 'image' || resourceType === 'stylesheet' || resourceType === 'font') {
      request.abort(); // Блокируем запрос
    } else {
      request.continue(); // Разрешаем остальные запросы
    }
  });

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

  // Выполняем действия для теста

  await browser.close();
})();

В данном примере происходит следующее:

  1. Включается перехват запросов с помощью page.setRequestInterception(true).
  2. В обработчике событий для перехваченных запросов (page.on(‘request’)) блокируются запросы для изображений (image), стилей (stylesheet) и шрифтов (font).
  3. Для всех остальных типов запросов вызывается метод request.continue(), что позволяет продолжить их загрузку.

Типы ресурсов для блокировки

Основные типы ресурсов, которые можно блокировать, включают:

  • Изображения (image): Блокировка изображений поможет ускорить тесты, так как загрузка изображений — одна из самых медленных операций на странице.
  • Стили (stylesheet): Стили могут быть незначимыми при функциональном тестировании, так как часто тесты не зависят от внешнего вида страницы, а лишь от её поведения.
  • Шрифты (font): Загрузка шрифтов также может замедлить тесты, особенно если шрифты загружаются с удалённых серверов.
  • Видеофайлы (media): Если приложение использует видео или аудио, их загрузка может занять значительное время, но для тестов этого не всегда требуется.
  • Скрипты (script): В некоторых случаях можно блокировать внешние скрипты, особенно если они не влияют на функциональность тестируемого приложения.

Углубленная настройка блокировки

В некоторых случаях может понадобиться блокировать ресурсы с определённых URL-адресов или с использованием регулярных выражений. Например, если известно, что ресурсы на внешнем CDN загружаются слишком медленно, можно заблокировать только их, не затрагивая остальные.

page.on('request', (request) => {
  const url = request.url();
  if (url.includes('slowcdn.com') || /.*\.jpg$/.test(url)) {
    request.abort(); // Блокируем запросы с медленных серверов или .jpg файлы
  } else {
    request.continue();
  }
});

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

Эффект блокировки на производительность

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

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

Тестирование без блокировки ресурсов

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

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

Заключение

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