Integrations

Изоляция браузерных профилей для QA с CaptchaAI

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

QA-инженер запускает один и тот же сценарий дважды подряд — и получает два разных результата: в первый раз форма проходит чисто, во второй неожиданно всплывает CAPTCHA, а логин подхватывает чужую сессию. Причина почти всегда одна: браузерный профиль общий, и один тест «протекает» в другой через cookie, localStorage или незакрытую сессию. Изоляция профилей убирает эту причину на уровне инфраструктуры, а не точечными патчами в самом тесте.

Что хранить в каждом QA-профиле

Слой Что хранится
Cookies session, csrf, опционально CAPTCHA-cookie
Local / session storage UI-состояние, фичефлаги
IndexedDB оффлайн-кеш приложения
Service worker registrations оффлайн-режим
Permissions уведомления, геолокация в staging

Почему общий профиль ломает CAPTCHA-тесты

  • Каждый сценарий стартует с заранее известным состоянием cookie — никаких «сюрпризов» от предыдущего прогона.
  • Тестовые аккаунты не пересекаются между сценариями.
  • Прогоны сравнимы друг с другом: медиана и P90 считаются на одинаковых стартовых условиях.
  • Падение одного теста не «отравляет» соседние сценарии в той же CI-очереди.

Это не про обход чьей-то защиты — это обычная инженерная гигиена собственных QA-стендов.

Как устроен один QA-профиль

Каталог ./qa-profiles/checkout-smoke/ хранит данные ровно одного сценария. Запуск браузера с собственным --user-data-dir физически изолирует его от соседних сценариев, если каталог уникален для каждого:

chrome --user-data-dir=./qa-profiles/checkout-smoke \
  https://staging.example.com/checkout-test

В Playwright и Puppeteer тот же принцип реализует userDataDir или persistent context — API отличается, идея та же.

Куда встраивается CaptchaAI в изолированном профиле

Если в staging-форме внутри профиля появляется reCAPTCHA v2 или Cloudflare Turnstile, тест не «выходит» за пределы своей страницы — он запрашивает токен только для неё и кладёт результат прямо в DOM того же профиля:

from playwright.sync_api import sync_playwright

PROFILE = './qa-profiles/checkout-smoke'
PAGE = 'https://staging.example.com/captcha-demo'

with sync_playwright() as p:
    ctx = p.chromium.launch_persistent_context(PROFILE, headless=True)
    page = ctx.new_page()
    page.goto(PAGE)
    sitekey = page.locator('.g-recaptcha').get_attribute('data-sitekey')
    token = solve(sitekey)
    page.evaluate(
        "t => document.getElementById('g-recaptcha-response').value = t",
        token,
    )
    page.click('button[type=submit]')
    ctx.close()

Логи и метрики между релизами

Структурированные логи — быстрый по нашей внутренней выборке способ сравнить поведение 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 и по окружению.

Жизненный цикл профиля в CI

Каталог профиля — обычный CI-артефакт: создаётся перед прогоном, очищается после. Для долгоживущих сценариев (например, e2e-тестов с накопленной историей сессии) сохраняйте snapshot профиля как артефакт сборки и разворачивайте его в начале следующего прогона.

Пример из практики: команда с инженерами в Москве, Минске и Алматы гоняет CI-раннеры в европейском облачном регионе, где живёт и staging, — сетевая разница минимальна, но мобильные и нестабильные каналы у части инженеров всё равно требуют разумных таймаутов и повтора на CAPTCHA-шаге, а не жёсткого фейла с первой попытки. Если профиль хранит данные тестовых пользователей, держите в уме требования 152-ФЗ «О персональных данных» — используйте только синтетические учётные записи и не выгружайте snapshot с реальными данными в общий репозиторий.

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

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

Частые проблемы профиля

Симптом Что делать
В тесте видны чужие cookie Проверьте, что --user-data-dir уникален для каждого сценария
Профиль повреждён после падения теста Удалите каталог и создайте профиль заново
Профиль разрастается на диске Периодически очищайте IndexedDB и кеш между прогонами
CAPTCHA всплывает на каждом прогоне Сохраняйте валидную сессию/cookie между шагами сценария
Токен CaptchaAI не принимается формой Сверьте, что sitekey и pageurl соответствуют реальной странице профиля

FAQ

Можно ли применять такую изоляцию профилей на чужих сайтах?

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

Что делать, если CaptchaAI вернул ошибку при решении CAPTCHA?

Залогируйте task_id, тип CAPTCHA и текст ошибки, повторите запрос с экспоненциальной задержкой и следите за долей ошибок на дашборде. Устойчивый рост ошибок — повод проверить sitekey и саму страницу.

Сколько потоков CaptchaAI нужно для параллельных QA-профилей?

Тарификация у CaptchaAI идёт по одновременным потокам, а не по числу решений: пока один профиль ждёт токен, он занимает один поток. При 10 параллельных профилях берите тариф с запасом по потокам — например, ADVANCE ($90/мес, 50 потоков) — чтобы пиковые прогоны не упирались в лимит.

Как сравнивать результаты между релизами?

Пишите логи в одном формате и стройте отчёт по медиане, P90 и P99 на одинаковом наборе сценариев. Сравнивайте только сопоставимые выборки в собственной среде.

Нужны ли резидентные прокси для QA-профилей в staging?

Обычно нет. Для собственного staging важнее держать сетевые условия — регион, задержку — сопоставимыми между прогонами, чтобы результаты по CAPTCHA оставались воспроизводимыми, а не пытаться имитировать чужой трафик.

Безопасные связанные материалы

Чистые QA-прогоны без пересечения сессий — подключите CaptchaAI в своём staging уже сегодня.

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