Puppeteer — это библиотека для Node.js, предоставляющая высокоуровневый API для управления браузером Chrome или Chromium через протокол DevTools. Она используется для автоматизации взаимодействий с веб-страницами, сбора данных, тестирования интерфейсов и анализа производительности.
Для работы с Puppeteer достаточно установить пакет через npm:
npm install puppeteer
По умолчанию Puppeteer загружает совместимую версию Chromium, что обеспечивает стабильность среды тестирования. В проектах, где требуется тестирование в реальном Chrome, можно использовать:
const browser = await puppeteer.launch({ executablePath: &
Запуск браузера и создание страницы
Запуск браузера осуществляется через метод
puppeteer.launch(). Создание новой вкладки выполняется с
помощью browser.newPage(). Пример базового кода:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();
Ключевое значение параметра headless — возможность запуска
браузера без графического интерфейса, что ускоряет выполнение тестов.
Навигация и взаимодействие с элементами
Для взаимодействия с элементами используется комбинация методов
page.() < /code>, < code > page.$()</code> и
<code>page.evaluate()</code>.</p>
<ul>
<li><strong>Выбор элемента и клик:</strong></li>
</ul>
<pre class="javascript"><code>const button = await
page.$('button.submit'); await button.click();
await page.type('input[name="username"]', 'testuser');
await page.type('input[name="password"]', 'password123');
await page.click('button[type="submit"]');
const content = await page.$eval('h1', el => el.textContent);
console.log(content);
$eval</code> позволяет выполнить
функцию в контексте страницы и
получить значение элемента.</p>
<h4 id="ожидание-элементов-и-событий">Ожидание элементов и
событий</h4>
<p>Для стабильного тестирования важно корректно обрабатывать
асинхронные
события:</p>
<ul>
<li><strong>Ожидание загрузки
страницы:</strong></li>
</ul>
<pre class="javascript"><code>await
page.goto('https://example.com', { waitUntil:
'networkidle2' });</code></pre>
<p>Параметр <code>networkidle2</code> гарантирует, что
все сетевые
запросы завершены, и страница готова к взаимодействию.</p>
<ul>
<li><strong>Ожидание конкретного
селектора:</strong></li>
</ul>
<pre class="javascript"><code>await
page.waitForSelector('.modal-dialog', { visible: true
});</code></pre>
<p>Это предотвращает ошибки, связанные с попыткой взаимодействия с
элементом, который еще не отображается на странице.</p>
<h4 id="скриншоты-и-pdf">Скриншоты и PDF</h4>
<p>Для визуальной проверки состояния страницы используются методы
<code>page.screenshot()</code> и
<code>page.pdf()</code>:</p>
<pre class="javascript"><code>await page.screenshot({ path:
'screenshot.png', fullPage: true });
await page.pdf({ path: 'page.pdf', format:
'A4' });</code></pre>
<p><code>fullPage: true</code> позволяет сохранить всю
страницу, а не
только видимую область.</p>
<h4 id="работа-с-множественными-страницами-и-вкладками">Работа с
множественными страницами и вкладками</h4>
<p>Puppeteer поддерживает управление несколькими вкладками и
окнами:</p>
<pre class="javascript"><code>const page2 = await
browser.newPage();
await
page2.goto('https://example.org');</code></pre>
<p>Можно передавать данные между страницами через контекст Node.js
или
локальное хранилище браузера.</p>
<h4 id="настройка-и-использование-прокси">Настройка и
использование
прокси</h4>
<p>Для тестирования поведения веб-приложения с разных IP-адресов
используется параметр <code>args</code> при
запуске:</p>
<pre class="javascript"><code>const browser = await
puppeteer.launch({
args: ['--proxy-server=http://my-proxy-server:8080']
});</code></pre>
<p>Это полезно при нагрузочном тестировании и обходе региональных
ограничений.</p>
<h4
id="тестирование-производительности-и-сбор-метрик">Тестирование
производительности и сбор метрик</h4>
<p>Puppeteer предоставляет доступ к <strong>Chrome DevTools
Protocol</strong>, что позволяет измерять
производительность:</p>
<pre class="javascript"><code>await page.tracing.start({
path: 'trace.json' });
// Действия на странице
await page.tracing.stop();</code></pre>
<p>Файл <code>trace.json</code> можно анализировать с
помощью Chrome
DevTools для выявления узких мест в рендеринге и загрузке
ресурсов.</p>
<h4 id="обработка-файлов-и-загрузка-ресурсов">Обработка файлов и
загрузка ресурсов</h4>
<p>Для тестирования форм с загрузкой файлов используется метод
<code>uploadFile</code>:</p>
<pre class="javascript"><code>const input = await
page.$('input[type=file]'); await
input.uploadFile('example.pdf');
Для скачивания ресурсов можно перехватывать сетевые запросы:
await page.setRequestInterception(true);
page.on('request', request => {
if (request.url().endsWith('.jpg')) request.abort();
else request.continue();
});
Puppeteer легко интегрируется с популярными тестовыми фреймворками:
describe('Example tests', () => {
let browser, page;
beforeAll(async () => {
browser = await puppeteer.launch({ headless: true });
page = await browser.newPage();
});
afterAll(async () => {
await browser.close();
});
test('Check page title', async () => {
await page.goto('https://example.com');
const title = await page.title();
expect(title).toBe('Example Domain');
});
});
Такая интеграция обеспечивает удобную организацию тестов, запуск в CI/CD и генерацию отчетов.
headless: true для ускорения тестов.
waitForTimeout, что
уменьшает вероятность случайных ошибок.
Puppeteer обеспечивает полный контроль над браузером, что делает его незаменимым инструментом для тестирования интерфейсов, анализа производительности и автоматизации задач в веб-разработке.