Установка, настройка окружения, первый тест, запуск в браузере
Playwright — это фреймворк от Microsoft, который позволяет автоматизировать Chromium, Firefox и WebKit через единый API. Он создан для надёжного end-to-end тестирования современных веб-приложений.
До Playwright доминировал Selenium WebDriver. У Selenium есть фундаментальная проблема: тест общается с браузером через HTTP-протокол (WebDriver). Каждый клик — это HTTP-запрос → ответ → следующий запрос. Это медленно и ненадёжно.
Playwright работает напрямую с браузерным процессом через Chrome DevTools Protocol (CDP) и его аналоги для Firefox/WebKit. Связь идёт по WebSocket — мгновенно и с доступом ко всем внутренним событиям браузера.
| Характеристика | Selenium | Playwright |
|---|---|---|
| Протокол | HTTP (WebDriver) | WebSocket (CDP) |
| Скорость | Медленнее | Быстрее |
| Auto-waiting | Нет (нужен WebDriverWait) | Встроенный |
| Мульти-вкладки | Сложно | Нативно |
| Перехват сети | Нет | Встроенный |
| Мобильная эмуляция | Ограничена | Полная |
Установка состоит из двух шагов. Первый — установка Python-библиотеки, второй — загрузка браузеров.
pip install playwright
playwright installКоманда playwright install загружает Chromium, Firefox и WebKit. Если нужен только один браузер — укажите его явно:
playwright install chromiumРекомендация: в CI/CD устанавливайте только нужный браузер — это экономит время и место.
Playwright для Python предоставляет два API.
Синхронный API — подходит для простых скриптов и pytest-тестов. Вызовы блокирующие, код читается линейно:
from playwright.sync_api import sync_playwright
with sync_playwright() as pw:
browser = pw.chromium.launch()
page = browser.new_page()
page.goto('https://example.com')
print(page.title())
browser.close()Асинхронный API — использует async/await, работает с asyncio. Подходит для интеграции в асинхронные приложения:
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as pw:
browser = await pw.chromium.launch()
page = await browser.new_page()
await page.goto('https://example.com')
print(await page.title())
await browser.close()
asyncio.run(main())Важно: не смешивайте
awaitсsync_apiи не используйте синхронные вызовы сasync_api. Это вызовет ошибку.
Понимание иерархии — ключ к эффективному использованию Playwright.
Browser (процесс браузера)
└── BrowserContext (изолированная сессия)
└── Page (одна вкладка)
└── Frame (фрейм внутри страницы)
Browser — запущенный процесс браузера. Создаётся через pw.chromium.launch().
BrowserContext — изолированная среда внутри браузера. Аналог инкогнито-сессии. Каждый контекст имеет собственные cookies, localStorage и sessionStorage. Создаётся через browser.new_context().
Page — одна вкладка браузера. Объект для всех действий: клики, заполнение полей, навигация. Создаётся через context.new_page() или сокращённо browser.new_page().
from playwright.sync_api import sync_playwright
with sync_playwright() as pw:
browser = pw.chromium.launch(headless=True)
# Один браузер — два изолированных контекста
context_a = browser.new_context()
context_b = browser.new_context()
page_a = context_a.new_page()
page_b = context_b.new_page()
page_a.goto('https://example.com')
page_b.goto('https://example.com')
# Cookies не пересекаются между контекстами
print(len(context_a.cookies())) # свои cookies
print(len(context_b.cookies())) # другие cookies
browser.close()Почему это важно? В тестах каждый тест должен быть изолирован. Создавая новый контекст для каждого теста, вы гарантируете, что cookies, localStorage и состояние одного теста не повлияют на другой.
Напишем минимальный тест: открыть страницу, проверить заголовок.
from playwright.sync_api import sync_playwright
def test_example_title():
with sync_playwright() as pw:
browser = pw.chromium.launch()
page = browser.new_page()
page.goto('https://example.com')
# Проверка заголовка
assert page.title() == 'Example Domain'
# Проверка наличия элемента
assert page.query_selector('h1') is not None
browser.close()Этот тест делает три вещи: запускает браузер, открывает страницу, проверяет два условия. Если хотя бы одно assert не выполнится — тест упадёт.
По умолчанию launch() запускает браузер в headless-режиме — без отображения окна. Для отладки полезно видеть, что происходит:
browser = pw.chromium.launch(headless=False, slow_mo=500)Параметр slow_mo замедляет каждое действие на 500 мс — вы успеете увидеть, что делает тест. Это незаменимый инструмент при разработке тестов.
Рекомендация: используйте headed=True только при отладке. В CI/CD всегда headless=True.
Самый быстрый способ начать — записать действия через Codegen. Откройте браузер, кликайте, заполняйте формы — Playwright сгенерирует код.
playwright codegen https://example.comОткроется браузер. Все ваши действия конвертируются в Python-код в соседнем окне. Codegen использует встроенные локаторы (get_by_role, get_by_text), а не хрупкие CSS-селекторы.
Playwright предоставляет готовый pytest-плагин. Установите его:
pip install pytest-playwrightТеперь тесты пишутся через фикстуры page и browser:
def test_homepage(page):
page.goto('https://example.com')
assert page.title() == 'Example Domain'Фикстура page автоматически создаёт браузер, контекст и страницу. После теста контекст закрывается — полная изоляция без ручного управления.
Запуск:
pytest test_example.py --browser chromiumPlaywright поддерживает три движка:
| Движок | Браузеры | Платформы |
|---|---|---|
| Chromium | Chrome, Edge, Opera | macOS, Linux, Windows |
| Firefox | Firefox | macOS, Linux, Windows |
| WebKit | Safari | macOS, Linux, Windows |
Вы можете запускать одни и те же тесты на всех трёх движках:
for browser_type in ['chromium', 'firefox', 'webkit']:
browser = pw[browser_type].launch()
page = browser.new_page()
page.goto('https://example.com')
assert 'Example' in page.title()
browser.close()❌ Использование time.sleep() вместо auto-waiting. Playwright автоматически ждёт готовности элементов. time.sleep() только замедляет тесты.
❌ Переиспользование page между тестами без очистки. Каждый тест должен создавать свой контекст — иначе состояние одного теста утекает в другой.
❌ Глобальный браузер на уровне модуля. Если один тест закроет браузер, остальные тесты упадут. Создавайте браузер через фикстуры.
✅ Правильный подход: используйте pytest-фикстуры, доверяйте auto-waiting, закрывайте контексты после каждого теста.
playwright install chromium.https://example.com и выводит все ссылки на странице.https://google.com и запишите поиск фразы «playwright testing».pytest-playwright и напишите pytest-тест, проверяющий заголовок и наличие <h1> на https://example.com.Изучите локаторы и взаимодействие с элементами — это основа всех тестов. Вы научитесь надёжно находить элементы на странице и взаимодействовать с ними.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.