Playwright

19 июня 2026 · ~13 мин чтения

инструмент browser-automation тестирование qa веб

Playwright

Библиотека от Microsoft, которая управляет настоящим браузером (Chromium, Firefox, WebKit) из кода. То есть твой Python- или JS-скрипт открывает страницу, кликает по кнопкам, заполняет формы — как если бы за компьютером сидел человек, только в сто раз быстрее и без обедов.

История

Playwright появился в 2020 году в Microsoft. Ребят, которые его сделали, ты косвенно знаешь — это команда Андрея Лушникова и Пайю Юсуфа (Pavel Feldman). До 2019 года они работали в Google и сделали Puppeteer — первую массовую библиотеку для управления браузером через DevTools Protocol. Потом ушли в Microsoft и за пару лет написали Playwright с нуля.

Зачем нужен был ещё один такой инструмент, если Puppeteer уже был? Ответ скучный, но честный: Puppeteer умел управлять только Chromium. А компаниям нужно было гонять тесты в Chrome, Firefox и Safari — потому что бизнес теряет пользователей, если сайт у части людей сломан. Selenium умел во все браузеры, но был старый, медленный и капризный (мы про него ещё поговорим в разделе «Альтернативы»).

Вехи развития:
- Январь 2020 — первый публичный релиз Playwright для Node.js
- Сентябрь 2020 — добавили Python-биндинги (плюс .NET и Java чуть позже)
- 2021 — научили работать с WebKit (движок Safari) через свой форк
- 2022–2024 — взрывной рост популярности; стал стандартом для E2E-тестов в новых проектах
- 2025 — обогнал Cypress по числу скачиваний с npm в категории «E2E testing»

Сейчас Playwright — открытый, под лицензией Apache 2.0, репозиторий на github.com/microsoft/playwright. Разрабатывают активно: новый релиз примерно раз в месяц.

Любопытный факт

Playwright делает не «обычный» Firefox и WebKit — он пропатченный. У Firefox даже есть отдельный движок отладки Juggler, который Microsoft поддерживает специально для Playwright. Поэтому когда ты делаешь playwright install, он качает не системный Firefox, а свою сборку — она ведёт себя одинаково на всех машинах.

Что это такое

Если совсем коротко: Playwright — это дистанционный пульт от браузера. Браузер запускается отдельным процессом, а твой скрипт через специальный канал говорит ему: «открой страницу», «кликни тут», «введи такой-то текст», «дай мне HTML», «сделай скриншот».

Сам канал — это в основном Chrome DevTools Protocol (CDP) для Chromium и патченные аналоги для Firefox/WebKit. CDP — это то самое, через что работает встроенный DevTools у Chrome (когда ты жмёшь F12 и видишь панель отладки). Playwright использует тот же интерфейс, только из кода.

Что Playwright умеет:

Чем Playwright отличается от похожих штук:

Аналогии из жизни

Краш-тест-манекен на конвейере автозавода. Реальная машина, реальные кресла, реальные ремни — и манекен с датчиками вместо живого пассажира. Производитель прогоняет краш-тест сотни раз с разными скоростями, не убивая людей. Playwright — такой же манекен, только для сайтов: реальный браузер, реальная страница, а вместо живого юзера — твой скрипт. Прогнал бы ты вручную форму регистрации сто раз? А Playwright прогонит за пять минут и зафиксирует, на каком шаге что-то отвалилось.

Где ломается: настоящий пользователь смотрит на страницу глазами и решает по интуиции — «эта кнопка как-то странно подсвечена, не нажму». Манекен этого не видит — он не «понимает» дизайн. Если макет сломался, но сайт формально работает, Playwright не заметит.

Профессиональный таксист, который возит экзаменаторов ГАИ. Он знает маршрут наизусть, едет аккуратно, останавливается там, где надо, и всегда правильно показывает поворотники. Если экзаменатор скажет «теперь налево» — повернёт точно по правилам. Так Playwright «ездит» по сайту: знает маршрут, делает паузы, кликает в правильные кнопки.

Где ломается: живой таксист в нестандартной ситуации может объехать аварию или поговорить с пешеходом. Playwright — нет: если посреди формы вдруг выскочило неожиданное модальное окно «согласись с куками», скрипт может упасть, потому что в его «маршруте» этого окна нет.

Робот, который пишет тебе SMS с твоего телефона. Берёт устройство, разблокирует, открывает приложение, набирает текст, жмёт «отправить». Получатель видит обычное SMS — он не знает, что отправил его не ты, а робот. Так и сайт: получает обычные клики и обычные данные, не подозревая о коде.

Где ломается: у телефона есть Face ID, отпечаток пальца, поведенческие сенсоры. Если робот двигает пальцем слишком прямолинейно — телефон может задаться вопросом «это вообще человек?». То же делают и серьёзные сайты с защитой от ботов — отлавливают «слишком ровные» движения и клики. Это огромная отдельная тема, к ней вернёмся.

Как это работает

Внутри Playwright устроен как клиент-серверная архитектура.

Шаг 1. Установка. Когда ты ставишь Playwright (pip install playwright или npm install playwright), он сначала ставит саму библиотеку, потом ты запускаешь playwright install — он качает три собственноручно собранных браузера: Chromium, Firefox и WebKit. Каждый — мегабайт триста, итого в сумме около гигабайта. Хранятся в системном кэше (~/.cache/ms-playwright).

Шаг 2. Запуск браузера из кода.

from playwright.async_api import async_playwright

async with async_playwright() as p:
    browser = await p.chromium.launch(headless=True)
    page = await browser.new_page()
    await page.goto("https://example.com")
    title = await page.title()
    await browser.close()

Что происходит под капотом, пошагово:

  1. async_playwright() стартует подпроцесс — это Node.js-сервер, поставляемый внутри пакета. Да, даже в Python-биндингах работает Node-обвязка: вся логика управления браузером написана на TypeScript, а Python-код просто отправляет ей команды по WebSocket.
  2. p.chromium.launch() — Node-сервер форкает процесс Chromium с особыми флагами (--remote-debugging-pipe, --disable-blink-features=AutomationControlled и десятками других).
  3. browser.new_page() — отправляется команда CDP Target.createTarget, браузер создаёт новый таб и отвечает идентификатором.
  4. page.goto(url) — CDP-команда Page.navigate, плюс Playwright ставит «слушателей» на сетевые события, чтобы понять, когда страница «загрузилась».
  5. page.title() — выполняется JavaScript внутри страницы (document.title), результат возвращается обратно.
  6. browser.close() — корректное завершение процесса.

Шаг 3. Auto-waits — фишка номер один. В Selenium, если ты пишешь click(button), а кнопка ещё не появилась, ты получаешь ошибку и должен сам ставить sleep(2) или хитрые WebDriverWait. В Playwright это автоматика: каждое действие (click, fill, select_option) сначала ждёт, пока элемент станет видимым, кликабельным и не закрытым другим элементом. По умолчанию — до 30 секунд. Это убирает 80% «мерцающих» (flaky) тестов.

Шаг 4. Locators — фишка номер два. Раньше в Puppeteer и Selenium ты искал элементы по CSS-селектору один раз — получал ссылку и работал с ней. Если страница перерисовалась, ссылка устаревала. В Playwright locator — это «формула поиска», она вычисляется заново на каждом обращении. Поэтому даже динамические страницы (React, Vue, SPA) работают надёжно.

button = page.get_by_role("button", name="Подтвердить")
await button.click()  # перепроверит, что элемент есть, прямо сейчас

Шаг 5. Контекст и состояние. Можно сохранить cookies и localStorage после авторизации:

await context.storage_state(path="auth.json")
# а в следующем запуске
context = await browser.new_context(storage_state="auth.json")

И ты заходишь сразу авторизованным, не вводя логин-пароль каждый раз. Эта штука критична для скрейперов и для тестов, которым нужно много разных пользовательских ролей.

Грабли с headless

По умолчанию Playwright стартует браузер с флагом --headless=new (новый headless-режим Chrome). Многие сайты с серьёзной анти-бот защитой умеют его распознавать. Если тебе нужно «маскироваться под человека» — используй launch_persistent_context() с настоящим профилем пользователя, или библиотеку playwright-stealth, которая патчит самые палевные признаки.

Где встречается в обычной жизни

Где встречается в IT и бизнесе

Кто пользуется

По свежим бенчмаркам State of JS 2024, Playwright обогнал Cypress по доле «использую активно» — около 47% против 39%. Selenium держится за счёт legacy-проектов, у него ещё 28%, но новые проекты на него заводят редко.

В России Playwright популярен в Яндексе (тестирование Яндекс.Поиска и Маркета), Тинькофф/Т-Банке, Авито, Wildberries — всех крупных продуктовых командах с фронтендом на React/Vue.

Альтернативы и конкуренты

Тонкий момент про W3C

Selenium WebDriver — это стандарт W3C (как HTTP или CSS). Playwright и Puppeteer работают мимо стандарта, через приватные протоколы. С одной стороны — это даёт им скорость и контроль. С другой — формально это значит, что они «закрытее» Selenium-а. На практике большинство команд это не волнует.

Когда НЕ стоит использовать

Связанные понятия

Литература и источники

Где встретилось у меня

Вчера я планировал собрать сервис для red-team-тестирования собственной анти-бот защиты на квизах Marquiz. Subagent поднял подробное описание уже существующих в репозитории Новостроя-М модулей браузерной автоматизации — самый зрелый из них (агент ЯНДЕКСНЕДВИЖ_СРА) сделан на async Playwright с playwright-stealth, humanize-паузами, launch_persistent_context для сохранения профиля и батч-режимом с микропаузами и «отлучками», чтобы имитировать живого человека. Идея — переиспользовать движок: вместо отправки в Я.Недвижимость прогонять им же свои Marquiz-квизы и смотреть, ловит ли killbot такой трафик.

Краткое резюме