Для начала необходимо установить Puppeteer через npm:
npm install puppeteer
Puppeteer поставляется с собственным экземпляром Chromium, что обеспечивает стабильное окружение для тестирования. Можно указать использование установленного браузера:
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch({
headless: true,
executablePath: '/usr/bin/chromium-browser', // путь к установленному браузеру
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();
Ключевой момент: параметр headless
управляет режимом без графического интерфейса, что критично для CI/CD
интеграций.
Puppeteer предоставляет мощные методы для навигации и взаимодействия с DOM:
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
const title = await page.title();
const content = await page.$eval('h1', el => el.textContent);
waitUntil: ‘networkidle2’ гарантирует, что страница
полностью загрузилась.
eval < /code > позволяетвыполнитьфункциюнадвыбраннымэлементом. < /li > < /ul > < p > Дляпоисканесколькихэлементовиспользуетсяметод < code>$</code>:</p>
<pre class="javascript"><code>const items = await
page.$$('ul li'); for (const item of items) { const text = await
item.evaluate(el => el.textContent); console.log(text); }
Формы заполняются через методы type и click:
await page.type('#username', 'testuser');
await page.type('#password', 'password123');
await page.click('#loginButton');
await page.waitForNavigation({ waitUntil: 'networkidle2' });
Метод waitForSelector обеспечивает синхронизацию с
динамическим контентом:
await page.waitForSelector('.dashboard');
Важно: использование waitForSelector
предпочтительнее фиксированных задержек (setTimeout), так
как делает тесты более стабильными.
Puppeteer позволяет создавать скриншоты и PDF документов для тестирования визуальной части приложения:
await page.screenshot({ path: 'screenshot.png', fullPage: true });
await page.pdf({ path: 'document.pdf', format: 'A4' });
fullPage: true захватывает всю страницу, а не только
видимую область.
Puppeteer может перехватывать сетевые запросы, что полезно для APM и нагрузочного тестирования:
await page.setRequestInterception(true);
page.on('request', request => {
if (request.url().includes('analytics')) {
request.abort();
} else {
request.continue();
}
});
Ключевые возможности:
page.setOfflineMode(true) и
page.emulateNetworkConditions(),
Puppeteer интегрируется с системами мониторинга приложений (Application Performance Monitoring), такими как New Relic, Datadog или Elastic APM. Основные сценарии:
const performanceTiming = JSON.parse(
await page.evaluate(() => JSON.stringify(window.performance.timing))
);
const pageLoadTime = performanceTiming.loadEventEnd - performanceTiming.navigationStart;
console.log(`Время полной загрузки страницы: ${pageLoadTime} мс`);
page.on('console', msg => console.log('Console:', msg.text()));
page.on('pageerror', err => console.error('Page Error:', err));
page.on('pageerror', async () => {
await page.screenshot({ path: `error_${Date.now()}.png` });
});
const apm = require('elastic-apm-node');
apm.start({ serviceName: 'puppeteer-tests' });
apm.captureTransaction('pageLoad', 'test', () => {
// логика теста
});
Puppeteer позволяет эмулировать мобильные браузеры и устройства:
const iPhone = puppeteer.devices['iPhone 12'];
await page.emulate(iPhone);
await page.goto('https://example.com');
Эмуляция включает размеры экрана, плотность пикселей и пользовательский агент, что критично для тестирования адаптивности и производительности мобильных приложений.
Puppeteer поддерживает Chrome DevTools Protocol, позволяя собирать детальные профили:
const client = await page.target().createCDPSession();
await client.send('Performance.enable');
const metrics = await client.send('Performance.getMetrics');
console.log(metrics);
Это позволяет получать метрики CPU, памяти, времени отклика и других ресурсов, необходимых для APM и оптимизации веб-приложений.
Все операции в Puppeteer являются асинхронными, поэтому важно корректно обрабатывать исключения:
try {
await page.goto('https://example.com');
} catch (err) {
console.error('Ошибка при загрузке страницы:', err);
}
Для сложных сценариев полезно использовать Promise.all и
Promise.race для одновременной работы с несколькими
задачами и контроля таймаутов.
headless: true для CI/CD и headless:
false для локальной отладки.
waitForSelector,
waitForNavigation и networkidle2 вместо
фиксированных задержек.
Puppeteer сочетает возможности автоматизации UI с мощными инструментами мониторинга, позволяя тестировать производительность, отслеживать ошибки и интегрироваться с APM решениями для полноценного анализа веб-приложений.