Puppeteer — это библиотека Node.js, предоставляющая высокоуровневый API для управления браузером Chromium или Chrome через протокол DevTools. Для работы с Puppeteer необходимо установить пакет:
npm install puppeteer
Создание экземпляра браузера и открытие страницы выполняется через асинхронные функции:
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
})();
Ключевые моменты:
headless: true — запуск без визуального интерфейса.
page.goto(url) — загрузка страницы по URL.
await.
Puppeteer позволяет выполнять любые действия на странице: клики, ввод текста, навигацию между страницами и проверку состояния элементов.
Пример навигации и клика по элементу:
await page.click('#submit-button'); // Клик по кнопке
await page.type('#username', 'testuser'); // Ввод текста
await page.waitForSelector('.result'); // Ожидание появления элемента
Особенности работы с элементами:
page.(selector) < /code > —возвращаетпервыйэлементпоселектору. < /li > < li > < code > page.$(selector)
— возвращает массив всех элементов.
page.evaluate() — выполнение JS-кода в контексте страницы.
const title = await page.evaluate(() => document.title);
Для организации тестов и обработки результатов важно структурировать данные. Puppeteer не хранит данные автоматически, поэтому их нужно собирать и структурировать вручную.
Примеры структурирования данных:
const pageData = {
url: 'https://example.com',
title: '',
links: [],
};
pageData.title = await page.evaluate(() => document.title);
pageData.links = await page.evaluate(() =>
Array.from(document.querySelectorAll('a')).map(a => a.href)
);
const sites = [
{ url: 'https://site1.com', title: '', status: '' },
{ url: 'https://site2.com', title: '', status: '' }
];
for (const site of sites) {
await page.goto(site.url);
site.title = await page.evaluate(() => document.title);
site.status = await page.evaluate(() => document.readyState);
}
Рекомендации по структуре данных:
После сбора данных важно их сохранить для анализа или использования в других тестах. Puppeteer работает с Node.js, поэтому удобно использовать файловую систему.
const fs = require('fs');
fs.writeFileSync('results.json', JSON.stringify(pageData, null, 2));
Особенности сериализации:
JSON.stringify(obj, null, 2) делает вывод читаемым для
человека.
map или
reduce перед сохранением.
При парсинге нескольких страниц или элементов важно корректно обрабатывать асинхронность.
const urls = ['https://example1.com', 'https://example2.com'];
const results = await Promise.all(urls.map(async (url) => {
await page.goto(url);
const title = await page.evaluate(() => document.title);
return { url, title };
}));
Ключевые моменты:
Promise.all позволяет параллельно обрабатывать массив
страниц.
await необходима для последовательной
обработки данных, если важен порядок.
При работе с Puppeteer часто встречаются ошибки загрузки страниц, отсутствующих элементов или таймауты. Для стабильности хранения данных нужно предусматривать обработку ошибок:
try {
await page.goto('https://example.com', { timeout: 5000 });
const title = await page.evaluate(() => document.title);
} catch (error) {
console.error('Ошибка загрузки страницы:', error);
}
Рекомендации:
waitForSelector.
Для больших проектов предпочтительно использовать базы данных для хранения результатов Puppeteer.
Пример с MongoDB:
const { MongoClient } = require('mongodb');
const client = new MongoClient('mongodb://localhost:27017');
await client.connect();
const db = client.db('puppeteer');
const collection = db.collection('pages');
await collection.insertMany(results);
Преимущества:
Эффективная организация данных Puppeteer предполагает:
Эта структура обеспечивает масштабируемость тестирования, упрощает анализ данных и интеграцию с системами автоматизации.