Короткий вердикт: Puppeteer — для веб-скрапинга, генерации PDF и автоматизации только в Chrome. Playwright — для кросс-браузерного E2E-тестирования: он управляет Chromium, Firefox и WebKit через единый API и включает собственный тест-ранер, автоожидание и trace viewer.
| Критерий | Puppeteer | Playwright |
|---|---|---|
| Браузеры | В первую очередь Chrome/Chromium, без WebKit/Safari | Chromium, Firefox и WebKit через единый API |
| Тест-ранер | Встроенного нет; обычно используют с Jest | Встроенный @playwright/test: проверки, параллельный запуск, повторы, трассировки |
| Ожидания | Часто нужны явные вызовы waitForSelector | Автоматически ждёт элементы перед действием |
| Отладка | slowMo, DevTools, скриншоты, логи консоли | Inspector, trace viewer, codegen |
| Загрузка браузера | npm install puppeteer скачивает Chrome for Testing | Отдельный шаг: npx playwright install |
| Скриншот из CLI | CLI-команды нет, только 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 полагается на нативные протоколы браузеров.
Матрица Поддержки Браузеров
| Функция | Puppeteer | Playwright |
|---|---|---|
| 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-пакетов не содержит браузер. Место на диске занимают браузерные бинарники, и инструменты различаются тем, какие браузеры они скачивают и в какой момент.
| Puppeteer | Playwright | |
|---|---|---|
| Браузеры, скачиваемые по умолчанию | Chrome for Testing и chrome-headless-shell | Chromium, отдельный 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' или executablePath | channel: '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
- Katalon Studio: Полноценная All-in-One Платформа для Автоматизации Тестирования
- Katalon Studio: Complete All-in-One Test Automation Platform
- Robot Framework: Mastering Keyword-Driven Test Automation - Comprehensive guide to Robot Framework’s keyword-driven approach for test…
- Robot Framework: Освоение Ключевого Подхода к Автоматизации Тестирования - Полное руководство по Robot Framework и его keyword-driven подходу…
- Testim & Mabl: AI-Powered Self-Healing Платформы Автоматизации Тестирования - Полное руководство по Testim и Mabl с self-healing и ML. Изучи…
- Альтернативы Postman 2025: Сравнение Bruno vs Insomnia vs Thunder Client - Всестороннее сравнение альтернатив Postman, включая Bruno,…
