Puppeteer и Playwright

Браузерная автоматизация строится вокруг программного управления движком рендеринга: запуск браузера, создание контекстов, управление страницами, выполнение JavaScript-кода, перехват сетевых запросов и имитация действий пользователя. В экосистеме Node.js ключевыми инструментами стали Puppeteer и Playwright, ориентированные на контроль Chromium и кросс-браузерную автоматизацию.

Обе библиотеки предоставляют высокоуровневый API поверх протокола DevTools (или его расширений), позволяя управлять браузером без графического интерфейса либо в полноценном режиме.


Puppeteer: архитектура и модель работы

Puppeteer — библиотека, разработанная Google для управления Chromium через DevTools Protocol.

Основные характеристики Puppeteer

  • ориентация на Chromium и Chrome
  • управление через Chrome DevTools Protocol (CDP)
  • встроенная загрузка совместимой версии Chromium
  • оптимизация под headless-режим
  • низкоуровневая близость к внутренностям браузера

Архитектура взаимодействия

Puppeteer работает по следующей цепочке:

Node.js → Puppeteer API → DevTools Protocol → Chromium

Каждое действие (клик, навигация, ввод текста) транслируется в команды CDP.


Playwright: расширенная кросс-браузерная модель

Playwright разработан Microsoft как эволюция подхода автоматизации браузеров.

Ключевые особенности Playwright

  • поддержка Chromium, Firefox и WebKit
  • единый API для всех движков
  • изолированные browser contexts
  • встроенные механизмы ожиданий
  • расширенные возможности сетевого контроля

Архитектура Playwright

Playwright использует собственный протокол поверх браузеров:

Node.js → Playwright API → драйверы браузеров → Chromium / Firefox / WebKit

В отличие от Puppeteer, Playwright абстрагирует различия движков, обеспечивая одинаковое поведение сценариев.


Установка и инициализация

Puppeteer

npm install puppeteer

При установке загружается совместимая версия Chromium.

Playwright

npm install playwright

Дополнительно устанавливаются браузеры:

npx playwright install

Запуск браузера

Puppeteer: запуск Chromium

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();
})();

Playwright: запуск браузера

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({
    headless: true
  });

  const page = await browser.newPage();
  await page.goto('https://example.com');

  await browser.close();
})();

Контексты браузера и изоляция

Puppeteer

В Puppeteer контекст создаётся автоматически через browser.newPage(), но поддерживаются инкогнито-контексты:

const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();

Playwright

Playwright делает концепцию контекста базовой:

const context = await browser.newContext();
const page = await context.newPage();

Каждый контекст:

  • изолирует cookies
  • разделяет localStorage
  • не пересекает сессии

Это важно для параллельного тестирования и мультиаккаунтных сценариев.


Навигация и управление страницей

Открытие URL

await page.goto('https://example.com');

Ожидание загрузки

Puppeteer:

await page.goto('https://example.com', {
  waitUntil: 'networkidle2'
});

Playwright:

await page.goto('https://example.com', {
  waitUntil: 'networkidle'
});

Работа с DOM и селекторами

Поиск элементов

Puppeteer:

const button = await page.$('button');
await button.click();

Playwright:

await page.click('button');

Playwright использует автоматическое ожидание элементов, снижая необходимость ручных waitForSelector.


Ввод текста и пользовательские действия

Puppeteer

await page.type('#input', 'Hello world');

Playwright

await page.fill('#input', 'Hello world');

Playwright дополнительно поддерживает:

  • keyboard
  • mouse
  • touch
  • drag-and-drop сценарии

Ожидания и синхронизация

Puppeteer

await page.waitForSelector('#result');

Часто требуется комбинировать ожидания вручную.

Playwright

await page.click('#button');
await page.waitForSelector('#result');

В Playwright большинство действий уже включает implicit wait, что уменьшает количество race condition.


Перехват сетевых запросов

Puppeteer

await page.setRequestInterception(true);

page.on('request', request => {
  if (request.url().includes('ads')) {
    request.abort();
  } else {
    request.continue();
  }
});

Playwright

await page.route('**/*', route => {
  if (route.request().url().includes('ads')) {
    route.abort();
  } else {
    route.continue();
  }
});

Playwright предоставляет более декларативный API маршрутизации.


Скриншоты и генерация PDF

Puppeteer

await page.screenshot({ path: 'screen.png' });

await page.pdf({
  path: 'file.pdf',
  format: 'A4'
});

Playwright

await page.screenshot({ path: 'screen.png' });

await page.pdf({ path: 'file.pdf' });

Выполнение JavaScript в контексте страницы

Puppeteer

const title = await page.evaluate(() => document.title);

Playwright

const title = await page.evaluate(() => document.title);

Playwright также поддерживает page.evaluateHandle для работы с DOM-объектами.


Работа с несколькими вкладками и параллелизм

Puppeteer

const page1 = await browser.newPage();
const page2 = await browser.newPage();

Playwright

const context = await browser.newContext();

const page1 = await context.newPage();
const page2 = await context.newPage();

Контекстная модель Playwright обеспечивает более строгую изоляцию параллельных сценариев.


Отладка и режим разработки

Puppeteer

  • headless: false
  • slowMo для замедления действий
puppeteer.launch({
  headless: false,
  slowMo: 50
});

Playwright

  • встроенный trace viewer
  • video recording
  • screenshots on failure
const context = await browser.newContext({
  recordVideo: { dir: 'videos/' }
});

Тестирование и интеграция

Puppeteer

Используется вместе с:

  • Jest
  • Mocha
  • custom test runners

Чаще применяется для:

  • парсинга данных
  • генерации PDF
  • скриншотов сайтов

Playwright

Имеет встроенный test runner:

npx playwright test

Поддерживает:

  • параллельное выполнение тестов
  • fixtures
  • retries
  • отчёты

Сетевые и браузерные события

Puppeteer

page.on('response', response => {
  console.log(response.url());
});

Playwright

page.on('response', response => {
  console.log(response.url());
});

Playwright расширяет событийную модель, добавляя события контекста и маршрутизации.


Типичные сценарии применения

Puppeteer

  • генерация PDF документов
  • скриншоты страниц
  • SEO-рендеринг
  • простая автоматизация Chromium

Playwright

  • end-to-end тестирование
  • кросс-браузерная проверка UI
  • сложные сценарии авторизации
  • параллельные тестовые среды
  • автоматизация с сетевыми подменами

Сравнение подходов

Браузерная поддержка

  • Puppeteer: Chromium-centric
  • Playwright: Chromium + Firefox + WebKit

API модель

  • Puppeteer: ближе к DevTools Protocol
  • Playwright: высокоуровневая абстракция

Синхронизация

  • Puppeteer: больше ручных ожиданий
  • Playwright: автоматическое ожидание действий

Изоляция

  • Puppeteer: инкогнито-контексты
  • Playwright: полноценные browser contexts

Внутренние механизмы ожидания

Playwright использует модель auto-waiting:

  • проверка видимости элемента
  • проверка стабильности DOM
  • ожидание интерактивности

Это снижает вероятность нестабильных тестов, характерных для классической автоматизации.


Сетевые стратегии и подмена данных

Playwright позволяет реализовать:

  • mock API
  • задержки ответов
  • симуляцию ошибок сети
await page.route('**/api/**', route =>
  route.fulfill({
    status: 200,
    body: JSON.stringify({ ok: true })
  })
);

Безопасность и контроль окружения

Автоматизация браузера требует строгого контроля:

  • изоляция сессий через контексты
  • очистка cookies и storage
  • управление permissions (геолокация, камера, микрофон)

Playwright:

const context = await browser.newContext({
  permissions: ['geolocation']
});

Производительность и масштабирование

При масштабной автоматизации важны:

  • повторное использование браузера
  • пул контекстов
  • ограничение числа страниц
  • управление памятью

Playwright лучше подходит для горизонтального масштабирования за счёт контекстной модели.


Интеграция с CI/CD

Типичные сценарии:

  • запуск headless тестов в Docker
  • генерация отчётов
  • параллельные прогонки

Playwright:

npx playwright test --workers=4

Puppeteer чаще интегрируется как вспомогательный инструмент в пайплайнах.


Диагностика ошибок

Playwright предоставляет:

  • trace viewer
  • видео выполнения
  • скриншоты на каждом шаге

Puppeteer требует ручной реализации логирования и сохранения состояния страницы.