Когда выбирать Playwright
Подходит
- Новый проект по автоматизации UI — не нужно тащить наследие Selenium.
- Нужны параллельный запуск и изоляция тестов из коробки (каждый тест получает свой browser context).
- Важна отладка: trace viewer показывает шаги, DOM, сеть и скриншоты упавшего теста.
- Нужно тестировать в Chromium, Firefox и WebKit одним кодом.
Не подходит
- Нужна поддержка очень старых браузеров (IE, старые версии Safari) — здесь остаётся Selenium.
- Вся команда уже глубоко в Selenium Grid и не готова переписывать инфраструктуру.
- Нужно автоматизировать нативные мобильные приложения — для этого Appium, Playwright тестирует только веб.
Установка
npm init playwright@latestpip install pytest-playwright && playwright installПримеры тестов
Первый тест: поиск на сайте
1import { test, expect } from '@playwright/test'
2
3test('поиск находит документацию', async ({ page }) => {
4 await page.goto('https://playwright.dev')
5
6 await page.getByRole('link', { name: 'Get started' }).click()
7
8 await expect(page).toHaveURL(/intro/)
9 await expect(
10 page.getByRole('heading', { name: 'Installation' }),
11 ).toBeVisible()
12})Локаторы по роли (getByRole) устойчивее CSS-селекторов, а expect сам ждёт условия — явные sleep не нужны.
Тот же тест на Python
1import re
2from playwright.sync_api import Page, expect
3
4
5def test_docs_opens(page: Page):
6 page.goto("https://playwright.dev")
7
8 page.get_by_role("link", name="Get started").click()
9
10 expect(page).to_have_url(re.compile(r"intro"))
11 expect(page.get_by_role("heading", name="Installation")).to_be_visible()Фикстура page приходит из pytest-playwright, браузер запускается и закрывается автоматически.
Мок сетевого запроса
1import { test, expect } from '@playwright/test'
2
3test('список пуст, если API вернул []', async ({ page }) => {
4 await page.route('**/api/items', (route) =>
5 route.fulfill({ json: [] }),
6 )
7
8 await page.goto('/items')
9
10 await expect(page.getByText('Ничего не найдено')).toBeVisible()
11})page.route подменяет ответ бэкенда — так проверяют пустые состояния и ошибки без обращения к реальному API.
Типичные ошибки
- Селекторы по CSS-классам
- Классы меняются при каждой вёрстке. Используйте getByRole, getByLabel, getByTestId — тест переживёт редизайн.
- waitForTimeout вместо ожиданий
- Фиксированные паузы делают тесты медленными и всё равно флакают. Ждите условие: expect(...).toBeVisible(), waitForResponse.
- Общее состояние между тестами
- Логин в каждом тесте через UI тормозит прогон. Сохраняйте storageState один раз и переиспользуйте.
- Retries как способ скрыть нестабильность
- retries в CI полезны, но если тест проходит только со второй попытки — разберитесь в причине по trace, а не увеличивайте счётчик.
Вопросы на собеседовании по Playwright
- Чем Playwright отличается от Selenium и почему у него нет явных ожиданий?
- Что такое browser context и зачем он нужен для изоляции тестов?
- Как отладить упавший в CI тест? (trace viewer, скриншоты, видео)
- Как замокать сетевой запрос и проверить обработку ошибки 500?
Отработать ответы можно на мок-собеседовании.
Частые вопросы
Playwright лучше Selenium?
Для новых проектов чаще да: встроенные автоожидания, трассировка и параллелизм уменьшают нестабильность и объём вспомогательного кода. Selenium остаётся уместным для legacy-проектов, старых браузеров и команд с готовым Selenium Grid.
На каком языке писать тесты на Playwright?
TypeScript — основной и самый полный вариант: там первыми появляются новые возможности и лучший тест-раннер. Python удобен, если команда уже использует pytest. Java подходит для проектов на JUnit, но экосистема вокруг неё меньше.
Нужно ли знать программирование, чтобы начать?
Базовый уровень нужен: переменные, функции, async/await для TypeScript. Codegen (npx playwright codegen) помогает записать первый тест, но для поддерживаемых тестов придётся писать код руками.
Можно ли тестировать API через Playwright?
Да, есть встроенный клиент request (APIRequestContext). Он удобен для подготовки данных и проверок рядом с UI-тестами, но для отдельного API-набора обычно берут REST Assured, requests или Supertest.