Доступ к Service Workers

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

Получение доступа к Service Worker

Для того чтобы получить доступ к Service Worker, необходимо использовать API, предоставляемое Playwright. Работать с Service Worker можно на уровне страницы или контекста браузера.

Прежде всего, необходимо убедиться, что Service Worker активен. Для этого нужно слушать события, которые сигнализируют о его регистрации и активации. В Playwright это делается через ServiceWorker объект, который доступен через контекст страницы.

const { chromium } = require('playwright');

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

  await page.goto('https://yourwebsite.com');
  
  // Доступ к зарегистрированным сервис-воркерам
  const serviceWorkers = await page.context().serviceWorkers();
  console.log(serviceWorkers);  // Массив всех активных сервис-воркеров
  
  await browser.close();
})();

Метод serviceWorkers() возвращает все активные сервис-воркеры для контекста страницы, на которой они зарегистрированы. Это позволяет взаимодействовать с ними в ходе теста.

Просмотр и манипулирование с запросами

Одной из основных задач при тестировании с использованием Service Workers является перехват и манипуляция с сетевыми запросами. Playwright позволяет перехватывать запросы, происходящие через сервис-воркеры, используя route API. Этот подход полезен для проверки, как приложение ведет себя при изменении сетевых условий или когда нужно эмулировать ошибки сети.

Пример перехвата запросов, обрабатываемых сервис-воркером:

await page.route('**/*', route => {
  const request = route.request();
  console.log(request.url()); // Логируем URL запроса
  
  // Можно модифицировать запрос
  route.continue({
    headers: {
      'Custom-Header': 'value'
    }
  });
});

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

Эмуляция офлайн-режима

Playwright предоставляет возможность симуляции работы в офлайн-режиме, что критично для проверки поведения сервис-воркеров, которые должны обеспечивать работу приложения в условиях отсутствия интернета. Для этого используется метод page.setOfflineMode().

await page.setOfflineMode(true);

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

Активирование и деактивация Service Worker

Иногда необходимо вручную активировать или деактивировать Service Worker в процессе тестирования. Playwright позволяет взаимодействовать с жизненным циклом сервис-воркера через методы register() и unregister().

Пример активации сервис-воркера:

await page.evaluate(() => {
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/service-worker.js').then(registration => {
      console.log('Service Worker зарегистрирован:', registration);
    });
  }
});

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

Пример деактивации:

await page.evaluate(() => {
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.getRegistration().then(registration => {
      if (registration) {
        registration.unregister().then(success => {
          console.log('Service Worker деактивирован:', success);
        });
      }
    });
  }
});

Просмотр и модификация кеша

Service Workers часто используются для управления кешированием контента. В Playwright есть возможности для взаимодействия с кешем, включая чтение и очистку кешированных данных. Для этого можно использовать метод page.context().clearCache() для удаления данных кеша на уровне контекста браузера.

await page.context().clearCache();

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

Проверка статуса Service Worker

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

Пример:

await page.evaluate(() => {
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.addEventListener('statechange', () => {
      console.log('Состояние сервис-воркера изменилось');
    });
  }
});

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

Работа с Service Worker на нескольких страницах

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

const context1 = await browser.newContext();
const context2 = await browser.newContext();

const page1 = await context1.newPage();
const page2 = await context2.newPage();

await page1.goto('https://yourwebsite.com');
await page2.goto('https://yourwebsite.com');

// Доступ к сервис-воркерам для каждого контекста
const serviceWorkers1 = await context1.serviceWorkers();
const serviceWorkers2 = await context2.serviceWorkers();

console.log(serviceWorkers1);
console.log(serviceWorkers2);

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

Заключение

Работа с Service Workers в Playwright предоставляет мощные возможности для эмуляции и контроля поведения приложений, использующих эти фоново работающие скрипты. Механизмы взаимодействия с сервис-воркерами, перехватом сетевых запросов и манипуляциями с кешем позволяют значительно расширить тестируемость веб-приложений и обеспечить их надежность в различных сценариях, таких как офлайн-режим или нестабильные сетевые условия.