Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
В условиях стремительных циклов разработки надежная автоматизация тестирования помогает быстро выпускать качественный продукт. В этой статье расскажем о о рабочих практиках, которые помогут построить эффективный и легко поддерживаемый тестовый набор на Playwright. Рассмотрим в том числе структуру проекта, работу с моками и тестовыми данными, параллельный запуск, интеграцию с CI и борьбу с нестабильными (flaky) тестами. Следуя этим советам, вы сделаете автотесты быстрее, стабильнее и проще в сопровождении.
Что такое Playwright?
Playwright — это библиотека от Microsoft для Node.js, предназначенная для end-to-end автоматизации браузеров.
Основные функции:
- поддержка различных браузеров (Chromium, Firefox, WebKit);
- встроенный тест-раннер с фикстурами и повторными запусками;
- перехват сетевых запросов и имитация запросов;
- автоматическое ожидание и надёжные селекторы для стабильных тестов;
- эффективный параллельный запуск с использованием нескольких контекстов.
Настройка автоматизации тестирования в Playwright для успешного старта
Хорошая база имеет значение. Несколько простых настроек на этапе запуска проекта сэкономят вам часы отладки в будущем.
Запускайте тесты в headless-режиме для ускорения
Headless-режим означает, что тесты выполняются без открытия реального окна браузера. Это идеальное решение для CI/CD-пайплайнов.
var browser = await playwright.Chromium.LaunchAsync(new() { Headless = true });
Настройка playwright.config с ретраями, таймаутами и опциями трассировки
Playwright позволяет настраивать повторные запуски для нестабильных тестов, глобальные таймауты и захват трассировки. Пример (playwright.config.ts в JS, аналогично в C#):
{
"retries": 2,
"timeout": 30000,
"use": {
"trace": "on-first-retry"
}
}
Это гарантирует, что при падении тестов автоматически будут сохраняться трассировки и скриншоты для отладки.
Используйте фикстуры для единообразия в setup/teardown
Вместо того, чтобы дублировать код запуска браузера в каждом тесте, используйте фикстуру.
[SetUp]
public async Task Setup()
{
_browser = await _playwright.Chromium.LaunchAsync(new() { Headless = true });
_context = await _browser.NewContextAsync();
_page = await _context.NewPageAsync();
}
[TearDown]
public async Task TearDown()
{
await _browser.CloseAsync();
}
Это позволяет сохранить чистоту и надежность тестов.
Как писать стабильные тесты в Playwright
Нестабильные тесты (flaky-тесты) — враг автоматизации. Разберемся, как избавиться от них с помощью проверенных методов.
Используйте автоматическое ожидание (не используйте Thread.Sleep())
Playwright сам умеет ждать нужные элементы — не нужно вручную ставить задержки.
Плохо:
await Task.Delay(5000);
await page.ClickAsync("#submit");
Хорошо:
Await page.ClickAsync("#submit"); // Playwright waits until element is clickable
Используйте web-first assertions
Ассерты вроде toBeVisible и toHaveText автоматически повторяются при необходимости.
await Expect(page.Locator("#welcome")).ToHaveTextAsync("Hello, User!");
Организуйте тесты с помощью Page Object Model (POM)
POM помогает держать код тестов аккуратным, понятным и легко поддерживаемым.
ПРИМЕР:
LoginPage.cs
public class LoginPage
{
private readonly IPage _page;
public LoginPage(IPage page) => _page = page;
public async Task LoginAsync(string user, string pass)
{
await _page.FillAsync("#username", user);
await _page.FillAsync("#password", pass);
await _page.ClickAsync("#loginBtn");
}
}
LoginTests.cs
[Test]
public async Task UserCanLogin()
{
var loginPage = new LoginPage(page);
await loginPage.LoginAsync("admin", "password123");
await Expect(page.Locator("#welcome")).ToBeVisibleAsync();
}
Сохраняйте тесты изолированными и атомарными
Каждый тест должен устанавливать свое собственное состояние. Никогда не полагайтесь на данные предыдущего теста.
Умная стратегия локаторов в Playwright
Выбор правильных селекторов повышает стабильность тестов.
Используйте стабильные селекторы
await page.GetByTestId("login-button").ClickAsync();
await page.GetByRole(AriaRole.Button, new() { Name = "Submit" }).ClickAsync();
Избегайте ненадежных локаторов
Не используйте селекторы вроде .btn-123 или div:nth-child(2) — они часто меняются и ломают тесты.
Параллельное выполнение и интеграция CI/CD в Playwright
Запускайте тесты параллельно
Playwright позволяет запускать тесты на нескольких рабочих процессах одновременно, что значительно сокращает время выполнения.
Интеграция с CI/CD
Пример для GitHub Actions:
-name: Run Playwright Tests run: npx playwright test --reporter=line
Автоматические логи и скриншоты при сбоях
Playwright может автоматически сохранять логи, скриншоты и даже видео упавших тестов — это серьезно ускоряет поиск и устранение ошибок.
Как управлять тестовыми данными и моками в Playwright
Используйте перехват запросов для мокирования API
Вместо обращения к реальным API можно возвращать заранее подготовленные ответы.
await page.RouteAsync("**/api/users", async route =>
{
await route.FulfillAsync(new()
{
Body = "{ ‘id’: 1, ‘name’: ‘Mock User’ }"
});
});
Избегайте хардкода тестовых данных
Плохо:
Имя пользователя/пароль, введенные непосредственно в коде теста.
Хорошо:
Использовать параметризованные данные или генерировать их через API.
[TestCase("user1", "password1")]
[TestCase("user2", "password2")]
public async Task LoginTest(string user, string pass)
{
var loginPage = new LoginPage(page);
await loginPage.LoginAsync(user, pass);
}
Отладка тестов Playwright и устранение flaky-тестов
Даже идеально написанные тесты могут давать сбои. В этом случае помогают инструменты отладки.
Используйте trace viewer, скриншоты и видео
await context.Tracing.StartAsync(new() { Screenshots = true, Snapshots = true });
Затем можно открыть trace viewer, чтобы воспроизвести выполнение теста.
Мониторинг flaky-тестов
Регулярно запускайте весь набор тестов несколько раз, чтобы выявить нестабильные тесты.
Не злоупотребляйте повторными тестами
Повторы (retries) — это страховка, но не решение проблемы. Лучше устранять первопричину: нестабильные локаторы, проблемы с сетью и т.п.
Если вы новичок в Playwright, обязательно посмотрите официальный гайд, где объясняется, что это за инструмент и как начать работу.
Заключение
Эффективная автоматизация Playwright заключается не в количестве.
Важно написать меньшее количество надежных и поддерживаемых тестов, которые дают быструю и точную обратную связь.
Ключевые выводы:
- Используйте правильную настройку окружения (headless-режим, конфигурацию, фикстуры).
- Пишите стабильные тесты с помощью POM и автоматического ожидания.
- Выбирайте надежные локаторы.
- Запускайте тесты в CI с параллельным выполнением.
- Мокируйте данные с умом.
- Отлаживайте тесты и устраняйте нестабильные тесты на уровне причин.
Следуя этим рекомендациям, вы сделаете тестовый набор надежным, масштабируемым и экономящим массу времени — и себе, и команде.
Перевод статьи «Playwright Test Automation Best Practices for QA Engineers».