Playwright
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 умеет:
- Запускать браузер в режиме headless (без окна) или headed (с видимым окном)
- Навигация: открыть URL, ждать пока страница загрузится, идти по ссылкам
- Действия пользователя: клики, ввод текста, прокрутка, hover, drag-and-drop
- Чтение DOM: найти элемент по CSS-селектору, тексту, role; прочитать атрибут, текст
- Перехват сети: видеть все HTTP-запросы со страницы, подменять их, блокировать
- Куки, localStorage, профили: сохранить состояние авторизации и подгружать его в следующих сессиях
- Скриншоты и видео: записать всё что происходит
- Эмулировать устройства: iPhone, разные viewport, геолокацию, временную зону
Чем Playwright отличается от похожих штук:
- vs Puppeteer — Puppeteer от Google и только под Chromium. Playwright кроссбраузерный.
- vs Selenium — Selenium работает через WebDriver (отдельный протокол W3C), старее и медленнее. Playwright напрямую с браузером, без посредника.
- vs Cypress — Cypress запускается внутри браузера, как часть страницы. Это удобно для разработчиков фронтенда, но накладывает ограничения (не работает с несколькими табами, плохо с iframe). 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()
Что происходит под капотом, пошагово:
async_playwright()стартует подпроцесс — это Node.js-сервер, поставляемый внутри пакета. Да, даже в Python-биндингах работает Node-обвязка: вся логика управления браузером написана на TypeScript, а Python-код просто отправляет ей команды по WebSocket.p.chromium.launch()— Node-сервер форкает процесс Chromium с особыми флагами (--remote-debugging-pipe,--disable-blink-features=AutomationControlledи десятками других).browser.new_page()— отправляется команда CDPTarget.createTarget, браузер создаёт новый таб и отвечает идентификатором.page.goto(url)— CDP-командаPage.navigate, плюс Playwright ставит «слушателей» на сетевые события, чтобы понять, когда страница «загрузилась».page.title()— выполняется JavaScript внутри страницы (document.title), результат возвращается обратно.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, которая патчит самые палевные признаки.
Где встречается в обычной жизни
- Когда ты заполняешь форму на сайте и видишь «проверка, не робот ли вы» — это reCAPTCHA или похожая система, которая отлавливает поведение, похожее на Playwright/Puppeteer. Иногда даже движок безопасности сайта прямо проверяет наличие
navigator.webdriverв браузере (свойство, которое автоматизированные движки исторически выставляли вtrue). - Когда сайт магазина показывает тебе цены, обновлённые «прямо сейчас» — за этим может стоять скрейпер на Playwright, который ходит по сайту поставщика каждые 10 минут, забирает прайс и кладёт в твою витрину.
- Когда ты получаешь скриншот веб-страницы в Telegram-боте «открыть ссылку и показать превью» — внутри почти всегда Playwright или Puppeteer.
- Когда крупный сайт раз в неделю кладётся на десять минут в час пик — иногда это не атака, а собственный QA-отдел, который запустил две тысячи Playwright-тестов параллельно и нагрузил инфраструктуру.
- Когда «Госуслуги» меняют дизайн, а старая Российская система отчётности продолжает работать — где-то посередине крутится Playwright-скрипт, который имитирует ручной вход и забирает данные через личный кабинет.
Где встречается в IT и бизнесе
- End-to-end тестирование (E2E) — основное и самое массовое применение. Команда фронтенда пишет десятки сценариев («пользователь регистрируется», «пользователь покупает товар», «пользователь восстанавливает пароль»), и эти сценарии гоняются автоматически перед каждым релизом. Это страховка от регрессий — когда «поправили одно, сломали другое».
- Web scraping и парсинг — забор данных с сайтов, у которых нет API. Цены конкурентов, новости, отзывы, объявления. Важно: с юридической точки зрения это серая зона, у каждого сайта свои правила в robots.txt и Terms of Service.
- RPA (Robotic Process Automation) — когда бизнес автоматизирует рутинную работу с внутренними системами, у которых нет API. Например, бухгалтер каждый месяц 200 раз заходит в банк-клиент и копирует выписки — это можно прогонять Playwright-скриптом.
- Анти-бот-тестирование (мой вчерашний кейс) — компания, у которой есть защита от ботов, сама запускает Playwright против своего сайта и смотрит: «А прорвётся? А с какого числа попыток включится Captcha? А поймает ли наша система этот шаблон поведения?» Это red-team-подход: «нападать на себя, чтобы узнать слабые места».
- Synthetic monitoring — постоянное «синтетическое» подкармливание сайта реальными сценариями, чтобы поймать падение раньше, чем заметят пользователи. Сервис типа Datadog Synthetics или Checkly как раз гоняет Playwright по твоему сайту каждые две минуты и алертит, если форма перестала отправляться.
Кто пользуется
- Microsoft — сам автор, использует во всём: VS Code тестируется Playwright-ом, Bing-поиск, Azure-кабинет.
- Cloudflare — гоняет Playwright против своей анти-бот системы Cloudflare Bot Management, проверяя её эффективность.
- GitHub (тоже часть Microsoft) — использует для E2E-тестов веб-интерфейса.
- Replit, Vercel, Netlify — все крупные «облачные IDE» и хостинги, у которых сложный UI.
- Disney+, Adobe — для тестирования стриминга и креативных приложений.
По свежим бенчмаркам State of JS 2024, Playwright обогнал Cypress по доле «использую активно» — около 47% против 39%. Selenium держится за счёт legacy-проектов, у него ещё 28%, но новые проекты на него заводят редко.
В России Playwright популярен в Яндексе (тестирование Яндекс.Поиска и Маркета), Тинькофф/Т-Банке, Авито, Wildberries — всех крупных продуктовых командах с фронтендом на React/Vue.
Альтернативы и конкуренты
- Puppeteer (Google, 2017). Плюсы: проще API, очень шустрый, отличная интеграция с Chrome DevTools. Минусы: только Chromium, нет встроенного запуска тестов, экосистема меньше.
- Selenium WebDriver (Apache, ~2008, стандарт W3C). Плюсы: работает почти везде, поддержка всех языков, проверен временем, есть Selenium Grid для распределённого запуска. Минусы: медленный, флапающие тесты, сложно настроить, API устаревший.
- Cypress (Cypress.io Inc., 2017). Плюсы: красивый dev-experience, time-travel debugging, мгновенно стартует, всё в одном окне. Минусы: только JS/TS, работает только в одном табе, не поддерживает несколько origin одновременно, не дружит с file uploads из-за iframe-архитектуры.
- WebDriverIO (open source, 2014). Плюсы: построен на WebDriver-стандарте, но с современным API, отлично интегрируется с мобильным тестированием через Appium. Минусы: меньше комьюнити, чем у Playwright.
Тонкий момент про W3C
Selenium WebDriver — это стандарт W3C (как HTTP или CSS). Playwright и Puppeteer работают мимо стандарта, через приватные протоколы. С одной стороны — это даёт им скорость и контроль. С другой — формально это значит, что они «закрытее» Selenium-а. На практике большинство команд это не волнует.
Когда НЕ стоит использовать
- Когда хватает HTTP-запроса. Если у сайта есть JSON API (видно во вкладке Network в DevTools), 90% задач решается через
requestsилиhttpxза секунду. Playwright в этом случае избыточен: ты тратишь 500 мегабайт памяти, ждёшь 3 секунды на запуск браузера — ради того, что можно сделать однимGET. Правило: «сначала проверь, можно ли без браузера». - Когда нужны миллионы операций в час. Playwright тяжёлый: один Chromium-инстанс — примерно 200–500 МБ памяти и одно CPU-ядро. Если тебе нужно прогнать миллион запросов за час, придётся арендовать кластер на десятки машин и грамотно распределять. Для таких задач часто хитрее реверс-инжинирить внутренний API сайта.
- Когда задача — «настоящий обход анти-бот защиты для нарушения ToS». Технически Playwright это умеет, но юридически и репутационно — рисковано. Серьёзные сайты бьют по IP, заводят дела за злоупотребление, продают данные о нарушителях друг другу. Граница между «тестирую свою защиту» и «атакую чужую» — иногда тонкая.
Связанные понятия
- Headless-браузер — режим работы браузера без графического окна. Уже разбирали отдельно. Playwright из коробки это умеет; нужно понимать, что headless ≠ «невидимый для сайта».
- Chrome DevTools Protocol (CDP) — основной канал общения Playwright с Chromium. Если хочется глубже понять «почему Playwright такой быстрый» — копать туда.
- Selenium WebDriver — старший брат, стандарт W3C, до сих пор используется в больших корпоративных тестовых проектах.
- Browser fingerprinting — техника определения «уникальности» браузера по сотням параметров (шрифты, canvas, WebGL, аудио). Понимать обязательно, если работаешь с анти-бот защитой.
- playwright-stealth — отдельная Python-библиотека, патчит самые палевные признаки автоматизации (
navigator.webdriver,chrome.runtimeи прочее). - CAPTCHA / reCAPTCHA / hCaptcha — последняя линия обороны от ботов. Существуют целые сервисы по решению капч живыми людьми за деньги (anti-captcha.com, 2captcha.com).
Литература и источники
- playwright.dev — официальная документация (en). Лучшая в индустрии: всё с примерами, поиск работает, видеоуроки встроены. Начать с раздела «Getting Started».
- github.com/microsoft/playwright — репозиторий и issue tracker. Очень полезно, если уткнулся в баг — почти всегда уже кто-то завёл тикет.
- Wikipedia (en) — статья «Playwright (software)». Краткая, без воды.
- «Testing Web Applications with Playwright» — книга Debbie O'Brien, 2023, на английском. Лучшее введение для тех, кто пишет тесты профессионально.
- YouTube-канал Playwright Official — короткие ролики по 5–10 минут на каждую фичу. Поищи «Playwright Tips and Tricks».
- Курс «Playwright Test Automation» на Test Automation University (бесплатный) — стартовый материал для QA-инженеров.
Где встретилось у меня
Вчера я планировал собрать сервис для red-team-тестирования собственной анти-бот защиты на квизах Marquiz. Subagent поднял подробное описание уже существующих в репозитории Новостроя-М модулей браузерной автоматизации — самый зрелый из них (агент ЯНДЕКСНЕДВИЖ_СРА) сделан на async Playwright с playwright-stealth, humanize-паузами, launch_persistent_context для сохранения профиля и батч-режимом с микропаузами и «отлучками», чтобы имитировать живого человека. Идея — переиспользовать движок: вместо отправки в Я.Недвижимость прогонять им же свои Marquiz-квизы и смотреть, ловит ли killbot такой трафик.
Краткое резюме
- Playwright — это библиотека от Microsoft (с 2020 года), которая управляет реальным браузером из кода: Chromium, Firefox и WebKit.
- Работает через Chrome DevTools Protocol для Chromium и патченные аналоги для других браузеров — поэтому быстрее и стабильнее Selenium.
- Главные фишки — auto-waits (не нужно
sleep) и locators (устойчивы к перерисовкам страницы); это снимает 80% «мерцающих» тестов. - Применяется для E2E-тестов, веб-скрейпинга, RPA и анти-бот-тестирования; среди пользователей — Microsoft, GitHub, Яндекс, Авито.
- Когда хватает обычного HTTP-запроса — Playwright избыточен; запускать его «потому что модно» вредно для производительности и кошелька.