Puppeteer — это библиотека Node.js, предоставляющая высокий уровень управления браузером Chrome или Chromium через API. Она позволяет автоматизировать браузерные действия: навигацию, заполнение форм, снятие скриншотов, генерацию PDF, тестирование пользовательского интерфейса и взаимодействие с элементами страницы. Puppeteer используется в тестировании как альтернатива Selenium, обладая высокой скоростью и интеграцией с современными фреймворками JavaScript.
Установка Puppeteer выполняется через npm:
npm install puppeteer
По умолчанию Puppeteer скачивает последнюю стабильную версию Chromium.
Для экономии места или использования существующего браузера можно
настроить параметр executablePath при запуске.
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();
Puppeteer предоставляет методы для навигации и управления вкладками. Основные методы:
page.goto(url, options) — загрузка страницы с опциональными
параметрами ожидания;
page.waitForSelector(selector) — ожидание появления
элемента в DOM;
page.reload(options) — перезагрузка страницы;
page.url() — получение текущего URL.
Пример ожидания элементов и взаимодействия с ними:
await page.goto('https://example.com/login');
await page.type('#username', 'user123');
await page.type('#password', 'securepass');
await page.click('#submit');
await page.waitForNavigation();
Метод waitForSelector особенно важен для динамических
страниц, где элементы могут загружаться асинхронно через JavaScript.
Для тестирования форм Puppeteer поддерживает:
page.type(selector, text, options) — ввод текста;
page.click(selector, options) — клик по элементу;
page.select(selector, values) — выбор опции в
<select>;
page.evaluate(pageFunction, …args) — выполнение
произвольного JavaScript на странице.
События браузера можно отслеживать через page.on, например:
page.on('console', msg => console.log('PAGE LOG:', msg.text()));
page.on('response', response => console.log(`Response: ${response.url()} ${response.status()}`));
Это позволяет анализировать сетевой трафик и вывод консоли при автоматизированных тестах.
Puppeteer предоставляет инструменты визуальной проверки интерфейса:
await page.screenshot({ path: 'screenshot.png', fullPage: true });
await page.pdf({ path: 'page.pdf', format: 'A4' });
Параметр fullPage: true позволяет захватить всю страницу
целиком. PDF поддерживает настройку размеров, полей и ориентации.
Puppeteer поддерживает эмуляцию мобильных устройств, геолокации, сетевых условий и пользовательских сценариев:
const iPhone = puppeteer.devices['iPhone 12'];
await page.emulate(iPhone);
await page.setGeolocation({ latitude: 55.751244, longitude: 37.618423 });
await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)');
Для тестирования медленных сетей можно использовать:
await page.emulateNetworkConditions(puppeteer.networkConditions['Slow 3G']);
Эмуляция устройств критически важна при тестировании адаптивного дизайна и поведения приложений на разных платформах.
Puppeteer позволяет работать с DOM как через селекторы, так и через XPath:
const element = await page.$('#elementId'); // по CSS-селектору
const elements = await page.$$('div.item'); // массив элементов
const elementByXPath = await page.$x('//div[@class="item"]');
Методы для взаимодействия с элементами:
element.click() — клик по элементу;
element.type(‘text’) — ввод текста;
element.hover() — наведение курсора;
element.screenshot() — скриншот отдельного элемента.
page.evaluate позволяет выполнять сложные манипуляции с
DOM:
const innerText = await page.evaluate(el => el.innerText, element);
Puppeteer предоставляет возможность перехвата и анализа сетевых запросов:
await page.setRequestInterception(true);
page.on('request', request => {
if (request.url().endsWith('.png')) {
request.abort(); // блокировка изображений
} else {
request.continue();
}
});
Перехват запросов полезен для тестирования API, анализа производительности и эмуляции ошибок сервера.
Puppeteer идеально подходит для сценарного тестирования:
async function loginTest() {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com/login');
await page.type('#username', 'user123');
await page.type('#password', 'securepass');
await page.click('#submit');
await page.waitForSelector('#welcomeMessage');
const welcomeText = await page.$eval('#welcomeMessage', el => el.textContent);
console.log(welcomeText);
await browser.close();
}
loginTest();
Каждый тест можно интегрировать с Jest, Mocha или другими фреймворками для автоматизации и отчетности.
Puppeteer поддерживает работу с cookies, localStorage и sessionStorage:
await page.setCookie({ name: 'session', value: 'abc123' });
const cookies = await page.cookies();
console.log(cookies);
Можно сохранять состояние между запусками для тестирования аутентификации и сложных сценариев:
const fs = require('fs');
await fs.promises.writeFile('cookies.json', JSON.stringify(cookies));
const savedCookies = JSON.parse(await fs.promises.readFile('cookies.json'));
await page.setCookie(...savedCookies);
Для масштабного тестирования Puppeteer позволяет запускать несколько экземпляров браузера:
const browsers = await Promise.all([
puppeteer.launch(),
puppeteer.launch(),
puppeteer.launch()
]);
const pages = await Promise.all(browsers.map(browser => browser.newPage()));
Такой подход ускоряет нагрузочные тесты и проверку работы приложения в разных условиях.
С помощью Puppeteer можно сохранять артефакты тестов (скриншоты, PDF, логи) в облачные хранилища, такие как AWS S3 или Google Cloud Storage:
const { Storage } = require('@google-cloud/storage');
const storage = new Storage();
const bucket = storage.bucket('my-bucket');
await bucket.upload('screenshot.png', { destination: 'tests/screenshots/screenshot.png' });
Интеграция с облаком позволяет централизованно хранить результаты тестов, вести историю изменений и использовать их для CI/CD процессов.
headless: true для CI/CD и headless:
false при локальной отладке.
try/catch для обработки
ошибок.
page.setDefaultTimeout и
page.setDefaultNavigationTimeout.
Puppeteer предоставляет полный инструментальный набор для тестирования веб-приложений, эмуляции пользовательских сценариев, работы с API и визуальной проверки интерфейсов, делая его мощным и гибким решением для автоматизации на JavaScript.