Миграция с Selenium WebDriver

Playwright — современный инструмент для автоматизации браузеров, который предоставляет высокую скорость, стабильность и поддержку современных веб-технологий. При переходе с Selenium WebDriver важно учитывать различия в архитектуре, синтаксисе и подходах к синхронизации.


Архитектурные различия

Selenium WebDriver использует модель взаимодействия через браузерный драйвер, который переводит команды в действия внутри браузера. Каждое действие влечёт сетевое взаимодействие с драйвером, что может приводить к задержкам и нестабильности при тестировании сложных интерфейсов.

Playwright управляет браузером напрямую через протоколы DevTools или WebSocket. Это позволяет:

  • Уменьшить задержки между командами.
  • Более точно управлять состоянием страниц и элементов.
  • Поддерживать современные функции браузеров, такие как Shadow DOM, Web Components и мультитабовые сценарии.

Работа с браузерами и контекстами

В Selenium привычно создавать один WebDriver на тестовый класс или сессию. В Playwright ключевое понятие — BrowserContext. Это изолированная среда в одном браузере, которая имитирует отдельный пользовательский профиль. Пример:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext(); // аналог новой сессии
  const page = await context.newPage();
  await page.goto('https://example.com');
})();

Преимущество контекста: изоляция cookies, localStorage и cache, что позволяет запускать параллельные тесты без конфликтов.


Навигация и ожидания

В Selenium часто применяются Thread.sleep или WebDriverWait для синхронизации, что увеличивает сложность и время тестов. Playwright предлагает автоожидания:

  • page.goto() ждёт полной загрузки страницы.
  • Методы взаимодействия (click, fill) автоматически ожидают доступности элементов.
  • Можно явно управлять ожиданиями через page.waitForSelector или page.waitForResponse.

Пример клика с ожиданием:

await page.click('button#submit', { timeout: 5000 });
await page.waitForSelector('text=Успешно');

Автоожидания снижают вероятность ElementNotInteractableException, типичной для Selenium.


Работа с элементами

Selenium использует WebElement, Playwright — Locator. Locator позволяет повторно использовать логику поиска и поддерживает цепочку действий:

const loginButton = page.locator('button#login');
await loginButton.click();
await loginButton.hover();

Особенности Locator:

  • Ленивая оценка: поиск элемента происходит только при взаимодействии.
  • Поддержка ожиданий: можно сразу писать await loginButton.waitFor({ state: 'visible' }).

Селекторы и сложные сценарии

Playwright расширяет возможности селекторов:

  • CSS, XPath.
  • text=, role=, has-text=.
  • Комбинированные селекторы: page.locator('div', { hasText: 'Пример' }).

Это упрощает миграцию сценариев, где в Selenium использовались сложные XPath выражения.


Мультибраузерное тестирование

Selenium требует отдельного драйвера для каждого браузера. Playwright поддерживает:

const { chromium, firefox, webkit } = require('playwright');

Одинаковый API для всех браузеров позволяет запускать один и тот же тест без изменений.


Работа с асинхронностью

Selenium использует синхронные вызовы через WebDriver, Playwright — асинхронные Promise:

await page.fill('#username', 'user123');
await page.click('#submit');

Для миграции важно заменить все синхронные методы Selenium на асинхронные конструкции Playwright. Это повышает стабильность и позволяет параллельно запускать несколько тестов.


Скриншоты, видео и отчётность

Playwright поддерживает встроенную запись скриншотов и видео:

await page.screenshot({ path: 'screenshot.png', fullPage: true });

Также можно автоматически сохранять видео сессий для последующего анализа, чего в Selenium нужно реализовывать сторонними инструментами.


Параллельное выполнение и тестовые фреймворки

Playwright тесно интегрирован с @playwright/test, который поддерживает:

  • Параллельное выполнение тестов на уровне файлов и сценариев.
  • Фикстуры для создания контекста и страниц.
  • Параметризацию тестов.

Пример параллельного запуска:

import { test } from '@playwright/test';

test('проверка логина', async ({ page }) => {
  await page.goto('https://example.com/login');
  await page.fill('#username', 'user');
  await page.fill('#password', 'pass');
  await page.click('#submit');
  await page.waitForSelector('text=Добро пожаловать');
});

Практические рекомендации при миграции

  1. Заменить WebDriver на Browser/Context/Page: каждая сессия Selenium → отдельный контекст Playwright.
  2. Перевести все ожидания на встроенные методы Playwright: избавиться от Thread.sleep.
  3. Использовать Locator вместо WebElement: уменьшает количество ошибок при изменении DOM.
  4. Переписать тесты под асинхронный подход: использовать async/await.
  5. Рассмотреть возможность параллельного выполнения: улучшает время прогона тестов.

Playwright обеспечивает более современный подход к автоматизации тестирования, упрощает работу с элементами, управляет ожиданиями и позволяет писать стабильные параллельные тесты. Миграция с Selenium требует понимания асинхронной модели и новых абстракций, но взамен повышает надежность и масштабируемость тестового покрытия.