Durch CAPTCHA geschützte Seiten unterbrechen automatisierte Tests. CaptchaAI lässt sich in GitHub Actions integrieren, um CAPTCHAs während CI/CD-Testläufen zu lösen und so Ihre Pipeline umweltfreundlich zu halten.
GitHub-Aktionsworkflow
# .github/workflows/captcha-tests.yml
name: CAPTCHA Integration Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: "0 6 * * 1" # Weekly Monday 6 AM
jobs:
captcha-tests:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install dependencies
run: pip install requests pytest
- name: Run CAPTCHA integration tests
env:
CAPTCHAAI_KEY: ${{ secrets.CAPTCHAAI_KEY }}
run: pytest tests/test_captcha.py -v --tb=short
Speichern Sie den API-Schlüssel als GitHub-Geheimnis
- Gehen Sie zu Einstellungen → Geheimnisse und Variablen → Aktionen
- Klicken Sie auf Neues Repository-Geheimnis
- Name:
CAPTCHAAI_KEY - Wert: Ihr CaptchaAI-API-Schlüssel
- Klicken Sie auf Geheimnis hinzufügen
Testdatei
# tests/test_captcha.py
import os
import time
import pytest
import requests
API_KEY = os.environ.get("CAPTCHAAI_KEY")
BASE_URL = "https://ocr.captchaai.com"
def solve_recaptcha(site_key, page_url, timeout=90):
"""Solve reCAPTCHA v2 via CaptchaAI."""
resp = requests.post(f"{BASE_URL}/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"json": 1,
}, timeout=30)
result = resp.json()
assert result.get("status") == 1, f"Submit failed: {result}"
task_id = result["request"]
start = time.time()
while time.time() - start < timeout:
time.sleep(5)
resp = requests.get(f"{BASE_URL}/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}, timeout=15)
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
assert data.get("status") == 1, f"Solve failed: {data}"
return data["request"]
pytest.fail("CAPTCHA solve timed out")
@pytest.mark.skipif(not API_KEY, reason="CAPTCHAAI_KEY not set")
class TestCaptchaIntegration:
"""Integration tests for CAPTCHA-protected flows."""
def test_recaptcha_v2_solve(self):
"""Verify CaptchaAI can solve reCAPTCHA v2."""
token = solve_recaptcha(
site_key="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
page_url="https://www.google.com/recaptcha/api2/demo",
)
assert len(token) > 100
assert token.isascii()
def test_balance_sufficient(self):
"""Ensure account balance is enough for test suite."""
resp = requests.get(f"{BASE_URL}/res.php", params={
"key": API_KEY,
"action": "getbalance",
"json": 1,
})
balance = float(resp.json()["request"])
assert balance > 0.50, f"Low balance: ${balance}"
def test_api_key_valid(self):
"""Verify API key is accepted."""
resp = requests.get(f"{BASE_URL}/res.php", params={
"key": API_KEY,
"action": "getbalance",
"json": 1,
})
result = resp.json()
assert result.get("status") == 1, f"Invalid key: {result}"
Matrixtests (mehrere CAPTCHA-Typen)
jobs:
captcha-matrix:
runs-on: ubuntu-latest
strategy:
matrix:
captcha-type: [recaptcha-v2, turnstile, image]
fail-fast: false
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install dependencies
run: pip install requests pytest
- name: Run ${{ matrix.captcha-type }} tests
env:
CAPTCHAAI_KEY: ${{ secrets.CAPTCHAAI_KEY }}
CAPTCHA_TYPE: ${{ matrix.captcha-type }}
run: pytest tests/test_${{ matrix.captcha-type }}.py -v
Testergebnisse zwischenspeichern
Vermeiden Sie redundante CAPTCHA-Lösungen für unveränderten Code:
- name: Cache test results
uses: actions/cache@v4
with:
path: .test-cache
key: captcha-tests-${{ hashFiles('tests/**') }}
- name: Skip if cached
id: check-cache
run: |
if [ -f .test-cache/passed ]; then
echo "skip=true" >> $GITHUB_OUTPUT
fi
- name: Run tests
if: steps.check-cache.outputs.skip != 'true'
env:
CAPTCHAAI_KEY: ${{ secrets.CAPTCHAAI_KEY }}
run: |
pytest tests/test_captcha.py -v
mkdir -p .test-cache && touch .test-cache/passed
Slack-Benachrichtigung bei Fehler
- name: Notify on failure
if: failure()
uses: slackapi/slack-github-action@v1
with:
payload: |
{
"text": "CAPTCHA tests failed on ${{ github.ref }}",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "CAPTCHA tests *failed* on `${{ github.ref }}`\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View run>"
}
}
]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Tests werden mit „CAPTCHAAI_KEY nicht festgelegt“ übersprungen. | Geheimnis nicht konfiguriert | Geheimnis in den Repo-Einstellungen hinzufügen |
| Zeitüberschreitung in CI, funktioniert aber lokal | Latenz des Runner-Netzwerks | Timeout auf 120 Sekunden erhöhen |
| Die Überprüfung des Kontostands schlägt fehl | Problem mit dem Schlüsselformat | Stellen Sie sicher, dass der geheime Wert kein Leerzeichen enthält |
| Der Workflow wird nie ausgeführt | Falsche branch/trigger-Konfiguration | Überprüfen Sie den on:-Block in YAML |
FAQ
Wie viel kostet die Durchführung von CAPTCHA-Tests in CI?
Eine typische Testsuite, die 3–5 CAPTCHAs löst, kostet 0,01–0,03 US-Dollar pro Durchgang. Wöchentlich geplante Läufe kosten etwa 0,10–0,15 $/month.
Sollte ich bei jedem PR CAPTCHA-Tests durchführen?
Führen Sie bei jedem PR eine Kontostand- und Schlüsselvalidierung durch. Führen Sie vollständige CAPTCHA-Lösungstests bei der Zusammenführung mit der Hauptversion oder nach einem wöchentlichen Zeitplan durch, um die Kosten zu minimieren.
Kann ich dies mit anderen CI-Plattformen verwenden?
Ja. Der Python-Testcode funktioniert in GitLab CI, CircleCI oder Jenkins genauso. Lediglich die Workflow-YAML-Syntax unterscheidet sich.
Verwandte Leitfäden
- Erstellen Sie eine automatisierte Testpipeline
- CAPTCHA in CI-Testsuiten
Pipeline grün halten – Holen Sie sich CaptchaAI für CI/CD.
Diskussionen (0)
Beteiligen Sie sich an der Unterhaltung
Melden Sie sich an, um Ihre Meinung zu teilen.
AnmeldenNoch keine Kommentare.