Короткий вердикт: Puppeteer — для веб-скрапинга, генерации PDF и автоматизации только в Chrome. Playwright — для кросс-браузерного E2E-тестирования: он управляет Chromium, Firefox и WebKit через единый API и включает собственный тест-ранер, автоожидание и trace viewer.

КритерийPuppeteerPlaywright
БраузерыВ первую очередь Chrome/Chromium, без WebKit/SafariChromium, Firefox и WebKit через единый API
Тест-ранерВстроенного нет; обычно используют с JestВстроенный @playwright/test: проверки, параллельный запуск, повторы, трассировки
ОжиданияЧасто нужны явные вызовы waitForSelectorАвтоматически ждёт элементы перед действием
ОтладкаslowMo, DevTools, скриншоты, логи консолиInspector, trace viewer, codegen
Загрузка браузераnpm install puppeteer скачивает Chrome for TestingОтдельный шаг: npx playwright install
Скриншот из CLICLI-команды нет, только page.screenshot()npx playwright screenshot <url> <файл>
Лучше всего подходитСкрапинг, генерация PDF, задачи только в ChromeКросс-браузерные наборы E2E-тестов

TL;DR

  • Выбирай Puppeteer для: веб-скрапинга, генерации PDF, Chrome-специфичной автоматизации, лёгких задач
  • Выбирай Playwright для: E2E-тестирования, кросс-браузерного покрытия, встроенного тест-ранера, продвинутой отладки
  • Базовые API похожи (Playwright создан бывшими инженерами Puppeteer), поэтому миграция несложная
  • У Playwright больше недельных загрузок в npm: около 117 млн против около 13 млн у Puppeteer за неделю 22–28 сентября 2026 года (npm: playwright, puppeteer)

Время чтения: 18 минут

Puppeteer и Playwright — два доминирующих Node.js-инструмента автоматизации браузеров, но они принципиально разошлись по назначению: Puppeteer превосходит в Chrome-специфичных задачах, тогда как Playwright стал ведущим фреймворком для кросс-браузерного E2E-тестирования. Puppeteer, выпущенный Google в 2017 году, широко используется для веб-скрапинга и задач с headless Chrome. Playwright создан Microsoft в 2020 году командой бывших инженеров Puppeteer. На сентябрь 2026 года у Playwright около 97 000 звёзд на GitHub, у Puppeteer — около 96 000. За неделю 22–28 сентября 2026 года npm зафиксировал около 117 млн загрузок playwright и около 76 млн загрузок @playwright/test против около 13 млн у puppeteer и около 25 млн у puppeteer-core (API реестра npm: playwright, @playwright/test, puppeteer, puppeteer-core). Playwright патчит браузеры на этапе сборки, чтобы дать единый API для Chromium, Firefox и WebKit. Puppeteer сосредоточен на Chrome и, начиная с v23, также поддерживает Firefox через WebDriver BiDi (FAQ Puppeteer).

Puppeteer и Playwright (как обсуждается в Playwright Comprehensive Guide: Multi-Browser Testing, Auto-Wait, and Trace Viewer Mastery) представляют современное поколение инструментов автоматизации браузеров, оба произошли от команд в Google и Microsoft соответственно. В то время как Puppeteer был пионером высокоуровневой автоматизации Chrome DevTools Protocol (CDP), Playwright (как обсуждается в Cypress Deep Dive: Architecture, Debugging, and Network Stubbing Mastery) появился как мультибраузерное решение, устраняющее ограничения Puppeteer. Этот всесторонний анализ сравнивает оба инструмента по архитектуре, функциям, производительности и практическим случаям использования для информирования вашей стратегии автоматизации.

Введение

Автоматизация браузеров значительно эволюционировала с эры WebDriver. Puppeteer (как обсуждается в Percy, Applitools & BackstopJS: Visual Regression Testing Solutions Compared), выпущенный Google в 2017 году, продемонстрировал, что прямой доступ к CDP может обеспечить более быструю и надежную автоматизацию, чем инструменты на основе WebDriver. Опираясь на эту основу, команда Playwright от Microsoft (многие бывшие контрибьюторы Puppeteer) запустила Playwright в 2020 году с амбициозными целями: истинная поддержка кросс-браузерности, улучшенные возможности отладки и более опинионированный фреймворк тестирования.

Ключевые Вопросы, на Которые Отвечает Эта Статья:

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

Исторический Контекст и Происхождение

Генезис Puppeteer

Выпуск: Январь 2017 командой Google Chrome

Первоначальные Цели:

  • Предоставить высокоуровневый API поверх Chrome DevTools Protocol
  • Включить автоматизацию headless Chrome
  • Поддержать веб-скрейпинг и генерацию PDF
  • Предложить более простую альтернативу Selenium

Эволюция:

  • Изначально только Chrome
  • Добавлена поддержка Firefox: начиная с v23.0.0 Puppeteer поддерживает стабильный Firefox, автоматизация идёт через WebDriver BiDi (FAQ Puppeteer)
  • Сосредоточен на Chrome/Chromium как основной цели
  • Поддерживается командой Google Chrome

Появление Playwright

Выпуск: Январь 2020 Microsoft

Предыстория Команды:

  • Возглавляется бывшими основными контрибьюторами Puppeteer
  • Инженеры, которые создали Puppeteer в Google

Философия Дизайна:

  • Кросс-браузерность с первого дня (Chromium, Firefox, WebKit)
  • Создан для тестирования, а не просто автоматизации
  • Комплексная трассировка и отладка
  • Автоматическое ожидание и устойчивость

Архитектурное Сравнение

Слой Протокола

Puppeteer:

API Puppeteer → Chrome DevTools Protocol → Chrome
              → WebDriver BiDi           → Firefox (по умолчанию), Chrome (опционально)

Playwright:

API Playwright → Протокол Playwright → Браузерные патчи
                                      → Chromium (CDP)
                                      → Firefox (Juggler)
                                      → WebKit (Пользовательский протокол)

Ключевое Различие: Playwright патчит браузеры во время сборки, обеспечивая согласованные API для всех браузеров. Puppeteer полагается на нативные протоколы браузеров.

Матрица Поддержки Браузеров

ФункцияPuppeteerPlaywright
Chromium✅ Полная поддержка✅ Полная поддержка
Chrome✅ Полная поддержка✅ Полная поддержка
Firefox✅ Поддерживается с v23, через WebDriver BiDi (pptr.dev)✅ Полная поддержка
WebKit/Safari❌ Не поддерживается✅ Полная поддержка
Edge✅ Через Chromium✅ Полная поддержка
ПротоколCDP для Chrome, WebDriver BiDi для FirefoxПользовательские патчи
Версионирование БраузераКаждый релиз привязан к конкретной версии Chrome for TestingКаждый релиз привязан к конкретным сборкам браузеров

Установка и Настройка

Puppeteer:

npm install puppeteer
# Автоматически загружает Chrome for Testing

npm install puppeteer-core
# Без загрузки браузера, использует системный Chrome

Playwright:

npm install playwright
npx playwright install  # Загружает все браузеры

npm install @playwright/test  # С test runner
npx playwright install chromium  # Один браузер

Что именно скачивает каждый инструмент и сколько места занимает, разобрано в разделе Размер установки: Puppeteer vs Playwright.

API и Опыт Разработчика

Базовая Автоматизация

Puppeteer:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();

    await page.goto('https://example.com');
    await page.type('#username', 'testuser');
    await page.type('#password', 'password123');
    await page.click('button[type="submit"]');

    await page.waitForSelector('.dashboard');
    const title = await page.title();
    console.log('Заголовок страницы:', title);

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

Playwright:

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

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

    await page.goto('https://example.com');
    await page.fill('#username', 'testuser');
    await page.fill('#password', 'password123');
    await page.click('button[type="submit"]');

    await page.waitForSelector('.dashboard');
    const title = await page.title();
    console.log('Заголовок страницы:', title);

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

Схожесть API: два скрипта почти идентичны. Базовые API близки, потому что Playwright создан бывшими инженерами Puppeteer, но Playwright предлагает дополнительные функции.

Продвинутые Селекторы

Puppeteer:

// CSS селекторы
await page.click('#submit-button');
await page.click('.form-control:nth-child(2)');

// XPath
await page.waitForXPath('//button[contains(text(), "Отправить")]');
const [button] = await page.$x('//button[@type="submit"]');
await button.click();

// Пользовательский текстовый селектор (через page.evaluate)
await page.evaluate(() => {
    const button = Array.from(document.querySelectorAll('button'))
        .find(b => b.textContent.includes('Отправить'));
    button.click();
});

Playwright:

// CSS селекторы
await page.click('#submit-button');

// Текстовый селектор
await page.click('text=Отправить');
await page.click('button:has-text("Отправить")');

// XPath
await page.click('xpath=//button[@type="submit"]');

// Продвинутые селекторы
await page.click('button >> text=Отправить');  // Цепочка
await page.click('button:right-of(:text("Пользователь"))');  // На основе layout
await page.click('button:below(#header)');
await page.click('button:near(.form-group)');

// На основе ролей (доступность)
await page.click('role=button[name="Отправить"]');

Победитель: Playwright - более богатый движок селекторов с селекторами на основе layout и ролей.

Поведение Автоматического Ожидания

Puppeteer:

// Часто необходимо ручное ожидание
await page.waitForSelector('#result');
await page.waitForFunction(() => document.querySelector('#result').textContent !== '');

// Ожидание бездействия сети
await page.goto('https://example.com', { waitUntil: 'networkidle2' });

// Пользовательские ожидания
await page.waitForTimeout(1000);
await page.waitForFunction(
    () => window.appReady === true,
    { timeout: 5000 }
);

Playwright:

// Встроенное автоматическое ожидание
await page.click('#result');  // Автоматически ждет элемент

// Авто-ожидание для:
// - Элемент виден
// - Элемент стабилен (не анимируется)
// - Элемент включен
// - Элемент получает события

// Все еще поддерживает явные ожидания
await page.waitForSelector('#result', { state: 'visible' });
await page.waitForLoadState('networkidle');
await page.waitForFunction(() => window.appReady === true);

Победитель: Playwright - более агрессивное и интеллектуальное автоматическое ожидание уменьшает потребность в явных ожиданиях.

Множественные Контексты и Параллельное Выполнение

Puppeteer:

const browser = await puppeteer.launch();

// Инкогнито контексты
const context1 = await browser.createIncognitoBrowserContext();
const context2 = await browser.createIncognitoBrowserContext();

const page1 = await context1.newPage();
const page2 = await context2.newPage();

await Promise.all([
    page1.goto('https://example.com'),
    page2.goto('https://example.com')
]);

// Изолированное хранилище, cookies, сессии

Playwright:

const browser = await chromium.launch();

// Контексты браузера (как инкогнито)
const context1 = await browser.newContext({
    viewport: { width: 1920, height: 1080 },
    userAgent: 'Пользовательский User Agent',
    locale: 'ru-RU',
    timezoneId: 'Europe/Moscow',
    permissions: ['geolocation']
});

const context2 = await browser.newContext({
    viewport: { width: 375, height: 667 },  // Мобильный
    isMobile: true,
    hasTouch: true
});

// Параллельное выполнение с разными контекстами
const [page1, page2] = await Promise.all([
    context1.newPage(),
    context2.newPage()
]);

Победитель: Playwright - больше опций конфигурации для контекстов, лучшая поддержка мультиконтекста.

Кросс-Браузерное Тестирование

Согласованность Браузера

Puppeteer:

  • Chrome/Chromium: Отлично, нативная поддержка
  • Firefox: Поддерживается с v23 через WebDriver BiDi; часть возможностей Puppeteer через BiDi недоступна (список)
  • Safari: Не поддерживается

Playwright:

const { chromium, firefox, webkit } = require('playwright');

async function testAllBrowsers() {
    for (const browserType of [chromium, firefox, webkit]) {
        const browser = await browserType.launch();
        const page = await browser.newPage();

        await page.goto('https://example.com');
        // Одинаковый API для всех браузеров
        await page.screenshot({ path: `screenshot-${browserType.name()}.png` });

        await browser.close();
    }
}

Реальный Кросс-Браузерный Тест:

const { test, expect } = require('@playwright/test');

test.describe('Кросс-браузерный логин', () => {
    test('должен успешно войти', async ({ page, browserName }) => {
        await page.goto('https://example.com/login');
        await page.fill('#username', 'testuser');
        await page.fill('#password', 'password123');
        await page.click('button[type="submit"]');

        await expect(page.locator('.dashboard')).toBeVisible();

        // Специфичные для браузера проверки
        if (browserName === 'webkit') {
            // Проверки специфичные для Safari
            await expect(page.locator('.webkit-notice')).toBeVisible();
        }
    });
});

Победитель: Playwright - комплексная, согласованная поддержка кросс-браузерности является основной функцией.

Перехват Сети и Мокирование

Перехват Запросов

Puppeteer:

await page.setRequestInterception(true);

page.on('request', (request) => {
    if (request.resourceType() === 'image') {
        request.abort();
    } else if (request.url().includes('/api/users')) {
        request.respond({
            status: 200,
            contentType: 'application/json',
            body: JSON.stringify([
                { id: 1, name: 'Тестовый Пользователь' }
            ])
        });
    } else {
        request.continue();
    }
});

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

Playwright:

// Перехват на основе маршрутов
await page.route('**/*.{png,jpg,jpeg}', route => route.abort());

await page.route('**/api/users', route => {
    route.fulfill({
        status: 200,
        contentType: 'application/json',
        body: JSON.stringify([
            { id: 1, name: 'Тестовый Пользователь' }
        ])
    });
});

// Или изменить запросы
await page.route('**/api/**', route => {
    const headers = route.request().headers();
    headers['Authorization'] = 'Bearer fake-token';
    route.continue({ headers });
});

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

Победитель: Playwright - более гибкая маршрутизация, встроенная запись HAR.

Интеграция с Фреймворком Тестирования

Puppeteer с Jest

// jest-puppeteer.config.js
module.exports = {
    launch: {
        headless: true,
        args: ['--no-sandbox']
    },
    browserContext: 'default'
};

// test.spec.js
describe('Тест Логина', () => {
    beforeAll(async () => {
        await page.goto('https://example.com');
    });

    it('должен отобразить форму логина', async () => {
        await expect(page).toMatch('Логин');
        const title = await page.title();
        expect(title).toBe('Логин - Example');
    });

    it('должен успешно войти', async () => {
        await page.type('#username', 'testuser');
        await page.type('#password', 'password123');
        await page.click('button[type="submit"]');
        await page.waitForSelector('.dashboard');

        const url = page.url();
        expect(url).toContain('/dashboard');
    });
});

Test Runner Playwright

// playwright.config.js
module.exports = {
    testDir: './tests',
    timeout: 30000,
    retries: 2,
    use: {
        headless: true,
        viewport: { width: 1920, height: 1080 },
        screenshot: 'only-on-failure',
        video: 'retain-on-failure',
        trace: 'on-first-retry'
    },
    projects: [
        { name: 'chromium', use: { browserName: 'chromium' } },
        { name: 'firefox', use: { browserName: 'firefox' } },
        { name: 'webkit', use: { browserName: 'webkit' } }
    ]
};

// test.spec.js
const { test, expect } = require('@playwright/test');

test.describe('Тест Логина', () => {
    test.beforeEach(async ({ page }) => {
        await page.goto('https://example.com');
    });

    test('должен отобразить форму логина', async ({ page }) => {
        await expect(page.locator('h1')).toHaveText('Логин');
        await expect(page).toHaveTitle('Логин - Example');
    });

    test('должен успешно войти', async ({ page }) => {
        await page.fill('#username', 'testuser');
        await page.fill('#password', 'password123');
        await page.click('button[type="submit"]');

        await expect(page).toHaveURL(/.*dashboard/);
        await expect(page.locator('.dashboard')).toBeVisible();
    });
});

Победитель: Playwright - опинионированный test runner со встроенными утверждениями, параллелизацией, повторами, скриншотами, видео и трассировками.

Возможности Отладки

Отладка Puppeteer

// Slowmo
const browser = await puppeteer.launch({
    headless: false,
    slowMo: 100  // Замедлить на 100мс
});

// Devtools
const browser = await puppeteer.launch({
    headless: false,
    devtools: true
});

// Скриншоты
await page.screenshot({ path: 'screenshot.png', fullPage: true });

// Логи консоли
page.on('console', msg => console.log('ЛОГ СТРАНИЦЫ:', msg.text()));

// Ошибки страницы
page.on('pageerror', error => console.log('ОШИБКА СТРАНИЦЫ:', error.message));

Отладка Playwright

// Inspector (интерактивная отладка)
// Установить переменную окружения
// PWDEBUG=1 npm test

// Или в коде
await page.pause();  // Открывает inspector

// Trace viewer (отладка с перемоткой времени)
const context = await browser.newContext({
    recordVideo: { dir: 'videos/' },
    recordTrace: { dir: 'traces/' }
});

// Просмотр трассировки: npx playwright show-trace trace.zip

// Codegen (запись действий)
// npx playwright codegen https://example.com

// Режим headed со slomo
const browser = await chromium.launch({
    headless: false,
    slowMo: 1000
});

Победитель: Playwright - trace viewer обеспечивает отладку с перемоткой времени, inspector более отполирован.

Размер установки: Puppeteer vs Playwright

Ни один из двух npm-пакетов не содержит браузер. Место на диске занимают браузерные бинарники, и инструменты различаются тем, какие браузеры они скачивают и в какой момент.

PuppeteerPlaywright
Браузеры, скачиваемые по умолчаниюChrome for Testing и chrome-headless-shellChromium, отдельный Chromium headless shell, Firefox и WebKit
Когда происходит загрузкаВо время npm i puppeteer (install-скрипт)Только при запуске npx playwright install
Размер по официальной документацииChrome for Testing: ~170 МБ macOS, ~282 МБ Linux, ~280 МБ Windows (pptr.dev)Пример для macOS: 281M chromium, 187M firefox, 180M webkit (playwright.dev)
Кэш браузеров по умолчанию~/.cache/puppeteer~/Library/Caches/ms-playwright (macOS), ~/.cache/ms-playwright (Linux), %USERPROFILE%\AppData\Local\ms-playwright (Windows)
Пропустить загрузкуPUPPETEER_SKIP_DOWNLOAD или установка puppeteer-coreНе запускать npx playwright install
Использовать уже установленный браузерchannel: 'chrome' или executablePathchannel: 'chrome' или channel: 'msedge'

Что скачивает Puppeteer

Согласно руководству по установке Puppeteer, при установке puppeteer автоматически скачивается свежая версия Chrome for Testing (~170 МБ на macOS, ~282 МБ на Linux, ~280 МБ на Windows) и бинарник chrome-headless-shell (начиная с v21.6.0). По умолчанию браузеры сохраняются в $HOME/.cache/puppeteer.

  • Загрузка может молча не произойти. То же руководство предупреждает: пакетные менеджеры, которые по умолчанию блокируют install-скрипты зависимостей (названы pnpm, Yarn Berry, Bun и Deno), пропускают загрузку браузера, и Puppeteer затем падает с ошибкой Could not find Chrome. Скачать браузер вручную можно командой npx puppeteer browsers install.
  • Пропустить намеренно. Задайте PUPPETEER_SKIP_DOWNLOAD (или skipDownload в конфигурационном файле) либо установите puppeteer-core, который не скачивает Chrome при установке. Расположение кэша меняется через PUPPETEER_CACHE_DIR или cacheDirectory (справочник по конфигурации).
  • Системный Chrome. С puppeteer-core передают executablePath или channel — во втором случае Puppeteer ищет обычную установку Chrome в известном системном расположении (LaunchOptions).
  • Firefox — по запросу. Для Firefox по умолчанию действует skipDownload: true; включите загрузку в конфигурационном файле и выполните npx puppeteer browsers install (руководство по конфигурации).
npm i puppeteer                               # пакет + Chrome for Testing + chrome-headless-shell
PUPPETEER_SKIP_DOWNLOAD=true npm i puppeteer  # только пакет, без загрузки браузера
npm i puppeteer-core                          # только библиотека, браузер не скачивается никогда
npx puppeteer browsers install                # скачать браузеры вручную
// puppeteer-core с Chrome, уже установленным в системе
const puppeteer = require('puppeteer-core');
const browser = await puppeteer.launch({ channel: 'chrome' });

Что скачивает Playwright

npm i -D playwright устанавливает только библиотеку. В документации библиотеки Playwright сказано, что браузеры нужно установить отдельно: командой npx playwright install либо добавив вспомогательные пакеты @playwright/browser-chromium, @playwright/browser-firefox и @playwright/browser-webkit, которые скачивают браузер во время npm install.

Согласно руководству по браузерам, npx playwright install без аргументов устанавливает браузеры по умолчанию. Playwright скачивает Chromium, WebKit и Firefox в каталог кэша, зависящий от ОС, и поставляет отдельный Chromium headless shell для headless-режима. В руководстве указано, что эти браузеры занимают «несколько сотен мегабайт» на диске, и приведён пример для macOS: 281M — chromium, 187M — firefox, 180M — webkit.

  • Установить меньше. npx playwright install chromium скачивает один браузер. --only-shell пропускает полный Chromium, если запуск только headless, а --no-shell пропускает headless shell.
  • Системный Chrome или Edge. Playwright может работать с Google Chrome и Microsoft Edge, уже имеющимися на машине, через опцию channel; по умолчанию он их не устанавливает.
  • Расположение кэша. PLAYWRIGHT_BROWSERS_PATH переносит кэш; PLAYWRIGHT_BROWSERS_PATH=0 кладёт бинарники в node_modules/playwright-core/.local-browsers.
  • Очистка. Playwright удаляет версии браузеров, которые больше не нужны ни одной установке Playwright; npx playwright uninstall удаляет браузеры текущей установки.
  • Предпросмотр без загрузки. npx playwright install --dry-run не выполняет установку и только печатает информацию: каждый браузер, путь установки и URL загрузки. Флаг определён в исходном коде CLI Playwright. Размеры он не выводит.
npm i -D playwright                       # только библиотека, без браузеров
npx playwright install                    # браузеры по умолчанию: Chromium, Firefox, WebKit
npx playwright install chromium           # один браузер
npx playwright install --only-shell       # только Chromium headless shell, без полного Chromium
npx playwright install --no-shell         # без Chromium headless shell
npx playwright install --dry-run          # показать, что будет установлено, ничего не скачивая
npx playwright install --list             # список браузеров всех установок Playwright
npx playwright uninstall                  # удалить браузеры текущей установки
// Google Chrome, уже установленный в системе
const { chromium } = require('playwright');
const browser = await chromium.launch({ channel: 'chrome' });   // или 'msedge'

Как измерить на своей машине

Цифры выше — примеры из документации, а сборки браузеров меняются с каждым релизом. Для конфигурации только с Chromium задокументированные значения у обоих инструментов одного порядка; объём у Playwright растёт при добавлении Firefox и WebKit. Реальные значения для своей ОС и версий можно получить так:

du -sh ~/.cache/puppeteer/*                 # браузеры Puppeteer (кэш по умолчанию)
du -hs ~/Library/Caches/ms-playwright/*     # браузеры Playwright, macOS
du -hs ~/.cache/ms-playwright/*             # браузеры Playwright, Linux
du -sh node_modules                         # только npm-пакеты (кэши браузеров по умолчанию лежат вне node_modules)
npx playwright install --dry-run            # что и куда скачает Playwright

Скриншоты из Node.js и из CLI

Обе библиотеки делают скриншоты методом page.screenshot(). Различие — в командной строке: у Playwright есть команда screenshot, у Puppeteer её нет.

Puppeteer (API)

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });

    await page.screenshot({ path: 'page.png' });                       // видимая область
    await page.screenshot({ path: 'full.png', fullPage: true });       // вся страница с прокруткой

    const heading = await page.waitForSelector('h1');
    await heading.screenshot({ path: 'h1.png' });                      // один элемент

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

Page.screenshot() и ElementHandle.screenshot() описаны в руководстве Puppeteer по скриншотам; fullPage указан в ScreenshotOptions.

Playwright (API)

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

(async () => {
    const browser = await chromium.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');

    await page.screenshot({ path: 'page.png' });                       // видимая область
    await page.screenshot({ path: 'full.png', fullPage: true });       // вся страница с прокруткой
    await page.locator('h1').screenshot({ path: 'h1.png' });           // один элемент

    const buffer = await page.screenshot();                            // без path: возвращает Buffer

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

Эти вызовы взяты из руководства Playwright по скриншотам.

CLI Playwright: скриншот без написания скрипта

# Синтаксис: npx playwright screenshot [options] <url> <filename>
npx playwright screenshot https://example.com example.png

# Вся страница с прокруткой
npx playwright screenshot --full-page https://example.com full.png

# Другой браузерный движок: cr/chromium, ff/firefox, wk/webkit
npx playwright screenshot -b webkit https://example.com webkit.png

# Эмуляция устройства и тёмная цветовая схема
npx playwright screenshot --device "iPhone 11" --color-scheme dark https://example.com mobile.png

# Дождаться элемента и таймаута (мс) перед снимком
npx playwright screenshot --wait-for-selector "h1" --wait-for-timeout 1000 https://example.com ready.png

# Все опции
npx playwright screenshot --help

Команда и её опции (--full-page, --wait-for-selector, --wait-for-timeout, -b/--browser, --device, --color-scheme) определены в исходном коде CLI Playwright, а npx playwright screenshot --help выводит их для установленной версии. Используемый браузер должен быть заранее установлен через npx playwright install.

Есть ли аналог у Puppeteer? Нет. У CLI puppeteer единственная команда — puppeteer browsers, она управляет загрузкой браузеров. Для скриншота пишут короткий Node.js-скрипт, как выше, и запускают его через node screenshot.js.

Матрица Решений

Выбирайте Puppeteer Если:

  • ✅ Вам нужна только поддержка Chrome/Chromium
  • ✅ Вы создаете веб-скрейперы
  • ✅ Вам нужна легковесная автоматизация
  • ✅ Вам нужно генерировать PDF или скриншоты
  • ✅ У вас существующая кодовая база Puppeteer
  • ✅ Вы предпочитаете минимальные абстракции

Выбирайте Playwright Если:

  • ✅ Вам нужно кросс-браузерное тестирование (Firefox, Safari)
  • ✅ Вы создаете E2E тестовые наборы
  • ✅ Вам нужен интегрированный test runner
  • ✅ Вам нужна продвинутая отладка (trace viewer)
  • ✅ Вам нужно автоматическое ожидание и повторы
  • ✅ Вам нужна эмуляция мобильных/планшетов
  • ✅ Вы начинаете новый проект

Заключение

И Puppeteer, и Playwright являются отличными инструментами автоматизации браузеров, каждый превосходит в разных сценариях. Puppeteer остается предпочтительным выбором для веб-скрейпинга, генерации PDF и автоматизации специфичной для Chrome, где его зрелость и простота сияют. Playwright, однако, появился как превосходное решение для комплексного E2E тестирования, предлагая подлинную поддержку кросс-браузерности, мощные возможности отладки и опинионированный фреймворк тестирования, который решает общие болевые точки.

Для новых проектов автоматизации тестирования преимущества Playwright—истинная поддержка кросс-браузерности, trace viewer, автоматическое ожидание и интегрированный test runner—делают его рекомендуемым выбором. Для скрейпинга, генерации PDF или автоматизации только Chrome легковесный подход и зрелая экосистема Puppeteer остаются привлекательными.

Хорошие новости: миграция между ними относительно проста благодаря схожести API, позволяя командам переключаться по мере развития потребностей.

Официальные ресурсы

See Also