Запускать все тесты против Chromium, Firefox и WebKit на каждый PR утраивает время CI без пропорционального прироста покрытия: большинство падений не специфичны для браузера. Различия которые реально важны между движками конкретны: рендеринг инпута даты, граничные случаи CSS flexbox, разрешения Clipboard API, поведение загрузки файлов. Здесь разобрано когда Chromium достаточно, как настроить многоуровневые браузерные проекты в playwright.config.ts, и как обрабатывать браузер-специфичную логику когда она нужна.
Три браузерных проекта
// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
],
});Запуск всех браузеров:
npx playwright testЗапуск одного браузера:
npx playwright test --project=webkitChromium, Firefox и WebKit: в чём разница
Chromium. Движок JavaScript V8, рендеринг Blink. Chrome и Edge используют Chromium. Около 65% десктопного веб-трафика в 2026 году. Основная цель. Firefox. Движок JavaScript SpiderMonkey, рендеринг Gecko. Около 5% десктопного трафика. Отличается поведением CSS в граничных случаях, рендерингом элементов форм, обработкой некоторых веб-API. WebKit. JavaScriptCore, рендеринг WebKit. Safari на Mac и iOS. iOS работает только на WebKit: все iOS-браузеры используют WebKit под капотом. Если среди пользователей есть владельцы iPhone (а они есть), тестирование WebKit обязательно.Что реально ломается при кросс-браузерном тестировании
Большинство веб-приложений работают одинаково во всех трёх движках. Важные различия:
CSS.gap в flexbox, subgrid, новые @container-запросы, backdrop-filter, некоторые цветовые функции: всё это немного отличается между движками или не поддерживается в старых версиях.
Инпут даты и времени. рендерится очень по-разному в разных браузерах. WebKit и Firefox имеют собственный нативный UI выбора даты.
Загрузка файлов. Диалог выбора файла отличается. setInputFiles() в Playwright обходит это, но обработка события filechooser различается.
Поведение скроллбара. WebKit на Mac скрывает скроллбары по умолчанию. Тесты которые кликают по координатам рядом со скроллбарами могут вести себя по-разному.
Clipboard API. navigator.clipboard требует разрешения пользователя. В каждом браузере под автоматизацией работает по-разному.
Элемент . Полная поддержка во всех современных браузерах, но различия в поведении в старых версиях движков.
WebRTC, WebSockets, Service Workers. Сейчас в целом согласованы, но исторически имели кросс-браузерные различия.
Стратегия кросс-браузерного тестирования: многоуровневый подход
Запуск всех тестов на всех браузерах утраивает время CI. Практичный подход: многоуровневый.
Уровень 1: каждый PR (только Chromium)
Полный регрессионный сьют, тесты фич и API-тесты.
Уровень 2: мерж в main (Chromium + Firefox + WebKit)
Smoke-тесты во всех браузерах и тесты в областях с известным кросс-браузерным риском: инпуты даты, загрузка файлов, CSS-зависимые взаимодействия.
Уровень 3: ночной запуск (все браузеры, полный сьют)
Полная кросс-браузерная регрессия.
// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';
const isCIFullRun = process.env.CROSS_BROWSER === 'true';
export default defineConfig({
projects: [
// Chromium запускается всегда
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
// Firefox и WebKit только в кросс-браузерном режиме
...(isCIFullRun ? [
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
] : []),
],
});# .github/workflows/tests.yml
- name: Run cross-browser tests
if: github.event_name == 'schedule' # Только по ночному расписанию
run: CROSS_BROWSER=true npx playwright testУстановка браузеров
Playwright скачивает браузерные бинарники отдельно. Установка всех трёх:
npx playwright installУстановка конкретных браузеров:
npx playwright install chromium firefox webkitВ CI используй Docker-образ который включает все браузеры:
- run: npx playwright install --with-deps--with-deps дополнительно устанавливает системные зависимости (шрифты, кодеки) которые нужны браузерам Playwright.
Обработка браузер-специфичного поведения в тестах
Когда тест должен вести себя по-разному в зависимости от браузера:
import { test, expect } from '@playwright/test';
test('date input behavior', async ({ page, browserName }) => {
await page.goto('/book-appointment');
if (browserName === 'webkit') {
// Нативный выбор даты в WebKit требует другого взаимодействия
await page.getByLabel('Date').fill('2026-06-15');
} else {
await page.getByLabel('Date').type('06/15/2026');
}
await expect(page.getByLabel('Date')).toHaveValue('2026-06-15');
});browserName принимает одно из значений: 'chromium', 'firefox', 'webkit'.
Пропуск теста в конкретном браузере:
test('uses clipboard API', async ({ page, browserName }) => {
test.skip(browserName === 'firefox', 'Clipboard API requires permissions in Firefox');
// ...
});Реальный браузер против эмуляции
Playwright запускается против реальных браузерных движков, не против симулированных окружений. WebKit-тесты работают против настоящего движка WebKit (того же который управляет Safari), а не против Chrome-имитирующего симулятора Safari.
Это важно: кросс-браузерные баги найденные в WebKit-проекте Playwright воспроизведутся в реальном Safari. Полной идентичности нет (Playwright использует слегка более новую сборку WebKit чем текущий Safari), но совпадения достаточно чтобы ловить реальные проблемы.
→ See also: Стратегии кросс-браузерного тестирования: когда и как тестировать в разных браузерах | Мобильная эмуляция в Playwright: тестирование адаптивности и сенсорного ввода | Параллельное выполнение в Playwright: workers, шарды и шардирование для ускорения