Kasus Penggunaan

Solve CAPTCHA untuk QA dan Pengujian Resmi

Tim pengujian perlu memverifikasi aliran yang dilindungi CAPTCHA secara rutin. CaptchaAI memungkinkan Anda mengotomatiskan pengujian ini tanpa interaksi CAPTCHA manual.


Saat Tim QA Membutuhkan Solve CAPTCHA

Skenario Mengapa CaptchaAI Membantu
Pengujian regresi Verifikasi form masih berfungsi setelah deployment
Pengujian end-to-end Uji user journey secara lengkap
Load testing Simulasikan flow CAPTCHA realistis dalam skala besar
Pengujian lintas browser Validasi rendering CAPTCHA di semua browser
Pengujian aksesibilitas Uji alur alternatif untuk pengguna penyandang disabilitas

Integrasi 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)

Pola Uji 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()

Konfigurasi Tes

# 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)",
]
"""

Jalankan hanya tes CAPTCHA:

pytest -m captcha -v

Jalankan tanpa tes CAPTCHA (pipeline cepat):

pytest -m "not captcha" -v

Tip Pengujian Hemat Biaya

Strategi Manfaat
Gunakan environment staging CAPTCHA difficulty lebih rendah
Jalankan tes CAPTCHA terjadwal, bukan setiap push Mengurangi biaya API
Cache hasil tes untuk tes yang tidak stabil Hindari solve ulang yang tidak perlu
Gunakan flag environment untuk skip CAPTCHA secara lokal Hemat biaya selama pengembangan
Batch tes CAPTCHA dalam CI job khusus Kontrol biaya per pipeline

Pertanyaan Umum

Berapa biaya untuk menjalankan tes CAPTCHA?

Setiap solve reCAPTCHA v2 berharga ~$0,003. Suite pengujian dengan 50 tes CAPTCHA berharga ~$0,15 per run. Biaya operasional harian ~$4,50/bulan.

Haruskah saya solve CAPTCHA dalam unit test?

Tidak. Mock respons CAPTCHA dalam unit test. Hanya solve CAPTCHA nyata dalam pengujian integrasi dan E2E terhadap environment nyata.

Bisakah saya menggunakan CaptchaAI dengan framework pengujian lain?

Ya. CaptchaAI berbasis HTTP, sehingga bisa digunakan dengan framework pengujian apa pun dalam bahasa apa pun — Jest, Mocha, JUnit, NUnit, dll.


Panduan Terkait


Otomatiskan pipeline QA Anda — tambahkan CaptchaAI ke pengujian Anda.

Komentar dinonaktifkan untuk artikel ini.