Trường Hợp Sử Dụng

Giải quyết CAPTCHA cho QA và kiểm tra ủy quyền

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.

Os comentários estão desativados para este artigo.