Для тестирования Workbox в реальных условиях используется Puppeteer — библиотека для управления браузером Chromium/Chrome через Node.js. Основная задача — запустить браузер в контролируемом окружении, зарегистрировать сервис-воркер и проверить его поведение при различных сценариях кэширования и сетевых запросов.
Первым шагом является установка Puppeteer и необходимых зависимостей:
npm install puppeteer
Далее создаётся скрипт, который инициирует запуск браузера и открывает тестовую страницу:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('http://localhost:8080');
})();
Важно использовать headless: false на этапе
тестирования, чтобы наблюдать поведение сервис-воркера в реальном
браузере.
Для работы с Workbox сервис-воркер должен быть корректно зарегистрирован. Puppeteer позволяет проверять успешность регистрации через методы страницы:
await page.evaluate(() => {
return navigator.serviceWorker.register('/sw.js')
.then(reg => reg.active ? 'Service Worker активен' : 'Регистрация прошла, но активен не сразу');
});
Можно дополнительно отслеживать события активации и установки сервис-воркера через Puppeteer:
await page.evaluate(() => {
navigator.serviceWorker.ready.then(registration => {
console.log('Service Worker готов к обработке запросов');
});
});
Это позволяет убедиться, что Workbox и его стратегии кэширования будут применены к запросам страницы.
Workbox предоставляет несколько стратегий кэширования:
cacheFirst, networkFirst,
staleWhileRevalidate и другие. Каждая стратегия должна быть
проверена на соответствующих ресурсах, чтобы убедиться, что кэширование
работает корректно.
Пример теста с Puppeteer для проверки кэширования ресурсов:
const resourceUrl = 'http://localhost:8080/style.css';
await page.goto('http://localhost:8080');
// Первый запрос — должен инициировать загрузку с сервера
let response1 = await page.evaluate(url =>
fetch(url).then(res => res.status), resourceUrl);
console.log('Первый запрос, статус:', response1);
// Второй запрос — должен использовать кэш
let response2 = await page.evaluate(url =>
fetch(url).then(res => res.status), resourceUrl);
console.log('Второй запрос, статус:', response2);
Если стратегия cacheFirst применена корректно, второй
запрос не должен инициировать сетевой трафик.
Для проверки устойчивости приложения Workbox важно тестировать оффлайн и ошибки сети. Puppeteer предоставляет методы для эмуляции оффлайн-режима:
await page.setOfflineMode(true);
// Попытка загрузки ресурса
let offlineResponse = await page.evaluate(url =>
fetch(url).then(res => res.status).catch(err => 'Ошибка сети'), resourceUrl);
console.log('Оффлайн-запрос:', offlineResponse);
await page.setOfflineMode(false);
Такой подход позволяет убедиться, что сервис-воркер корректно обслуживает кэшированные ресурсы и fallback-страницы при отсутствии сети.
Workbox поддерживает механизм skipWaiting и
clientsClaim, что важно для тестирования обновлений
ресурсов. Puppeteer позволяет эмулировать обновление сервис-воркера:
// Перезагрузка страницы для имитации новой версии сервиса
await page.reload({ waitUntil: ['networkidle0'] });
// Проверка состояния сервис-воркера
const swState = await page.evaluate(() => {
return navigator.serviceWorker.controller ? 'Активен новый SW' : 'Используется старый SW';
});
console.log(swState);
Это помогает проверить, что Workbox корректно применяет новые версии кэшированных ресурсов и обновляет клиентов.
Для детального тестирования можно проверять содержимое кэшей Workbox
через caches API. Puppeteer позволяет выполнять скрипты в
контексте страницы для получения списка кэшированных URL:
const cachedUrls = await page.evaluate(async () => {
const cacheNames = await caches.keys();
const urls = [];
for (const name of cacheNames) {
const cache = await caches.open(name);
const requests = await cache.keys();
requests.forEach(req => urls.push(req.url));
}
return urls;
});
console.log('Кэшированные ресурсы:', cachedUrls);
Это помогает убедиться, что все необходимые ресурсы находятся в кэше и стратегии Workbox работают корректно.
Для комплексного тестирования можно создавать наборы сценариев, проверяющих работу кэширования и оффлайн-поведение при различных конфигурациях Workbox:
NetworkFirst.cacheOnly и
оффлайн.Такая автоматизация позволяет интегрировать тестирование Workbox в CI/CD-процессы, обеспечивая стабильную работу PWA и других приложений с сервис-воркерами.