Puppeteer сам по себе предоставляет базовые возможности управления браузером Chromium, но его функциональность можно существенно расширять с помощью сторонних библиотек и собственных модулей. Для работы с дополнительными пакетами используется стандартный менеджер пакетов npm:
npm install puppeteer-extra puppeteer-extra-plugin-stealth
puppeteer-extra — позволяет подключать плагины, расширяющие
возможности Puppeteer.
puppeteer-extra-plugin-stealth — скрывает признаки
автоматизации, делая взаимодействие с веб-страницами более естественным.
Подключение и инициализация:
const puppeteer = require(&
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://example.com');
})();
Плагины позволяют внедрять дополнительную логику на каждом этапе работы с браузером. Структура плагина включает:
onPageCreated,
beforeLaunch, afterLaunch).
Пример собственного плагина, логирующего все открытые страницы:
const CustomLogger = {
name: 'custom-logger',
onPageCreated: async (page) => {
console.log(`Создана новая страница: ${page.url()}`);
}
};
puppeteer.use(CustomLogger);
Такой подход позволяет централизованно управлять поведением браузера и страниц, без необходимости дублировать код.
Puppeteer позволяет перехватывать и изменять сетевые запросы. Это особенно полезно для тестирования API или подмены ресурсов:
await page.setRequestInterception(true);
page.on('request', (request) => {
if (request.url().includes('analytics')) {
request.abort(); // блокировка трекинговых запросов
} else {
request.continue();
}
});
С помощью response-события можно перехватывать ответы:
page.on('response', async (response) => {
if (response.url().endsWith('.json')) {
const data = await response.json();
console.log('Получен JSON:', data);
}
});
Это расширяет возможности тестирования, позволяя проверять динамическое поведение страниц и корректность данных API без изменения фронтенда.
Для автоматизации сложных сценариев полезно сочетать Puppeteer с другими библиотеками:
Пример комбинированного использования:
const cheerio = require('cheerio');
const content = await page.content();
const $ = cheerio.load(content);
const titles = $('h2').map((i, el) => $(el).text()).get();
console.log(titles);
Такой подход позволяет строить более комплексные тестовые сценарии: от взаимодействия с интерфейсом до проверки содержимого страницы и API.
Puppeteer предоставляет базовые методы типа click или
type, но можно расширять их через пользовательские функции.
Например, создание универсального метода ожидания и ввода текста с
проверкой:
async function typeAndWait(page, selector, text) {
await page.waitForSelector(selector, { visible: true });
await page.focus(selector);
await page.keyboard.type(text);
await page.waitForTimeout(200); // задержка для имитации реального ввода
}
await typeAndWait(page, '#search', 'puppeteer');
Такой подход снижает вероятность ошибок из-за асинхронной природы браузера и динамического DOM.
Puppeteer позволяет расширять тесты визуальными проверками. Основные методы:
await page.screenshot({ path: 'screenshot.png', fullPage: true });
await page.pdf({ path: 'page.pdf', format: 'A4' });
Для комплексного визуального тестирования используют сторонние библиотеки:
Пример интеграции с Pixelmatch:
const fs = require('fs');
const pixelmatch = require('pixelmatch');
const { PNG } = require('pngjs');
const img1 = PNG.sync.read(fs.readFileSync('baseline.png'));
const img2 = PNG.sync.read(fs.readFileSync('current.png'));
const { width, height } = img1;
const diff = new PNG({ width, height });
pixelmatch(img1.data, img2.data, diff.data, width, height, { threshold: 0.1 });
fs.writeFileSync('diff.png', PNG.sync.write(diff));
Это позволяет автоматически проверять визуальные регрессии при изменении интерфейса.
С помощью расширений Puppeteer можно автоматизировать полноценные сценарии:
Пример эмуляции мобильного устройства:
const iPhone = puppeteer.devices['iPhone 12'];
await page.emulate(iPhone);
await page.goto('https://example.com');
Расширения и плагины позволяют комбинировать все эти возможности, создавая мощные и надежные автоматизированные тесты.
Хотя Puppeteer ориентирован на Chromium, расширения дают возможность работать с другими движками, такими как Firefox:
const puppeteer = require('puppeteer-firefox');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
})();
Это важно для кросс-браузерного тестирования и проверки совместимости интерфейсов.
Расширение функциональности Puppeteer позволяет строить тесты, которые выходят далеко за рамки базовой автоматизации кликов и ввода. Использование плагинов, перехват сетевых запросов, интеграция с внешними библиотеками, визуальное тестирование и эмуляция устройств создают полноценный инструментарий для профессионального тестирования веб-приложений.