Боль
Прия Раман пришла в команду автоматизации Aldervane в тот месяц, когда старый набор тестов ENGAGE отключили. Его последний отчёт до сих пор лежит в вики: 212 тестов на WebDriver, sleep(5) в 140 из них и хелпер clickWhenReady, который никто не мог объяснить. Погубили его две вещи, и ни одна из них не была тем, на что жаловались.
Тайминг. Классический скрипт WebDriver отправляет команды по HTTP и на каждую получает один ответ. Он не может знать, будет ли кнопка, которую он только что нашёл, всё ещё прикреплена к DOM через миллисекунду. Поэтому команды латают этот разрыв: sleep(2), потом sleep(5), когда CI медленнее, потом цикл повторов. Набор становится медленным и всё равно нестабильным — вы платите обе цены, между которыми пытались выбрать.
Накладные расходы. Каждому браузеру нужен свой бинарный драйвер со своим графиком релизов. Том Ачебе, который отвечает за CI-пайплайн, помнит тот вторник, когда автообновление Chrome на билд-агенте сделало весь прогон ENGAGE красным по причинам, не имевшим никакого отношения к продукту.

Описание
A cross-section of a small theatre made of layered cut paper. In front is the stage, its floor in coral; it stands for the browser. Behind it rises a wall with three separate rooms — one seen through a window, two through doorways — and in each room stands one person: one dressed in lavender, one in gold, one in dusty rose. Priya, the stage manager, with dark hair in a low bun, a black turtleneck and a headset, walks across the stage carrying a clipboard. The picture shows one browser holding several isolated browser contexts: the rooms share one building, but each is walled off from the others, just as each context keeps its own cookies and storage and nothing passes from one test's session into another. It does not show pages or tabs, and it does not show how many tests run at once.
Ответ Playwright на обе проблемы — архитектурный, поэтому на него стоит потратить десять минут, прежде чем писать хоть строку.
Механизм
Playwright — это Node-библиотека от Microsoft, которая управляет Chromium, Firefox и WebKit через одно двунаправленное соединение с браузерами, которые она сама поставляет и версионирует. Два следствия важнее остальных.
Он поставляет браузеры. npx playwright install скачивает сборки, закреплённые за вашей версией Playwright. Браузер — это строка в вашем lock-файле, а не свойство машины: прогон на ноутбуке Маркуса и прогон на билд-агенте Тома — один и тот же прогон. Начиная с Playwright 1.57 браузер семейства Chromium, который он скачивает, — это сборка Google Chrome for Testing, а не «сырая» сборка Chromium (запуски с окном используют chrome, headless-запуски — chrome-headless-shell); в 1.63 это распространилось на Linux на arm64. Ваши тесты не меняются. Меняется значок на панели инструментов.
Он знает страницу. Поскольку соединение постоянное, а протокол богатый, Playwright может проверить состояние элемента, прежде чем действовать. Перед кликом он ждёт, пока элемент будет прикреплён, видим, стабилен (не анимируется), способен получать события (ничем не перекрыт) и включён. Этот набор проверок называется готовностью к действию (actionability; u10 разбирает её по частям), и именно поэтому в правильном тесте Playwright нет никаких sleep.
Три объекта — три уровня изоляции
const browser = await chromium.launch(); // one process
const context = await browser.newContext(); // one sealed session
const page = await context.newPage(); // one tab in that session
- Браузер — процесс. Дорогой: сотни миллисекунд на запуск.
- Контекст — изолированная сессия: свои cookies, localStorage, разрешения и кеш. Дешёвый: миллисекунды. Это единица изоляции тестов.
- Страница — вкладка внутри контекста. Контекст может содержать несколько.
Описание
On the left is the test process — a worker of the @playwright/test runner. A single thick arrow labelled "one persistent connection" leads into a frame labelled "Browser — one process", to a box for the browser engine, marked expensive to start. From the engine, arrows lead to three highlighted boxes, Context A, B and C, each belonging to a different test (timesheet, invoice, approval) and each marked "own cookies + storage". Each context has arrows to its pages: A and C have one page each, B has two, the second marked "second tab". The scheme shows that the expensive object (the browser) is shared, while isolation lives one level down, in the contexts; pages are tabs inside a context and share its session. There are no separate driver binaries anywhere in the picture.
В тест-раннере эти три строки вы пишете редко. Раннер даёт каждому тесту свежие контекст и страницу, поэтому по умолчанию тесты не передают друг другу cookies и хранилище. Первый тест ENGAGE, с baseURL, заданным в конфиге (u03):
import { test, expect } from '@playwright/test';
test('an associate can open this week’s timesheet', async ({ page }) => {
await page.goto('/timesheets');
await page.getByRole('link', { name: 'This week' }).click();
await expect(page.getByRole('heading', { name: 'Weekly timesheet' })).toBeVisible();
});
Три строки, никаких ожиданий, и он работает на всех трёх движках. То, что лежит под этим, становится важным, как только в одном тесте нужны два человека — сотрудник, который отправляет табель, и Дэвид Оконкво, руководитель проекта, который его утверждает:
test('the manager sees what the associate submitted', async ({ browser }) => {
const associate = await browser.newContext({ storageState: 'playwright/.auth/associate.json' });
const manager = await browser.newContext({ storageState: 'playwright/.auth/manager.json' });
const associatePage = await associate.newPage();
const managerPage = await manager.newPage();
// associate submits, manager approves — u19 builds this properly
await associate.close();
await manager.close();
});
Два контекста, один браузер: два вошедших в систему пользователя, которые не видят cookies друг друга. Две страницы в одном контексте были бы одним и тем же пользователем в двух вкладках.
Библиотека и раннер — два разных продукта
playwright — библиотека автоматизации. @playwright/test — тест-раннер, построенный на ней: фикстуры, параллельность, повторы, репортеры, конфигурация. В этом курсе везде используется раннер. Фрагмент, который запускает браузер вручную и закрывает его в конце, — это библиотека: правильная форма для скрипта и обычно неправильная для набора тестов, где временем жизни и артефактами уже владеют фикстуры.
ИИ-инструменты вокруг него
Playwright в 2025–26 годах поставляет также инструменты для ИИ-ассистентов программирования. Начиная с 1.56 npx playwright init-agents генерирует для вашего ассистента (VS Code, Claude Code или opencode) три определения Test Agent: planner, который исследует приложение и пишет тест-план в Markdown, generator, который превращает план в файлы тестов, и healer, который запускает набор и пытается починить падающие тесты. Начиная с 1.62 MCP-сервер Playwright — он позволяет ассистенту управлять браузером через Playwright — входит в комплект и запускается как npx playwright mcp. Всё, что они производят, — обычный код Playwright, и весь этот курс — о том, как его оценивать. u04 показывает, где они стоят среди инструментов отладки; u27 разбирает ревью их результата на проекте.
Цена
Говорите об этом честно перед клиентом:
- Вы покупаете Node. Если инструменты проекта на Java или C#, у Playwright есть привязки, но экосистема, примеры и возможности раннера сильнее всего в TypeScript. У смешивания стеков реальная цена поддержки.
- Браузеры большие. Сотни мегабайт на движок. Изолированным от сети или ограниченным по пропускной способности билд-агентам нужна стратегия кеширования или контейнер (u25).
- Автоожидание устраняет одну причину нестабильности, а не все. Набор, в котором параллельные воркеры делят одну тестовую учётную запись, будет в Playwright нестабильным ровно так же, как и раньше.
- Фреймворк не спасёт плохой локатор. Всё дальнейшее зависит от запросов к элементам, которые переживают редизайн. Это u07 — час курса с наибольшей отдачей.
- Сгенерированные тесты появляются быстрее понимания. Healer, который сделал красный тест зелёным, либо починил тест, либо скрыл дефект продукта. Кто-то в команде должен уметь отличить одно от другого.
Что вы теперь знаете
Playwright избавляет от sleep, зная состояние страницы через одно постоянное соединение, и избавляет от возни с драйверами, поставляя закреплённые браузеры — для семейства Chromium с 1.57 это сборки Chrome for Testing. Браузер — дорогой процесс; контекст — дешёвая изолированная сессия, отделяющая один тест от другого; страницы — вкладки внутри контекста. Раннер выдаёт каждому тесту собственный контекст. ИИ-инструменты пишут код Playwright быстрее; правильным этот код они не делают.
