Puppeteer и Lighthouse тесно связаны в контексте автоматизированного тестирования производительности и качества веб-приложений. Puppeteer предоставляет возможность управлять браузером Chrome или Chromium программно, а Lighthouse позволяет анализировать страницы на метрики производительности, SEO, доступности и лучшие практики. Интеграция этих инструментов позволяет запускать аудиты Lighthouse в автоматизированных сценариях, контролируемых через Puppeteer.
Для работы необходимы следующие пакеты:
npm install puppeteer lighthouse chrome-launcher
Важно использовать совместимые версии Chrome и Puppeteer, чтобы избежать проблем с совместимостью DevTools Protocol.
Lighthouse может работать как с внешним экземпляром Chrome, так и с запущенным Puppeteer. Пример интеграции:
const puppeteer = require(&
const lighthouse = require('lighthouse');
const { URL } = require('url');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const wsEndpoint = browser.wsEndpoint();
const url = 'https://example.com';
const result = await lighthouse(url, {
port: new URL(wsEndpoint).port,
output: 'json',
logLevel: 'info'
});
console.log('Performance score:', result.lhr.categories.performance.score * 100);
await browser.close();
})();
Ключевые моменты:
wsEndpoint() Puppeteer возвращает адрес WebSocket для
управления запущенным браузером.
port для подключения к уже
запущенному экземпляру Chrome.
output: ‘json’ позволяет получить результаты в
структурированном виде для дальнейшей обработки.
Lighthouse поддерживает разные категории аудитов: performance, accessibility, best-practices, SEO, PWA. Для точного контроля используются опции:
const flags = {
onlyCategories: ['performance', 'accessibility'],
emulatedFormFactor: 'desktop',
throttlingMethod: 'provided'
};
onlyCategories ограничивает аудит конкретными метриками.
emulatedFormFactor определяет устройство:
‘mobile’ или ‘desktop’.
throttlingMethod: ‘provided’ отключает эмуляцию сетевых
условий и CPU, полезно при тестах на локальном сервере.
Перед запуском Lighthouse часто требуется подготовка состояния страницы: авторизация, навигация, заполнение форм. Puppeteer позволяет полностью управлять этим процессом.
const page = await browser.newPage();
await page.goto('https://example.com/login');
await page.type('#username', 'testuser');
await page.type('#password', 'password123');
await page.click('#login-button');
await page.waitForNavigation();
После выполнения этих шагов Lighthouse может быть запущен на уже авторизованной странице, что позволяет тестировать реальные сценарии использования.
Результаты Lighthouse возвращаются в объекте lhr
(Lighthouse Result):
const { lhr } = result;
console.log('Performance:', lhr.categories.performance.score * 100);
console.log('Accessibility:', lhr.categories.accessibility.score * 100);
lhr.audits['first-contentful-paint'].displayValue;
lhr.audits['largest-contentful-paint'].numericValue;
Особенности:
numericValue всегда представлены в миллисекундах.
displayValue содержит человекочитаемую форму, например
“1.2 s”.
Для удобного хранения результатов используют экспорт в JSON или HTML:
const fs = require('fs');
fs.writeFileSync('lighthouse-report.json', JSON.stringify(result.lhr, null, 2));
fs.writeFileSync('lighthouse-report.html', result.report);
Преимущества:
Puppeteer + Lighthouse часто используют в пайплайнах:
Пример проверки производительности:
if (result.lhr.categories.performance.score < 0.9) {
throw new Error('Performance score below threshold!');
}
Таким образом, ошибки выявляются автоматически, предотвращая попадание медленных страниц в продакшен.
–no-sandbox упрощает запуск в Docker.
headless: true ускоряют тесты.
disableStorageReset: true сохраняет состояние между
сессиями.
extends
позволяет создавать корпоративные правила качества.
try/catch для корректного закрытия браузера в
случае ошибок.
Интеграция Puppeteer с Lighthouse обеспечивает точное и гибкое тестирование веб-приложений, позволяя анализировать реальные пользовательские сценарии и автоматически контролировать качество страниц на всех этапах разработки.