Для начала необходимо установить Puppeteer через npm:
npm install puppeteer
После установки создается объект браузера с помощью функции
puppeteer.launch(). Основные параметры включают:
headless: запуск в безголовом режиме (true)
или с визуальным интерфейсом (false).
args: дополнительные аргументы для запуска браузера.
defaultViewport: размеры окна браузера.
Пример инициализации:
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
})();
Одной из ключевых возможностей Puppeteer является перехват и анализ
сетевых запросов. Используется событие request для
отслеживания отправляемых запросов и response для анализа
ответов.
page.on('request', request => {
console.log('Request URL:', request.url());
console.log('Request Method:', request.method());
});
page.on('response', async response => {
const url = response.url();
const status = response.status();
console.log(`Response from ${url}: ${status}`);
});
Особенности:
request.postData() позволяет получить данные
POST-запроса.
response.text() или response.json()
позволяет анализировать тело ответа.
Puppeteer позволяет отслеживать загрузку различных ресурсов: скриптов, стилей, изображений, шрифтов и других.
page.on('requestfinished', async request => {
const response = request.response();
const type = request.resourceType();
const url = request.url();
const size = response ? (await response.buffer()).length : 0;
console.log(`Resource: ${url}`);
console.log(`Type: ${type}`);
console.log(`Size: ${size} bytes`);
});
Ключевые моменты:
resourceType() возвращает тип ресурса:
document, stylesheet, image,
script, font, xhr и др.
requestfinished срабатывает только после успешной загрузки
ресурса.
Для мониторинга производительности страницы Puppeteer предоставляет
доступ к объекту performance через метод
page.evaluate():
const metrics = await page.evaluate(() => JSON.stringify(window.performance.timing));
console.log(JSON.parse(metrics));
Основные показатели:
navigationStart – начало навигации.
responseStart – момент получения первого байта ответа.
domContentLoadedEventEnd – завершение загрузки DOM.
loadEventEnd – полная загрузка страницы.
Для вычисления времени загрузки ресурса:
page.on('response', async response => {
const timing = response.timing();
if (timing) {
console.log(`Resource ${response.url()} loaded in ${timing.responseEnd - timing.startTime} ms`);
}
});
Puppeteer позволяет блокировать или изменять запросы для тестирования различных сценариев.
await page.setRequestInterception(true);
page.on('request', request => {
if (request.resourceType() === 'image') {
request.abort(); // блокировка загрузки изображений
} else {
request.continue();
}
});
Возможности:
request.respond() для тестирования
ошибок и задержек.
Для глубокого мониторинга Puppeteer предоставляет доступ к методам DevTools Protocol.
const client = await page.target().createCDPSession();
await client.send('Performance.enable');
const performanceMetrics = await client.send('Performance.getMetrics');
console.log(performanceMetrics.metrics);
Полезные показатели:
JSHeapUsedSize – используемая память JavaScript.
JSHeapTotalSize – общий размер выделенной памяти.
TaskDuration – время выполнения задач в основном потоке.
LayoutDuration – время, затраченное на рендеринг и
раскладку элементов.
Для регулярного мониторинга ресурсов и производительности удобно использовать циклы и логирование:
setInterval(async () => {
const memory = await page.metrics();
console.log('Memory Usage:', memory.JSHeapUsedSize);
}, 5000);
Можно комбинировать с отправкой данных в базы данных или системы визуализации для построения графиков загрузки и потребления ресурсов.
headless: true для автоматических
тестов, чтобы снизить нагрузку.
requestfinished и response одновременно, чтобы
отслеживать полную картину загрузки.
Эти подходы позволяют не только выявлять узкие места в производительности, но и создавать надежные автоматизированные тесты, анализирующие качество загрузки страниц и работу их ресурсов.