Puppeteer — это библиотека Node.js, предоставляющая высокоуровневый API для управления браузером Chrome или Chromium через протокол DevTools. Она используется для автоматизации тестирования, снятия скриншотов, генерации PDF, парсинга контента и симуляции действий пользователя. Puppeteer позволяет создавать стабильные тесты, которые точно повторяют взаимодействие с веб-приложением.
Для начала проект должен использовать Node.js версии 14 и выше. Установка Puppeteer осуществляется через npm:
npm install puppeteer
По умолчанию Puppeteer загружает встроенную версию Chromium. Для работы
с уже установленным браузером можно использовать опцию
executablePath:
const browser = await puppeteer.launch({
executablePath: &
headless: true
});
Ключевые параметры при запуске браузера:
headless: запуск без графического интерфейса (true по
умолчанию);
slowMo: замедление действий для визуальной отладки;
args: дополнительные флаги Chromium (например,
–no-sandbox, –disable-setuid-sandbox).
Puppeteer оперирует несколькими ключевыми объектами:
Примеры базовой работы с Page:
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
await page.setViewport({ width: 1280, height: 800 });
Метод goto позволяет загрузить страницу и дождаться
завершения сетевых запросов. Параметр waitUntil:
‘networkidle2’ гарантирует, что страница полностью загружена.
Поиск элементов
page.(selector) < /code > —первыйэлемент, соответствующийселектору; < /li > < li > < code > page.(selector) < /code > —всеэлементы, соответствующиеселектору; < /li > < li > < code > page.eval(selector,
callback) — выполняет функцию над найденным элементом;
page.$$eval(selector, callback) — выполняет функцию над
массивом элементов.
Примеры действий:
await page.type('#username', 'testuser');
await page.click('#submit');
await page.waitForSelector('.success-message');
Метод type симулирует ввод текста, click —
нажатие кнопки, waitForSelector — ожидание появления
элемента на странице.
Puppeteer поддерживает события браузера:
page.on(‘dialog’, callback) — обработка alert, confirm и
prompt;
page.on(‘console’, callback) — перехват сообщений
console.log;
page.on(‘request’, callback) — перехват сетевых запросов.
Пример с ожиданием навигации после клика:
await Promise.all([
page.waitForNavigation({ waitUntil: 'networkidle2' }),
page.click('a.next-page')
]);
Использование Promise.all гарантирует, что клик не
произойдет до ожидания загрузки новой страницы.
Puppeteer предоставляет возможность визуальной проверки:
await page.screenshot({ path: 'example.png', fullPage: true });
await page.pdf({ path: 'example.pdf', format: 'A4' });
Опция fullPage: true позволяет захватить весь контент
страницы, а не только видимую область.
При автоматизации тестов важно структурировать сценарии и определять приоритет выполнения. Основные критерии:
Стратегия приоритизации:
headless: true для ускорения;
id
или data-testid);
Puppeteer поддерживает открытие нескольких страниц и браузеров одновременно:
const pages = await Promise.all([
browser.newPage(),
browser.newPage()
]);
await Promise.all(pages.map(page => page.goto('https://example.com')));
Это позволяет запускать тесты быстрее и уменьшать время проверки больших приложений.
Все методы Puppeteer возвращают промисы, что требует корректного
использования async/await:
async function runTest() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// действия с элементами
await browser.close();
}
runTest();
Неправильная обработка промисов может привести к зависанию тестов или ложным результатам.
Puppeteer легко интегрируется с Jest, Mocha или Jasmine. Пример с Jest:
describe('Login page', () => {
let browser;
let page;
beforeAll(async () => {
browser = await puppeteer.launch();
page = await browser.newPage();
});
afterAll(async () => {
await browser.close();
});
test('User can login', async () => {
await page.goto('https://example.com/login');
await page.type('#username', 'testuser');
await page.type('#password', 'password');
await Promise.all([
page.waitForNavigation(),
page.click('#login')
]);
const successMessage = await page.$eval('.success', el => el.textContent);
expect(successMessage).toContain('Welcome');
});
});
Такая интеграция позволяет использовать мощные средства отчётности и мокирования.
Для проверки сетевых запросов Puppeteer предоставляет возможности перехвата:
await page.setRequestInterception(true);
page.on('request', request => {
if (request.url().includes('analytics')) {
request.abort();
} else {
request.continue();
}
});
Это позволяет тестировать приложения без реального взаимодействия с внешними сервисами и ускоряет выполнение тестов.
Puppeteer обеспечивает точное воспроизведение действий пользователя и позволяет строить стабильные, автоматизированные тесты, которые интегрируются с любыми JavaScript-тестовыми фреймворками. Оптимальная организация тестов и приоритизация задач повышают эффективность и сокращают время обнаружения критических ошибок.