Автоматизация браузеров на Python: Playwright, Selenium и другие

Сравнение автоматизации браузера и E2E-тестирования на Python.

Содержимое страницы

Выбор правильного стека автоматизации браузера в Python влияет на скорость и стабильность. Этот обзор сравнивает Playwright vs Selenium vs Puppeteer vs LambdaTest vs ZenRows vs Gauge - с акцентом на Python, с учетом, где подходят Node.js или другие языки.

Playwright trace viewer Здесь представлен скриншот Playwright trace viewer

Когда использовать что

Playwright (Python) Playwright — это открытая библиотека автоматизации браузеров от Microsoft. Она взаимодействует с Chromium, Firefox и WebKit через Chrome DevTools Protocol (CDP) или WebSocket, поэтому у вас есть один API для всех трех движков. Она поставляется с автоматическим ожиданием: перед каждым действием (клик, заполнение и т.д.) она ждет, пока элемент станет видимым, стабильным и доступным для действий, что снижает хрупкость и необходимость в ручном sleep или WebDriverWait. Настройка минимальна (pip install playwright, затем playwright install), а Python API является первоклассным (синхронным и асинхронным). Используйте его для новых наборов E2E тестов, скриптов или автоматизации (например, создание MCP серверов на Python которые управляют браузером). Для полного руководства с примерами на Python, JavaScript и TypeScript см. Playwright: Web Scraping & Testing. Сочетайте его с модульным тестированием на Python для остальной части вашего приложения и используйте Playwright только для браузерного уровня. Недостатки: новее, чем Selenium, поэтому меньше сторонних интеграций и меньше устаревших материалов; нет официальной поддержки очень старых браузеров.

Selenium (Python) Selenium — это давно существующий стандарт для автоматизации браузеров. Проект Selenium (открытый исходный код, поддерживается OpenJS Foundation) предоставляет API WebDriver: вы отправляете команды драйверу, специфичному для браузера (ChromeDriver, GeckoDriver и т.д.), который взаимодействует с реальным браузером. Selenium поддерживает множество языков (Python, Java, C#, JavaScript и т.д.) и самый широкий набор браузеров, включая устаревшие. Selenium 4+ включает Selenium Manager, поэтому вам больше не нужно вручную загружать или указывать путь к драйверным бинарным файлам — клиент сам получает нужный драйвер. API не имеет автоматического ожидания; обычно вы используете WebDriverWait и ожидаемые условия, чтобы избежать хрупких тестов. Используйте Selenium, если вы поддерживаете существующие наборы WebDriver, вам нужна самая широкая экосистема и поддержка языков, или вы должны поддерживать старые браузеры. Он подходит для Python шаблонов проектирования для чистой архитектуры когда вы оборачиваете драйвер за небольшим адаптером. Недостатки: обычно медленнее и более хрупкий, чем Playwright, без тщательной стратегии ожидания; больше шаблонного кода.

Puppeteer Puppeteer — это библиотека Google для Node.js для управления безголовым Chrome/Chromium (и основанным на Chromium Edge). Он использует Chrome DevTools Protocol напрямую и является де-факто выбором для команд JavaScript/TypeScript, занимающихся автоматизацией только для Chrome, генерацией PDF или скрейпингом в Node. Нет официального привязки к Python; API только для Node. Если ваш стек — это Python, используйте Playwright (та же идея “управления CDP” с первоклассной поддержкой Python) или Selenium. Если вы работаете в Node.js и вам нужен только Chromium, Puppeteer — это сильное, хорошо документированное решение. Недостатки: только Chrome/Chromium; нет Firefox или WebKit; нет Python.

LambdaTest LambdaTest — это коммерческая облачная платформа для тестирования. Вы продолжаете писать те же скрипты Selenium или Playwright (или Cypress и т.д.) локально, но вместо запуска локального браузера вы подключаетесь к гриду LambdaTest. Они предоставляют реальные браузеры и реальные устройства (включая мобильные) в облаке, поэтому вы можете запускать тесты параллельно на множестве комбинаций ОС/браузеров/версий без поддержки собственной лаборатории. Вы получаете панель управления для результатов, видео и логов. Используйте его, когда вам нужна кросс-браузерная совместимость, параллельный запуск в большом масштабе или эмуляция мобильных устройств, и вы не хотите развертывать инфраструктуру. Он также поддерживает Gauge: вы запускаете свои спецификации Gauge на их Selenium гриде. Недостатки: платный (с бесплатными тарифами); тесты запускаются через сеть, поэтому задержка и доступность зависят от их сервиса.

ZenRows ZenRows — это коммерческая служба веб-скрейпинга и анти-детектирования. Его Scraping Browser — это облачный браузер, которым вы управляете через Playwright (или другие совместимые с CDP инструменты): вы подключаете свой скрипт к WebSocket-концу, и браузер работает на стороне ZenRows с резиденциальными прокси, ротацией IP, обходом анти-ботов (например, Cloudflare, DataDome) и опциональной обработкой CAPTCHA. Вы не изменяете логику Playwright — только конечную точку браузера. Используйте его, когда ваша цель — скрейпинг и вы сталкиваетесь с блоками или лимитами скорости; для обычного E2E тестирования вашего приложения обычно достаточно локального Playwright или Selenium. Недостатки: платный; ориентирован на скрейпинг, а не на универсальные тестовые гриды, такие как LambdaTest.

Gauge Gauge — это открытая тестовая рамка от Thoughtworks. Она фокусируется на спецификациях и отчетности: вы пишете спецификации в Markdown (или других форматах) со сценариями и шагами, а шаги реализуете на Python (или Java, JavaScript и т.д.) с использованием Selenium — или любого другого драйвера — для управления браузером. Gauge не заменяет Selenium или Playwright; он находится поверх них и добавляет структуру, повторное использование и читаемые отчеты. Используйте его, когда вы хотите спецификации в стиле BDD, живую документацию и четкие отчеты о тестах поверх вашей существующей настройки Selenium (или аналогичной). LambdaTest поддерживает запуск тестов Gauge на их гриде. Недостатки: дополнительный слой для изучения и обслуживания; вам все равно нужно выбрать и настроить драйвер для автоматизации браузера (например, Selenium).

Где они работают

  • Playwright: Локально или в CI; Python 3.8+; Windows, macOS, Linux. Также работает с облачными/удаленными браузерами (например, ZenRows, LambdaTest) путем подключения к WebSocket или CDP-концу.
  • Selenium: Локально или в CI; любой язык с клиентом WebDriver; Selenium Grid или поставщик, такой как LambdaTest, для масштабирования.
  • Puppeteer: Только Node.js; обычно Chrome/Chromium на машине или в Docker.
  • LambdaTest: Только облако; вы запускаете Selenium/Playwright (или Gauge поверх Selenium) против их грида.
  • ZenRows: Облачный Scraping Browser; вы управляете им из Python (например, Playwright) или других совместимых с CDP инструментов.
  • Gauge: Работает на вашей машине или в CI; использует Selenium (или другой драйвер) под капотом; может направляться на грид LambdaTest.

Для быстрого справочника по тенденциям экосистемы Python см. самые популярные Python проекты на GitHub; многие инструменты автоматизации и тестирования появляются там.

Как использовать их в Python

Playwright (Python)

Пакет Playwright для Python предоставляет как синхронные, так и асинхронные API. Браузеры устанавливаются отдельно, чтобы библиотека оставалась небольшой, и вы могли выбрать только нужные движки (Chromium, Firefox, WebKit). Установите и установите браузеры:

pip install playwright
playwright install

Синхронный пример (навигация, клик, чтение текста - Playwright автоматически ждет элементов):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    # Клик по ссылке, затем проверка заголовка (встроенные автоматические ожидания)
    page.get_by_role("link", name="More information...").click()
    heading = page.get_by_role("heading", name="Example Domain").text_content()
    print(heading)
    browser.close()

Асинхронный вариант рекомендуется для параллелизма и подходит для работы с структурированным выводом LLM или скриптов, которые выполняют ввод-вывод, пока работает браузер:

from playwright.async_api import async_playwright
import asyncio

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto("https://example.com")
        print(await page.title())
        await browser.close()

asyncio.run(main())

Для шпаргалки по Python и справочника по синтаксису держите локальную документацию под рукой.

Selenium (Python)

Клиент Python использует протокол W3C WebDriver. Selenium 4+ использует Selenium Manager для автоматической загрузки и управления правильным драйвером (ChromeDriver, GeckoDriver и т.д.), поэтому больше не нужно загружать драйверы вручную:

pip install selenium

Базовый пример с явным ожиданием (Selenium не ждет автоматически; используйте WebDriverWait или ожидаемые условия):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com")
# Ждем появления body, затем получаем заголовок
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
print(driver.title)
driver.quit()

Клик и чтение текста:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com")
link = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.LINK_TEXT, "More information..."))
)
link.click()
heading = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, "h1"))
)
print(heading.text)
driver.quit()

Puppeteer (Node.js; нет официального Python)

Puppeteer - это только JavaScript/Node.js - Google не поддерживает Python API. Если вам нужен опыт, похожий на Puppeteer, в Python используйте Playwright (та же идея “управление Chrome через CDP”, с первой поддержкой Python и автоматическими ожиданиями). Существует неофициальный порт pyppeteer, но он не поддерживается активно; для новой работы с Python Playwright - лучший выбор. Ниже приведен пример на Node.js, чтобы вы могли сравнить API:

npm init -y && npm install puppeteer
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto("https://example.com");
  console.log(await page.title());
  await page.click("a[href='https://www.iana.org/domains/example']");
  const text = await page.$eval("h1", (el) => el.textContent);
  console.log(text);
  await browser.close();
})();

LambdaTest (Python: Selenium)

Вы используете тот же API Selenium; единственное изменение - подключение к удаленному хабу WebDriver LambdaTest вместо локального драйвера. Установите возможности (браузер, ОС, имя сборки и т.д.) и передайте свой имя пользователя и ключ доступа из панели управления LambdaTest:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.browser_version = "latest"
options.platform_name = "Windows 11"

lt_caps = {
    "lt:options": {
        "username": "YOUR_LT_USERNAME",
        "accessKey": "YOUR_LT_ACCESS_KEY",
        "build": "Playwright-Selenium-Compare",
        "name": "Selenium on LambdaTest",
    }
}
options.set_capability("lt:options", lt_caps["lt:options"])

driver = webdriver.Remote(
    command_executor="https://YOUR_LT_USERNAME:YOUR_LT_ACCESS_KEY@hub.lambdatest.com/wd/hub",
    options=options,
)
driver.get("https://example.com")
print(driver.title)
driver.quit()

LambdaTest (Python: Playwright)

Playwright может подключаться к удаленному браузеру через CDP (Chrome DevTools Protocol). LambdaTest предоставляет конечную точку CDP для каждого тестового запуска; вы подключаетесь к ней вместо запуска локального браузера. См. документацию LambdaTest для точного формата URL CDP и аутентификации:

from playwright.sync_api import sync_playwright

# LambdaTest предоставляет конечную точку CDP для каждого запуска; используйте их документацию для получения
CDP_URL = "wss://cdp.lambdatest.com/playwright?capabilities=..."  # из панели LT

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(CDP_URL)
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    browser.close()

ZenRows + Playwright (Python)

Scraping Browser ZenRows совместим с CDP, поэтому вы используете connect_over_cdp() Playwright с их WebSocket URL. Браузер работает в облаке ZenRows с их прокси и обработкой анти-ботов; ваш скрипт остается таким же, за исключением способа подключения. Изменяется только шаг запуска:

from playwright.sync_api import sync_playwright

ZENROWS_WS = "wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY"

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(ZENROWS_WS)
    page = browser.new_page()
    page.goto("https://example.com")
    html = page.content()
    print(html[:500])
    browser.close()

Затем передайте полученный HTML в свой собственный парсер или, например, преобразование HTML в Markdown с помощью Python для последующей обработки.

Gauge + Selenium (Python)

Gauge хранит спецификации в Markdown (или других форматах), а реализации шагов в Python. Каждый шаг может вызывать Selenium (или любой другой драйвер) для открытия браузера, навигации и проверки. Пример структуры:

Спецификация specs/example.spec:

# Пример спецификации

## Открыть сайт и проверить заголовок

* Открыть браузер и перейти по адресу "https://example.com"
* Заголовок страницы должен быть "Example Domain"

Шаги step_impl/example.py:

from getgauge.python import step, before_scenario
from selenium import webdriver

driver = None

@before_scenario()
def init_driver():
    global driver
    driver = webdriver.Chrome()

@step("Открыть браузер и перейти по адресу <url>")
def open_url(url):
    driver.get(url)

@step("Заголовок страницы должен быть <title>")
def check_title(title):
    assert driver.title == title, f"Ожидалось {title}, получено {driver.title}"

Установите Gauge, Python-раннер и плагин Selenium; запустите с gauge run specs/. Для запуска на LambdaTest установите драйвер Selenium для использования удаленного URL и возможностей LambdaTest в хуке before_scenario вместо webdriver.Chrome().

Сводка

Инструмент Python Роль Лучше всего для
Playwright Да Автоматизация браузера Новые E2E-тесты, парсинг, мульти-браузер, скорость
Selenium Да Автоматизация браузера Устаревшие тесты, широкий экосистема, много браузеров
Puppeteer Нет Автоматизация браузера Проекты только для Node.js/Chrome
LambdaTest Н/Д Облачная сетка Параллельные тесты, кросс-браузерные, Gauge + Selenium
ZenRows Через PW Парсинг браузера Анти-бот, прокси, CAPTCHA; использовать с Playwright
Gauge Да Фреймворк тестирования BDD-спецификации + Selenium (или другой драйвер)

Для новой работы с Python Playwright - это выбор по умолчанию; добавьте LambdaTest или ZenRows, когда вам нужна облачная масштабируемость или устойчивость парсинга. Оставьте Selenium для существующих наборов тестов и Gauge, когда вы хотите проектировать тесты на основе спецификаций поверх Selenium.

Полезные ссылки

Ссылки