Modern QA2026Миграция и сравнение
Join

Course13 Browser Automation with Playwright

Foundations · Chapter 13

Миграция и сравнение

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: Постепенный (рекомендуется)

  1. Новые тесты пишутся на Playwright с первого дня
  2. Оба набора запускаются в CI параллельно
  3. Существующие тесты мигрируются по приоритету (критические пути первыми)
  4. Набор Selenium выводится из эксплуатации при эквивалентном покрытии

Подход B: Полная замена

  1. Переписать все тесты на Playwright за один раз
  2. Быстрый переход, но выше риск
  3. Реален только для небольших наборов (< 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 — особенно ожидания и локаторы