Эффективность работы Puppeteer во многом зависит от правильной конфигурации и оптимизации запуска браузера. Большие проекты с многочисленными сценариями тестирования требуют снижения времени старта браузера, уменьшения потребления ресурсов и повышения стабильности выполнения скриптов.
Puppeteer по умолчанию использует Chromium в режиме headless. Этот режим быстрее, чем полноценный графический интерфейс, однако не всегда обеспечивает одинаковое поведение с браузером в обычном режиме. Для точного воспроизведения поведения страницы можно комбинировать headless и headful режимы:
const browser = await puppeteer.launch({
headless: true, // true — без GUI, false — с GUI
args: [&
});
Ключевые аргументы:
–no-sandbox и –disable-setuid-sandbox —
ускоряют запуск в Linux-средах и предотвращают ошибки прав доступа.
–disable-dev-shm-usage — помогает избегать проблем с
ограничением памяти /dev/shm.
Запуск с дефолтным профилем Chromium каждый раз создает новое окружение, что увеличивает время старта. Для оптимизации можно использовать persisted user data directory:
const browser = await puppeteer.launch({
headless: true,
userDataDir: './tmp/user_data'
});
Преимущества:
Каждый новый browser.newPage() создает отдельную вкладку.
Массовое открытие страниц может существенно замедлить выполнение.
Рекомендуется:
page.close()).
const page = await browser.newPage();
// Выполнение действий
await page.close();
Для больших нагрузок создается пул страниц, где одновременно поддерживается фиксированное количество вкладок, что снижает накладные расходы на создание и уничтожение объектов.
Снижение нагрузки достигается за счет блокировки загрузки изображений, шрифтов и других медиа:
await page.setRequestInterception(true);
page.on('request', request => {
const resourceType = request.resourceType();
if (resourceType === 'image' || resourceType === 'font') {
request.abort();
} else {
request.continue();
}
});
Это особенно полезно для тестирования функциональности или API-интерфейсов, где визуальная часть не имеет значения.
Для ускорения работы можно использовать кэш браузера и хранить предварительно загруженные страницы:
await page.setCacheEnabled(true);
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
Особенности:
waitUntil: ‘domcontentloaded’ ускоряет старт взаимодействия
с DOM без ожидания всех ресурсов.
Запуск нескольких экземпляров браузера или страниц параллельно
значительно сокращает общее время тестирования. Puppeteer хорошо
работает с асинхронными конструкциями Promise.all:
await Promise.all(urls.map(async url => {
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'domcontentloaded' });
await page.close();
}));
Следует учитывать потребление памяти: слишком большое число одновременно работающих страниц может привести к зависаниям.
Для CI/CD-сред рекомендуется применять puppeteer-core с системным Chromium вместо стандартного пакета Puppeteer, что уменьшает размер проекта и ускоряет запуск.
const puppeteer = require('puppeteer-core');
const browser = await puppeteer.launch({
executablePath: '/usr/bin/chromium-browser',
headless: true
});
Для выявления узких мест необходимо отслеживать:
console.time(‘browserLaunch’)).
console.time(‘pageLoad’)).
process.memoryUsage()).
Эти данные позволяют корректно настроить пул страниц, лимит параллельных запусков и параметры запуска браузера.
puppeteer-core минимизируют размер и время установки.
Эти подходы в совокупности обеспечивают стабильный и быстрый запуск браузера, позволяя Puppeteer работать максимально эффективно даже в сложных тестовых сценариях.