Puppeteer предоставляет API для управления браузером Chromium на уровне кода, позволяя не только автоматизировать действия пользователя, но и собирать подробные метрики производительности страницы. Основной подход заключается в использовании встроенных инструментов Chrome DevTools Protocol (CDP), которые Puppeteer полностью поддерживает.
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle0' });
const metrics = await page.metrics();
console.log(metrics);
await browser.close();
})();
Метод page.metrics() возвращает объект с ключевыми
показателями работы страницы, такими как JS Heap Size,
Nodes, LayoutCount,
RecalcStyleCount и FramesPerSecond.
Эти значения помогают отслеживать нагрузку на рендеринг, эффективность
JavaScript и общий FPS страницы.
Для более детализированных данных о производительности полезно
использовать performance.getEntries() через
page.evaluate().
const perfEntries = await page.evaluate(() => JSON.stringify(window.performance.getEntries()));
console.log(JSON.parse(perfEntries));
Особенности:
navigation — информация о загрузке страницы (DNS, TCP,
TTFB, DOMContentLoaded, LoadEvent).
resource — метрики загрузки отдельных ресурсов (скрипты,
изображения, шрифты).
mark и measure — кастомные точки измерений для
скриптов.
Собранные данные можно интегрировать с графиками или сохранять в JSON для последующего анализа.
Puppeteer позволяет напрямую обращаться к CDP, что открывает доступ к расширенным метрикам, недоступным через стандартные методы.
const client = await page.target().createCDPSession();
await client.send('Performance.enable');
const performanceMetrics = await client.send('Performance.getMetrics');
console.log(performanceMetrics);
Ключевые показатели:
CDP обеспечивает доступ к этим метрикам в реальном времени, что особенно важно при нагрузочном тестировании и проверке SPA-приложений.
Для измерения специфичных событий страницы используются
performance.mark и performance.measure.
await page.evaluate(() => {
performance.mark('startProcessing');
// выполнение кода
performance.mark('endProcessing');
performance.measure('processingTime', 'startProcessing', 'endProcessing');
});
const measures = await page.evaluate(() => performance.getEntriesByType('measure'));
console.log(measures);
Это позволяет оценивать время выполнения отдельных скриптов, обработку событий и реакции на пользовательские действия, что критично при тестировании сложной логики интерфейса.
Метод page.on(‘requestfinished’) позволяет отслеживать
завершение загрузки ресурсов и собирать метрики по времени.
page.on('requestfinished', async (request) => {
const response = request.response();
const timing = response.timing();
console.log({
url: request.url(),
startTime: timing.startTime,
duration: timing.receiveHeadersEnd - timing.sendEnd
});
});
Такая стратегия дает гибкость в анализе скорости загрузки отдельных ресурсов, выявлении узких мест и оптимизации критических путей рендеринга.
Сценарии можно настроить так, чтобы сбор метрик выполнялся автоматически при каждом переходе на страницу или после определенных действий пользователя. Пример последовательного сбора:
networkidle0 или load).
page.metrics().
Performance.getMetrics).
performance.mark, performance.measure).
Такой подход обеспечивает системный и повторяемый сбор показателей, что удобно для интеграции в CI/CD и автоматические тесты производительности.
headless: true для минимизации влияния
интерфейса браузера на метрики.
Performance.enable только при необходимости, чтобы
снизить нагрузку на процесс тестирования.
framenavigated и
domcontentloaded.
Эти практики делают сбор метрик через Puppeteer максимально точным и информативным, позволяя проводить как функциональные, так и производительные тесты с одинаковой эффективностью.