Test ekiplerinin CAPTCHA korumalı akışları düzenli olarak doğrulaması gerekir. CaptchaAI, bu testleri manuel CAPTCHA etkileşimi olmadan otomatikleştirmenize olanak tanır.
QA Ekipleri CAPTCHA Çözmeye İhtiyaç Duyduğunda
| Senaryo | CaptchaAI Neden Yardımcı Olur? |
|---|---|
| Regresyon testi | Formların dağıtımdan sonra hala çalıştığını doğrulayın |
| Uçtan uca test | Kullanıcı yolculuklarının tamamını test edin |
| Yük testi | Gerçekçi CAPTCHA akışlarını uygun ölçekte simüle edin |
| Tarayıcılar arası test | Tarayıcılarda CAPTCHA oluşturma işlemlerini doğrulama |
| Erişilebilirlik testi | Engelli kullanıcılar için alternatif akışları test edin |
Pytest Entegrasyonu
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.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)
Selenyum E2E Test Modeli
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()
Test Yapılandırması
# 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)",
]
"""
Yalnızca CAPTCHA testlerini çalıştırın:
pytest -m captcha -v
CAPTCHA testleri olmadan çalıştırın (hızlı işlem hattı):
pytest -m "not captcha" -v
Uygun Maliyetli Test İpuçları
| Strateji | Fayda |
|---|---|
| Hazırlama ortamını kullan | Daha düşük CAPTCHA zorluğu |
| CAPTCHA testlerini her seferde değil, planlandığı gibi çalıştırın | API maliyetlerini azaltın |
| Kesintili testler için önbellek testi sonuçları | Gereksiz yeniden çözümlerden kaçının |
| CAPTCHA'ları yerel olarak atlamak için ortam bayrağını kullanın | Geliştirme sırasında maliyetlerden tasarruf edin |
| Özel CI işinde toplu CAPTCHA testleri | Boru hattı başına maliyetleri kontrol edin |
SSS
CAPTCHA testlerini çalıştırmanın maliyeti nedir?
Her reCAPTCHA v2'nin maliyeti ~0,003$'dır. 50 CAPTCHA testi içeren bir test paketinin maliyeti çalıştırma başına ~0,15 ABD dolarıdır. Günlük çalıştırma maliyeti ~4,50$/month.
CAPTCHA'ları birim testlerde çözmeli miyim?
Hayır. Birim testlerinde sahte CAPTCHA yanıtları. Yalnızca entegrasyondaki gerçek CAPTCHA'ları ve gerçek ortamlara karşı E2E testlerini çözün.
CaptchaAI'yi diğer test çerçeveleriyle kullanabilir miyim?
Evet. CaptchaAI HTTP tabanlıdır, dolayısıyla Jest, Mocha, JUnit, NUnit vb. gibi herhangi bir dildeki herhangi bir test çerçevesiyle çalışır.
İlgili Kılavuzlar
QA işlem hattınızı otomatikleştirin —testlerinize CaptchaAI ekleyin.