Командам тестирования необходимо регулярно проверять потоки, защищенные CAPTCHA. CaptchaAI позволяет автоматизировать эти тесты без ручного взаимодействия с CAPTCHA.
Когда командам контроля качества необходимо решение CAPTCHA
| Сценарий | Почему CaptchaAI помогает |
|---|---|
| Регрессионное тестирование | Убедитесь, что формы по-прежнему работают после развертывания. |
| Сквозное тестирование | Тестируйте полный путь пользователя |
| Нагрузочное тестирование | Моделируйте реалистичные потоки CAPTCHA в большом масштабе |
| Кроссбраузерное тестирование | Проверка отображения CAPTCHA в браузерах |
| Тестирование доступности | Тестирование альтернативных потоков для пользователей с ограниченными возможностями |
Интеграция с Pytest
import pytest
import requests
import time
class CaptchaTestHelper:
"""Helper for solving CAPTCHAs in test environments."""
def __init__(self, api_key):
self.api_key = api_key
def solve_recaptcha(self, sitekey, pageurl, timeout=120):
"""Solve reCAPTCHA and return token."""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": self.api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1,
}, timeout=30)
result = resp.json()
assert result.get("status") == 1, f"Submit failed: {result}"
task_id = result["request"]
deadline = time.time() + timeout
time.sleep(10)
while time.time() < deadline:
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key, "action": "get",
"id": task_id, "json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
return data["request"]
if data["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {data['request']}")
time.sleep(5)
raise TimeoutError("CAPTCHA solve timeout")
@pytest.fixture(scope="session")
def captcha_helper():
"""Provide CaptchaAI helper for test session."""
import os
api_key = os.environ.get("CAPTCHAAI_API_KEY")
if not api_key:
pytest.skip("CAPTCHAAI_API_KEY not set")
return CaptchaTestHelper(api_key)
class TestLoginFlow:
"""Test login flow behind reCAPTCHA."""
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
LOGIN_URL = "https://staging.https://staging.example.com/qa-login"
def test_login_with_valid_credentials(self, captcha_helper):
"""Verify login succeeds with valid creds and solved CAPTCHA."""
token = captcha_helper.solve_recaptcha(self.SITEKEY, self.LOGIN_URL)
assert token and len(token) > 100
resp = requests.post(self.LOGIN_URL, data={
"username": "test_user",
"password": "test_pass",
"g-recaptcha-response": token,
})
assert resp.status_code == 200
assert "Welcome" in resp.text
def test_login_with_invalid_credentials(self, captcha_helper):
"""Verify login fails gracefully with bad creds but valid CAPTCHA."""
token = captcha_helper.solve_recaptcha(self.SITEKEY, self.LOGIN_URL)
resp = requests.post(self.LOGIN_URL, data={
"username": "wrong_user",
"password": "wrong_pass",
"g-recaptcha-response": token,
})
assert resp.status_code in (200, 401)
assert "Invalid" in resp.text or "error" in resp.text.lower()
def test_login_without_captcha_fails(self):
"""Verify login rejects submissions without CAPTCHA."""
resp = requests.post(self.LOGIN_URL, data={
"username": "test_user",
"password": "test_pass",
})
assert resp.status_code in (400, 403, 422)
Тестовый шаблон Selenium E2E
import pytest
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
@pytest.fixture
def browser():
"""Create browser for testing."""
options = webdriver.ChromeOptions()
options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(options=options)
yield driver
driver.quit()
class TestRegistrationFlow:
"""Test registration form with CAPTCHA."""
REG_URL = "https://staging.example.com/register"
def test_registration_form_submits(self, browser, captcha_helper):
"""Full registration flow with CAPTCHA solving."""
browser.get(self.REG_URL)
# Fill form
browser.find_element(By.ID, "email").send_keys("test@example.com")
browser.find_element(By.ID, "password").send_keys("SecurePass123!")
browser.find_element(By.ID, "confirm_password").send_keys("SecurePass123!")
# Extract sitekey from page
captcha_div = browser.find_element(By.CSS_SELECTOR, ".g-recaptcha")
sitekey = captcha_div.get_attribute("data-sitekey")
# Solve via API
token = captcha_helper.solve_recaptcha(sitekey, browser.current_url)
# Inject token
browser.execute_script("""
document.querySelector('[name="g-recaptcha-response"]').value = arguments[0];
""", token)
# Trigger callback if needed
callback = captcha_div.get_attribute("data-callback")
if callback:
browser.execute_script(f"window['{callback}'](arguments[0]);", token)
# Submit
browser.find_element(By.CSS_SELECTOR, "button[type=submit]").click()
# Verify success
WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".success-message"))
)
def test_captcha_renders_on_page(self, browser):
"""Verify CAPTCHA widget loads on registration page."""
browser.get(self.REG_URL)
captcha = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".g-recaptcha, iframe[src*='recaptcha']"))
)
assert captcha.is_displayed()
Тестовая конфигурация
# conftest.py
import os
# Mark tests that need CAPTCHA solving
def pytest_configure(config):
config.addinivalue_line(
"markers", "captcha: tests requiring CAPTCHA solving (may be slow)"
)
# pytest.ini or pyproject.toml
"""
[tool.pytest.ini_options]
markers = [
"captcha: tests requiring CAPTCHA solving (may be slow)",
]
"""
Запускайте только тесты CAPTCHA:
pytest -m captcha -v
Запуск без тестов CAPTCHA (быстрый конвейер):
pytest -m "not captcha" -v
Советы по экономичному тестированию
| Стратегия | Выгода |
|---|---|
| Используйте промежуточную среду | Более низкая сложность CAPTCHA |
| Запускайте тесты CAPTCHA по расписанию, а не при каждом нажатии | Сократите затраты на API |
| Кэшируйте результаты тестов для нестабильных тестов. | Избегайте ненужных повторных решений |
| Используйте флаг среды, чтобы пропустить CAPTCHA локально | Экономьте затраты во время разработки |
| Пакетное тестирование CAPTCHA в специальном задании CI | Контроль затрат на трубопровод |
Часто задаваемые вопросы
Сколько стоит проведение тестов CAPTCHA?
Каждое решение reCAPTCHA v2 стоит ~ 0,003 доллара США. Набор тестов с 50 тестами CAPTCHA стоит ~ 0,15 доллара за прогон. Ежедневные расходы на эксплуатацию ~$4,50/month.
Стоит ли решать CAPTCHA в модульных тестах?
Нет. Имитация ответов CAPTCHA в модульных тестах. Решайте только настоящие CAPTCHA в интеграционных и E2E-тестах в реальных средах.
Могу ли я использовать CaptchaAI с другими платформами тестирования?
Да. CaptchaAI основан на HTTP, поэтому работает с любой тестовой средой на любом языке — Jest, Mocha, JUnit, NUnit и т. д.
Связанные руководства
Автоматизируйте свой конвейер контроля качества —добавьте CaptchaAI в свои тесты.