Безопасный scope: Это руководство применимо только к собственным или явно авторизованным QA-, staging- и production-средам. Описаны сценарии диагностики, тестирования и наблюдаемости вашей собственной CAPTCHA-интеграции — не для сторонних сайтов и не для несанкционированных workflow.
Тест упал, на скриншоте пустое место вместо виджета, и дальше начинается гадание: виджет не отрисовался, sitekey не тот или backend отверг токен? Selenium Wire снимает вопрос за минуту — он даёт список HTTP-запросов браузера прямо в Python, и по нему сразу видно, дошёл ли запрос до провайдера CAPTCHA и с каким кодом он вернулся. Ниже — что смотреть в трафике, как связать увиденное с решением задачи через CaptchaAI и какие поля логировать, чтобы в следующий раз не гадать вовсе.
Почему трафик информативнее скриншота
DOM показывает результат, трафик показывает причину. Три ситуации выглядят на скриншоте одинаково, а в списке запросов различаются мгновенно:
- запросов к провайдеру нет вообще — скрипт виджета не загрузился (CSP, блокировка домена в тестовой сети, опечатка в шаблоне);
- запрос ушёл, но вернулся 403 — sitekey не соответствует домену staging-стенда;
- запросы прошли с кодом 200, а форма всё равно не принимает отправку — проблема на вашей стороне верификации, а не в CAPTCHA.
Selenium Wire превращает «не работает» в конкретную строку с методом, URL и кодом ответа. Этого обычно достаточно, чтобы понять, чья это зона ответственности.
Установка
pip install selenium-wire selenium
Перехват CAPTCHA-запросов
После загрузки страницы весь перехваченный трафик доступен как обычный список объектов Python — фильтруйте его по имени провайдера:
from seleniumwire import webdriver
driver = webdriver.Chrome()
driver.get('https://staging.example.com/captcha-demo')
for r in driver.requests:
if 'recaptcha' in r.url or 'turnstile' in r.url or 'geetest' in r.url:
print(r.method, r.url, r.response.status_code if r.response else None)
Если список пуст, почти всегда дело в тайминге: страница ещё не успела подтянуть скрипт виджета. Дождитесь появления iframe или добавьте явную паузу перед чтением driver.requests.
На что смотреть в QA
- запрашивает ли виджет ожидаемый sitekey;
- какие токены и cookies отправляет страница на собственный backend верификации;
- видны ли 4xx/5xx ответы провайдера CAPTCHA;
- меняется ли последовательность запросов между релизами.
Последний пункт недооценивают. Набор запросов виджета — это удобный отпечаток релиза: если после обновления фронтенда в трафике появился новый вызов или пропал старый, интеграцию стоит перепроверить до выката.
Интеграция с CaptchaAI
После того как Selenium Wire подтвердил, что виджет работает, QA-сценарий запрашивает токен у CaptchaAI и подставляет его в поле формы:
sitekey = driver.execute_script(
"return document.querySelector('.g-recaptcha').getAttribute('data-sitekey')"
)
token = solve(sitekey)
driver.execute_script(
"document.getElementById('g-recaptcha-response').value = arguments[0]",
token,
)
Имя поля результата зависит от типа проверки: у reCAPTCHA это g-recaptcha-response, у Cloudflare Turnstile — cf-turnstile-response. Отправка задачи и опрос res.php по каждому типу разобраны отдельно: reCAPTCHA v2 через API, Cloudflare Turnstile через API, GeeTest v3 через API.
Деталь, важная для планирования прогонов: CaptchaAI тарифицируется по числу одновременных потоков, а не по количеству решений. Для ночной регрессии на одном стенде обычно хватает тарифа BASIC ($15/мес, 5 потоков) — пять параллельных задач CAPTCHA соответствуют пяти параллельным тестам, а число решений внутри месяца не ограничено. Команде, которая гоняет матрицу браузеров в несколько агентов CI, ближе STANDARD ($30/мес, 15 потоков). Считайте по пиковой параллельности сборки, а не по сумме прогонов за месяц.
Пример: ночная регрессия на распределённом стенде
Типичная схема для команды в Москве, Минске или Алматы: агенты CI подняты в европейском регионе, а staging-стенд живёт в другом дата-центре. Запросы к провайдеру CAPTCHA идут через несколько сетевых сегментов, и «плавающие» падения тестов легко списать на саму проверку. Selenium Wire позволяет проверить эту гипотезу честно: сохраните для каждой попытки код ответа провайдера и время до получения токена, а затем сравните ночной прогон с дневным. Если коды стабильно 200, а разброс времени большой — причина сетевая, и лечится она увеличением тайм-аута ожидания и повторной попыткой, а не правками интеграции.
Отдельно про данные. Если тестовые сценарии затрагивают формы с персональными данными, для читателей в РФ действует 152-ФЗ «О персональных данных». В логи QA попадает только то, что вы вправе обрабатывать: task_id, тип проверки и статусы — да, содержимое пользовательских полей — нет. Это не юридическая консультация, а разумная гигиена тестовых данных.
Логи и наблюдаемость
Структурированные логи помогают сравнивать поведение 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 и по среде. Единый формат строки во всех окружениях важнее красоты вывода: сравнивать выборки можно только тогда, когда поля называются одинаково в dev, staging и production.
Разбор частых симптомов
| Симптом | Что сделать |
|---|---|
| Нет запросов к провайдеру | Проверьте, рендерится ли виджет |
| 403 от провайдера | Сверьте sitekey с конфигурацией staging |
| TLS-ошибка | Обновите корневые сертификаты Selenium Wire |
| Токен не принят backend | Проверьте secret и pageurl |
Ещё две ситуации в таблицу не попали, хотя всплывают регулярно. Первая — длинный прогон начинает есть память: driver.requests накапливает весь трафик, поэтому между сценариями список стоит очищать. Вторая — виджет живёт в iframe, и фильтр по адресу вашей страницы ничего не находит; фильтруйте по домену провайдера.
QA-чек-лист
- Запрос отправляется только на собственные или авторизованные endpoints.
- Тестовые учётные записи, события и платежи помечены как фиктивные.
- CAPTCHA-токен проверяется на собственном backend, а не доверяется клиенту.
- Логи содержат
task_id, тип CAPTCHA, время ожидания и pass/fail. - Скрипт возвращает корректный exit code, чтобы CI мог принять решение.
FAQ
Почему driver.requests пустой, хотя виджет виден на странице?
Список читается слишком рано: скрипт провайдера подгружается асинхронно уже после события загрузки страницы. Дождитесь появления iframe виджета или добавьте явную паузу, затем прочитайте трафик заново.
Работает ли Selenium Wire с браузером в headless-режиме?
Да, перехват трафика от режима не зависит. Но поведение виджета в headless-режиме может отличаться от обычного, поэтому фиксируйте режим в логах — иначе сравнение прогонов между собой окажется некорректным.
Сколько потоков CaptchaAI нужно для CI-прогона?
Считайте по пиковой параллельности: одновременных задач CAPTCHA столько же, сколько параллельных тестов с проверкой. Пять параллельных сценариев укладываются в BASIC ($15/мес, 5 потоков), пятнадцать — в STANDARD ($30/мес, 15 потоков). Число решений внутри месяца не лимитировано.
В трафике виден hCaptcha — что делать?
Selenium Wire покажет запросы любого провайдера, но hCaptcha и FunCaptcha в CaptchaAI не поддерживаются, а GeeTest v4 заявлен как «скоро». Подставить токен вы сможете только для поддерживаемых типов: reCAPTCHA v2/v3, Cloudflare Turnstile и Challenge, GeeTest v3, image/OCR, grid и BLS.
Как понять, что дело в интеграции, а не в самой проверке?
Сопоставьте код ответа провайдера с результатом вашей верификации. Ответ 200 от провайдера плюс отказ на вашем backend означает, что токен не доходит или проверяется не с тем secret; 4xx от провайдера означает, что до вашей логики дело ещё не дошло.
Безопасные связанные руководства
- Быстрый старт CaptchaAI
- QA-тестирование CAPTCHA в авторизованных средах
- Тестирование CAPTCHA API на собственных формах
- Отладка: браузерный тест падает, API проходит
- reCAPTCHA v2 через API
- Cloudflare Turnstile через API
- GeeTest v3 через API
Готовы инспектировать CAPTCHA в собственной staging-среде? Подключите CaptchaAI.