Các nhóm thử nghiệm cần thường xuyên xác minh các luồng được bảo vệ bằng CAPTCHA. CaptchaAI cho phép bạn tự động hóa các thử nghiệm này mà không cần tương tác CAPTCHA thủ công.
Khi nhóm QA cần giải CAPTCHA
| Kịch bản | Tại sao CaptchaAI lại giúp ích |
|---|---|
| Kiểm tra hồi quy | Xác minh biểu mẫu vẫn hoạt động sau khi triển khai |
| Thử nghiệm từ đầu đến cuối | Kiểm tra toàn bộ hành trình của người dùng |
| Kiểm tra tải | Mô phỏng các luồng CAPTCHA thực tế trên quy mô lớn |
| Kiểm tra trên nhiều trình duyệt | Xác thực kết xuất CAPTCHA trên các trình duyệt |
| Kiểm tra khả năng tiếp cận | Kiểm tra các luồng thay thế cho người dùng khuyết tật |
Tích hợp 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.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)
Mẫu thử nghiệm 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()
Cấu hình thử nghiệm
# 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)",
]
"""
Chỉ chạy thử nghiệm CAPTCHA:
pytest -m captcha -v
Chạy mà không cần kiểm tra CAPTCHA (đường dẫn nhanh):
pytest -m "not captcha" -v
Mẹo kiểm tra hiệu quả về chi phí
| Chiến lược | lợi ích |
|---|---|
| Sử dụng môi trường dàn dựng | Độ khó CAPTCHA thấp hơn |
| Chạy kiểm tra CAPTCHA theo lịch trình, không phải mỗi lần đẩy | Giảm chi phí API |
| Kết quả kiểm tra bộ đệm cho các bài kiểm tra không ổn định | Tránh giải quyết lại không cần thiết |
| Sử dụng cờ môi trường để bỏ qua CAPTCHA cục bộ | Tiết kiệm chi phí trong quá trình phát triển |
| Kiểm tra CAPTCHA hàng loạt trong công việc CI chuyên dụng | Kiểm soát chi phí trên mỗi đường ống |
Câu hỏi thường gặp
Chi phí để chạy thử nghiệm CAPTCHA là bao nhiêu?
Mỗi giải reCAPTCHA v2 có giá ~ 0,003 USD. Một bộ thử nghiệm với 50 lần kiểm tra CAPTCHA có giá ~0,15 USD mỗi lần chạy. Chi phí hoạt động hàng ngày ~$4,50/month.
Tôi có nên giải CAPTCHA trong bài kiểm tra đơn vị không?
Không. Giả lập phản hồi CAPTCHA trong các bài kiểm tra đơn vị. Chỉ giải CAPTCHA thực trong các thử nghiệm tích hợp và E2E trong môi trường thực.
Tôi có thể sử dụng CaptchaAI với các khung thử nghiệm khác không?
Vâng. CaptchaAI dựa trên HTTP, do đó, nó hoạt động với mọi khung kiểm tra bằng bất kỳ ngôn ngữ nào - Jest, Mocha, JUnit, NUnit, v.v.
Hướng dẫn liên quan
Tự động hóa quy trình QA của bạn —thêm CaptchaAI vào thử nghiệm của bạn.