Безопасный 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-тестирование CAPTCHA в авторизованных средах
- Тестирование CAPTCHA API на собственных формах
- Отладка: браузерный тест падает, API проходит
Готовы расширить QA-сюиту? Подключите CaptchaAI.