Comparisons

WebDriver и CDP в QA CAPTCHA: когда что использовать в собственных средах

Безопасный scope: Это руководство применимо только к собственным или явно авторизованным QA-, staging- и production-средам. Описаны сценарии диагностики, тестирования и наблюдаемости вашей собственной CAPTCHA-интеграции — не для сторонних сайтов и не для несанкционированных workflow.

Короткий ответ: если сценарий должен пройти в Chrome, Firefox и Edge и жить в общей регрессионной сюите — берите WebDriver. Если нужно понять, почему виджет CAPTCHA на вашем staging грузится восемь секунд или молча ломается, — подключайтесь по Chrome DevTools Protocol. Это не конкуренты: WebDriver — стандартизированный протокол управления браузером, CDP — низкоуровневый канал к внутренностям Chrome. В зрелой QA-сюите живут оба, вопрос лишь в том, какой инструмент вы достаёте под конкретную задачу.

Как выбрать за минуту

Что вам нужно Протокол Почему
Прогон одного сценария в трёх браузерах WebDriver единый стандарт, один код на все движки
Понять, куда виджет шлёт запросы CDP прямой доступ к домену Network
Запуск на удалённых grid-нодах WebDriver штатная поддержка в grid и в CI
Замер времени загрузки виджета CDP события и метрики без обвязки
Отчёт для команды на готовом фреймворке WebDriver pytest, WebDriverIO, Allure из коробки
Поймать ошибку в консоли виджета CDP подписка на консоль без capabilities

WebDriver: рабочая лошадка регрессии

WebDriver выигрывает там, где важны повторяемость и охват: форму регистрации с reCAPTCHA v2 на staging нужно проверять на каждом релизе в Chrome и Firefox, а результат — отдавать в общий отчёт. Тест забирает sitekey со страницы, отправляет задачу в решатель, подставляет токен в поле и жмёт submit.

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://staging.example.com/qa-form')
sitekey = driver.find_element(By.CSS_SELECTOR, '.g-recaptcha').get_attribute('data-sitekey')
token = solve(sitekey)
driver.execute_script(
    "document.getElementById('g-recaptcha-response').value = arguments[0];",
    token,
)
driver.find_element(By.CSS_SELECTOR, 'button[type=submit]').click()

Функция solve() здесь — тонкая обёртка над API решателя: отправка задачи в in.php и опрос res.php до готовности токена. Как она устроена целиком, разобрано в материалах про reCAPTCHA v2 через API и Cloudflare Turnstile через API.

Слабое место WebDriver — наблюдаемость. Он отвечает на вопрос «прошёл тест или нет», но не на вопрос «что при этом происходило по сети». Перехват запросов требует сторонней обвязки, метрики Performance доступны косвенно, логи консоли — через capabilities драйвера.

CDP: когда нужен разбор полётов

CDP подключается к Chrome по WebSocket и открывает домены Network, Runtime, Performance, Console. Для QA это значит: видно каждый запрос, который делает виджет, и точное время каждого этапа.

import json, websockets, asyncio

async def trace(ws_url):
    async with websockets.connect(ws_url) as ws:
        await ws.send(json.dumps({'id': 1, 'method': 'Network.enable'}))
        async for msg in ws:
            data = json.loads(msg)
            if data.get('method') == 'Network.requestWillBeSent':
                print(data['params']['request']['url'])

Типичный случай для команд, которые деплоятся во Франкфурт или в Алматы, а CI держат в другом регионе: локально сюита проходит, а на удалённом стенде тот же сценарий периодически падает по тайм-ауту. WebDriver сообщает только «элемент не найден за 30 с». Трассировка по CDP показывает причину: скрипт виджета тянется дольше обычного из-за RTT до CDN, и инициализация не успевает к моменту, когда тест уже ищет поле. Чинится это не увеличением sleep, а корректным ожиданием и отдельным порогом тайм-аута для медленных стендов.

Практическое правило: CDP не заменяет тест, он объясняет его падение. Держите CDP-трассировку отдельным диагностическим прогоном — объём событий быстро превращает логи в шум.

Гибрид: Selenium 4 умеет и то и другое

Разносить инструменты по разным сюитам не обязательно. В Selenium 4 есть execute_cdp_cmd(), поэтому один и тот же тест ходит по страницам штатным WebDriver API и параллельно слушает сетевые события через CDP. Навигация, поиск элементов и submit остаются на WebDriver, а на время разбора нестабильного сценария включается Network.enable, и события пишутся в тот же лог, что и шаги теста. Разобрались — выключили; кросс-браузерность сюиты при этом не пострадала.

Логи и наблюдаемость

Структурированные логи помогают сравнивать поведение CAPTCHA между релизами и быстро находить регрессии в собственных формах:

import json, time, logging

log = logging.getLogger('captcha-qa')

def record(event: str, **fields) -> None:
    payload = {'ts': time.time(), 'event': event, **fields}
    log.info(json.dumps(payload, ensure_ascii=False))

Минимальный набор полей для каждой попытки: slug, captcha_type, task_id, wait_seconds, verify_status, env. Этого достаточно, чтобы построить дашборд медианы / P90 / P99 по типу CAPTCHA и по среде. Если в логи попадает что-то помимо технических метрик, держите в голове 152-ФЗ «О персональных данных» и его зарубежные аналоги: в QA-логах нужны фиктивные значения, а не реальные пользовательские данные.

Сколько потоков заложить в бюджет

Выбор протокола не влияет на счёт за решение CAPTCHA: CaptchaAI тарифицируется по потокам, а не по числу решений, и одна задача занимает один поток независимо от того, кто её отправил — Selenium-тест или CDP-скрипт. Влияет параллельность сюиты. Ночная регрессия в пять воркеров укладывается в BASIC ($15/мес, 5 потоков). Если CI гоняет несколько сюит сразу и пиковая параллельность доходит до пятнадцати задач — нужен STANDARD ($30/мес, 15 потоков). Большая матрица «браузер × окружение» с полусотней одновременных сценариев — это уже ADVANCE ($90/мес, 50 потоков). Считайте по пиковой одновременности, а не по сумме прогонов за сутки; для команды, которая планирует бюджет в валюте с плавающим курсом, предсказуемый месячный платёж считается проще поштучной тарификации.

Из типов, которые встречаются на таких стендах, поддерживаются reCAPTCHA v2 и v3, Cloudflare Turnstile и Cloudflare Challenge, GeeTest v3, image/OCR, grid и BLS. CaptchaFox, Friendly Captcha и Lemin доступны в статусе beta. hCaptcha и FunCaptcha не поддерживаются, GeeTest v4 заявлен как «скоро» — если ваша форма закрыта одним из них, планируйте её проверку иначе.

Диагностика частых сбоев

Симптом Что сделать
WebDriver не видит элемент Дождитесь explicit wait
CDP-сессия рвётся Проверьте --remote-debugging-port
Токен не подставляется Проверьте id поля и JS-инициализацию
Нет логов консоли Включите соответствующий domain в CDP
Тест «зелёный», но форма не отправилась Проверяйте токен на своём backend, а не по факту клика

QA-чек-лист перед прогоном

  • Запрос отправляется только на собственные или авторизованные endpoints.
  • Тестовые учётные записи, события и платежи помечены как фиктивные.
  • CAPTCHA-токен проверяется на собственном backend, а не доверяется клиенту.
  • Логи содержат task_id, тип CAPTCHA, время ожидания и pass/fail.
  • Скрипт возвращает корректный exit code, чтобы CI мог принять решение.

FAQ

Нужно ли переписывать сюиту с Selenium на Playwright ради CAPTCHA?

Нет. Протокол управления браузером не меняет ни время решения, ни результат — задача уходит на сторону API и решается там. Мигрируйте, если вас не устраивает эргономика ожиданий и отладки, но не из-за CAPTCHA.

Сколько потоков заказывать под ночную регрессию?

Считайте пиковое число одновременных задач CAPTCHA, а не их сумму за ночь. Пять параллельных воркеров — это BASIC ($15/мес, 5 потоков), пятнадцать — STANDARD ($30/мес, 15 потоков).

Почему тест падает в headless-режиме, но проходит в обычном?

Чаще всего дело в размере окна и в тайминге: виджет инициализируется позже, а элемент ищется раньше. Задайте явный размер окна, замените sleep на explicit wait и снимите трассировку по CDP, чтобы увидеть фактический порядок запросов.

Можно ли применять это к чужим сайтам?

Нет. Все описанные сценарии рассчитаны на собственные или явно авторизованные среды. Для сторонних ресурсов нужно письменное разрешение владельца.

С чего начать, если интеграции ещё нет?

С быстрого старта CaptchaAI: получите API-ключ, прогоните одну задачу вручную через in.php / res.php и только потом заворачивайте её в тест.

Безопасные связанные руководства

Готовы расширить QA-сюиту? Подключите CaptchaAI.

Комментарии для этой статьи отключены.