حالات الاستخدام

التعامل مع CAPTCHA في اختبارات ضمان الجودة المعتمدة

تحتاج فرق الاختبار إلى التحقق من التدفقات المحمية باستخدام اختبار CAPTCHA بانتظام. يتيح لك CaptchaAI أتمتة هذه الاختبارات دون تفاعل CAPTCHA اليدوي.


عندما تحتاج فرق ضمان الجودة إلى حل اختبار CAPTCHA

السيناريو لماذا يساعد CaptchaAI
اختبار الانحدار التحقق من استمرار عمل النماذج بعد النشر
اختبار نهاية إلى نهاية اختبار رحلات المستخدم الكاملة
اختبار الحمل محاكاة تدفقات CAPTCHA الواقعية على نطاق واسع
اختبار عبر المتصفح التحقق من صحة عرض CAPTCHA عبر المتصفحات
اختبار إمكانية الوصول اختبار التدفقات البديلة للمستخدمين المعاقين

التكامل بيتيست

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.example.com/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)

نمط اختبار السيلينيوم 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 في الموعد المحدد، وليس في كل مرة تقليل تكاليف واجهة برمجة التطبيقات
نتائج اختبار ذاكرة التخزين المؤقت للاختبارات غير المستقرة تجنب إعادة الحلول غير الضرورية
استخدم علامة البيئة لتخطي اختبارات 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، وما إلى ذلك.


أدلة ذات صلة


التعليقات غير مفعّلة لهذا المقال.