Puppeteer — это библиотека для управления браузером Chromium или Chrome через протокол DevTools. Для начала работы необходимо установить пакет через npm:
npm install puppeteer
После установки можно подключить библиотеку в проект:
const puppeteer = require(&
Puppeteer автоматически загружает совместимую версию Chromium, однако
при необходимости можно использовать уже установленный браузер, указав
путь через опцию executablePath при запуске:
const browser = await puppeteer.launch({
executablePath: '/usr/bin/google-chrome',
headless: true
});
Опция headless: true позволяет запускать браузер без
графического интерфейса, что критично для серверных и CI/CD окружений.
Основные методы Puppeteer
Создание страницы и навигация:
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
waitUntil: ‘networkidle2’ гарантирует, что страница
полностью загрузилась и активные сетевые соединения практически
завершены. Это уменьшает вероятность ошибок при взаимодействии с DOM.
Работа с элементами DOM:
-
Поиск элементов:
const button = await page.$('button#submit');
const links = await page.$$('a');
-
Взаимодействие с элементами:
await button.click();
await page.type('input[name="email"]', 'test@example.com');
await page.select('select#country', 'RU');
-
Получение данных:
const title = await page.title();
const text = await page.$eval('h1', el => el.textContent);
Методы < /code > и < code> < /code > позволяютискатьодинилинесколькоэлементов, а < code>eval
выполняет функцию в контексте страницы, возвращая результат напрямую в
Node.js.
Работа с событиями и ожиданиями
Для стабильного тестирования важно правильно управлять асинхронными
событиями. Puppeteer предоставляет несколько способов:
-
Ожидание элемента:
await page.waitForSelector('#success', { timeout: 5000 });
-
Ожидание навигации после действия:
await Promise.all([
page.click('a#nextPage'),
page.waitForNavigation({ waitUntil: 'networkidle0' })
]);
Использование Promise.all гарантирует, что клик и переход
будут синхронизированы, предотвращая ошибки из-за преждевременного
обращения к DOM.
-
Обработка сетевых событий:
page.on('request', request => console.log('Request:', request.url()));
page.on('response', response => console.log('Response:', response.status(), response.url()));
Эти события позволяют анализировать трафик и проверять корректность
запросов API при тестировании.
Скриншоты и PDF
Для визуального тестирования Puppeteer предоставляет встроенные функции
создания скриншотов и PDF:
await page.screenshot({ path: 'screenshot.png', fullPage: true });
await page.pdf({ path: 'page.pdf', format: 'A4' });
Опция fullPage: true позволяет захватывать весь контент
страницы, а не только видимую область.
Работа с серверными и безголовыми сценариями
Для использования в серверной среде (например, Node.js на AWS Lambda или
Vercel), рекомендуется:
-
Использовать
puppeteer-core вместо полного
пакета, чтобы не загружать Chromium.
-
Подключать Chromium через
chrome-aws-lambda, оптимизированный под
serverless.
Пример настройки для AWS Lambda:
const chromium = require('chrome-aws-lambda');
const puppeteer = require('puppeteer-core');
exports.handler = async (event) => {
const browser = await puppeteer.launch({
args: chromium.args,
executablePath: await chromium.executablePath,
headless: chromium.headless
});
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
const content = await page.content();
await browser.close();
return content;
};
Такая конфигурация минимизирует вес пакета и ускоряет запуск функций в
serverless-окружении.
Настройка таймаутов и обработка ошибок
Для стабильных тестов важно управлять таймаутами:
page.setDefaultTimeout(10000); // 10 секунд для всех операций
page.setDefaultNavigationTimeout(20000); // 20 секунд для навигации
Ошибки обрабатываются стандартными try/catch блоками:
try {
await page.click('#nonexistent');
} catch (error) {
console.error('Элемент не найден:', error.message);
}
Такой подход позволяет предотвратить падение серверных функций и
корректно логировать проблемы.
Автоматизация пользовательских сценариев
Puppeteer удобно использовать для имитации действий пользователя:
-
Логин и работа с формами:
await page.type('#username', 'admin');
await page.type('#password', 'secret');
await page.click('#loginButton');
await page.waitForNavigation({ waitUntil: 'networkidle0' });
-
Навигация по SPA:
await page.click('nav a#dashboard');
await page.waitForSelector('#dashboardContent');
-
Загрузка и анализ данных:
const items = await page.$$eval('.item', nodes => nodes.map(n => n.textContent));
Методы Puppeteer позволяют полностью эмулировать сложные
пользовательские сценарии и собирать результаты для тестирования или
мониторинга.
Интеграция с тестовыми фреймворками
Puppeteer легко интегрируется с Jest, Mocha или другими фреймворками:
describe('Тестирование сайта', () => {
let browser, page;
beforeAll(async () => {
browser = await puppeteer.launch({ headless: true });
page = await browser.newPage();
});
afterAll(async () => {
await browser.close();
});
test('Заголовок страницы корректен', async () => {
await page.goto('https://example.com');
const title = await page.title();
expect(title).toBe('Example Domain');
});
});
Такой подход позволяет строить полноценные e2e-тесты и интеграционные
сценарии, комбинируя Puppeteer с проверками через assertion-библиотеки.