Автоматизация браузеров на Python: Playwright, Selenium и другие
Сравнение автоматизации браузера и E2E-тестирования на Python.
Выбор правильного стека автоматизации браузера в Python влияет на скорость и стабильность. Этот обзор сравнивает Playwright vs Selenium vs Puppeteer vs LambdaTest vs ZenRows vs Gauge - с акцентом на Python, с учетом, где подходят Node.js или другие языки.
Здесь представлен скриншот 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.
Полезные ссылки
- Playwright: Парсинг и тестирование веб-приложений
- Топ-17 трендовых проектов Python на GitHub
- Модульное тестирование в Python
- Шаблоны проектирования Python для чистой архитектуры
- Шпаргалка по Python
- Структурированный вывод LLM: Ollama, Qwen3 & Python или Go
- Преобразование HTML в Markdown с помощью Python: Полное руководство
- Создание серверов MCP в Python: WebSearch & Парсинг
Ссылки
- Установка и введение в Playwright Python
- Релиз Selenium 4.31 (2025)
- Сравнение Puppeteer, Playwright и Selenium (2026)
- Сравнение производительности Selenium, Playwright и Puppeteer
- Playwright vs Selenium – BrowserStack
- ZenRows – Интеграция Playwright с ZenRows
- ZenRows Scraping Browser – Начало работы с Playwright
- LambdaTest – Selenium с Gauge