Миграция и сравнение
Updated Jul 2026
Большинство команд начинают не с нуля — у них есть существующие наборы тестов на Selenium или Cypress, которые нужно оценить, поддерживать или мигрировать. Понимание практических компромиссов между фреймворками и наличие стратегии миграции — необходимые знания для QA-инженеров.
Сравнение фреймворков
| Функция | Playwright | Selenium | Cypress |
|---|---|---|---|
| Архитектура | WebSocket к браузеру | HTTP к процессу драйвера | Выполнение внутри браузера |
| Языки | TS/JS, Python, Java, C# | Java, Python, JS, C#, Ruby, Go | Только JavaScript/TypeScript |
| Браузеры | Chromium, Firefox, WebKit | Chrome, Firefox, Safari, Edge, IE | Chromium, Firefox, WebKit (ограниченно) |
| Автоожидание | Встроено | Ручное (явные/неявные ожидания) | Встроено |
| Мокирование сети | Нативный page.route() |
Через прокси (сложная настройка) | Нативный cy.intercept() |
| Параллельность | Встроенные воркеры + шардинг | Selenium Grid (отдельная инфраструктура) | Cypress Cloud (платный) или самостоятельно |
| Многовкладочность | Нативная | Нативная | Не поддерживается |
| Поддержка iFrame | frameLocator() |
switch_to.frame() |
cy.iframe() (плагин) |
| Тест-раннер | Встроенный | Внешний | Встроенный (на базе Mocha) |
| Мобильное тестирование | Эмуляция устройств | Интеграция с Appium | Эмуляция устройств |
| Отладка | Trace Viewer, UI Mode | DevTools браузера | Отладчик с перемоткой времени |
Когда что выбирать
Выбирайте Playwright, когда
- Начинаете новый проект без существующего набора тестов
- Команда использует TypeScript, Python, Java или C#
- Нужно кросс-браузерное тестирование (включая движок WebKit/Safari)
- Нужно мокирование сети, многовкладочность или расширенный контроль браузера
- Хотите встроенную тестовую инфраструктуру (раннер, репортер, трейсы)
Оставайтесь на Selenium, когда
- Большой существующий набор тестов с годами инвестиций
- Команда использует Ruby, Go или другие языки, которые Playwright не поддерживает
- Нужно тестирование в реальном Safari (не WebKit-приближение)
- Организация требует Selenium или использует инфраструктуру Selenium Grid
- Интеграция с Appium для тестирования мобильных нативных приложений
Выбирайте Cypress, когда
- Команда работает исключительно на JavaScript/TypeScript
- Тестируется одностраничное приложение
- Приоритет — опыт разработки и быстрая обратная связь
- Не нужно многовкладочное или мультидоменное тестирование
Миграция с Selenium на Playwright
Шаг 1: Маппинг концепций
| Концепция Selenium | Эквивалент в Playwright |
|---|---|
WebDriver / driver |
Page / page |
driver.get(url) |
page.goto(url) |
driver.find_element(By.ID, 'x') |
page.locator('#x') или page.getByTestId('x') |
element.click() |
locator.click() (с автоожиданием) |
element.send_keys('text') |
locator.fill('text') |
WebDriverWait + expected_conditions |
Автоожидание (встроено) |
driver.switch_to.frame() |
page.frameLocator() |
driver.quit() |
Очистка контекста/браузера (автоматическая в тест-раннере) |
| Selenium Grid | Встроенные воркеры + шардинг |
Page Object с WebDriverWait |
Page Object с Locators (ожидания не нужны) |
Шаг 2: Стратегия миграции
Подход A: Постепенный (рекомендуется)
- Новые тесты пишутся на Playwright с первого дня
- Оба набора запускаются в CI параллельно
- Существующие тесты мигрируются по приоритету (критические пути первыми)
- Набор Selenium выводится из эксплуатации при эквивалентном покрытии
Подход B: Полная замена
- Переписать все тесты на Playwright за один раз
- Быстрый переход, но выше риск
- Реален только для небольших наборов (< 100 тестов)
Шаг 3: Типичные паттерны конвертации
# Selenium
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '[data-testid="submit"]'))
)
element.click()
# Playwright — явное ожидание не нужно
page.get_by_test_id("submit").click()
// Selenium (JS)
await driver.wait(until.elementLocated(By.id('result')), 10000);
const text = await driver.findElement(By.id('result')).getText();
assert.equal(text, 'Success');
// Playwright — web-first утверждение повторяется автоматически
await expect(page.locator('#result')).toHaveText('Success');
Миграция с Cypress на Playwright
| Паттерн Cypress | Эквивалент в Playwright |
|---|---|
cy.visit('/page') |
await page.goto('/page') |
cy.get('[data-cy="x"]') |
page.getByTestId('x') |
cy.contains('text') |
page.getByText('text') |
cy.intercept() |
page.route() |
cy.fixture('data.json') |
Пользовательская фикстура или import |
beforeEach() |
test.beforeEach() или фикстуры |
| Cypress Cloud (параллельность) | Встроенный шардинг |
Ключевые различия
- Команды Cypress автоматически цепочкуются и повторяются; Playwright использует
async/awaitявно - Cypress выполняется внутри браузера (ограничение одного домена); Playwright управляет извне (мультидомен поддерживается)
- Cypress не поддерживает множественные вкладки; Playwright обрабатывает вкладки нативно
Ключевые выводы
- Playwright предлагает лучшее сочетание скорости, надёжности и функций для новых проектов
- Selenium остаётся актуален для команд с большими существующими инвестициями или неподдерживаемыми языками
- Cypress силён для JavaScript-команд, ориентированных на SPA, но имеет архитектурные ограничения
- Постепенная миграция (новые тесты на Playwright, миграция существующих по приоритету) — самый безопасный подход
- Большинство паттернов Selenium имеют более простые эквиваленты в Playwright — особенно ожидания и локаторы