undetected-chromedriver ist eine Python-Bibliothek, die auf dem Selenium-ChromeDriver aufbaut und den Browser so konfiguriert, dass er sich verhält wie ein regulärer Chrome-Browser. Sie kümmert sich um den Chrome-Versionsabgleich und setzt die Browser-Konfiguration auf praxisnahe Standardwerte zurück – nützlich für QA-Pipelines, bei denen ein realistisches Browser-Verhalten für korrekte Test-Ergebnisse wichtig ist.
Wenn in Ihrem Test-Szenario ein CAPTCHA auftritt, löst CaptchaAI das Token und gibt es zurück, sodass Ihr Test-Workflow fortgesetzt werden kann.
Abhängigkeiten
pip install undetected-chromedriver requests
Grundlegende Einrichtung
import undetected_chromedriver as uc
import requests
import time
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def create_browser():
# Einen Chrome-Browser fuer automatisierte Tests starten
options = uc.ChromeOptions()
# Fuer CI/CD-Umgebungen ohne Anzeige:
# options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-gpu")
return uc.Chrome(options=options)
CAPTCHA lösen und Token einfügen
def solve_recaptcha_v2(sitekey, pageurl):
resp = requests.post(
f"{CAPTCHAAI_URL}/in.php",
data={
"key": CAPTCHAAI_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1,
},
timeout=30,
)
resp.raise_for_status()
task_id = resp.json()["request"]
for _ in range(30):
time.sleep(5)
result = requests.get(
f"{CAPTCHAAI_URL}/res.php",
params={"key": CAPTCHAAI_KEY, "action": "get", "id": task_id, "json": 1},
timeout=30,
)
result.raise_for_status()
data = result.json()
if data.get("status") == 1:
return data["request"]
raise TimeoutError("CAPTCHA-Lösungszeit abgelaufen")
def inject_recaptcha_token(driver, token):
# Token in das g-recaptcha-response-Feld einfuegen
driver.execute_script(
'document.getElementById("g-recaptcha-response").value = arguments[0];',
token,
)
Vollständiger Testablauf
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def run_integration_test():
# Integrationstests mit CAPTCHA-Handling in eigener Staging-Umgebung
driver = create_browser()
wait = WebDriverWait(driver, 30)
try:
# Eigene Testseite aufrufen
driver.get("https://staging.example-app.test/form")
# Auf Seitenladung warten
wait.until(EC.presence_of_element_located((By.ID, "submit-button")))
# CAPTCHA-Element finden und Sitekey extrahieren
captcha_el = driver.find_element(By.CLASS_NAME, "g-recaptcha")
sitekey = captcha_el.get_attribute("data-sitekey")
pageurl = driver.current_url
# Token lösen und an das eigene Testformular übergeben
token = solve_recaptcha_v2(sitekey, pageurl)
inject_recaptcha_token(driver, token)
# Formular in der Staging-Umgebung absenden
driver.find_element(By.ID, "submit-button").click()
# Erfolg pruefen
success_el = wait.until(
EC.presence_of_element_located((By.CLASS_NAME, "success-message"))
)
print(f"Test bestanden: {success_el.text}")
finally:
driver.quit()
if __name__ == "__main__":
run_integration_test()
Cloudflare Turnstile in ChromeDriver
def solve_turnstile(sitekey, pageurl):
resp = requests.post(
f"{CAPTCHAAI_URL}/in.php",
data={
"key": CAPTCHAAI_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": pageurl,
"json": 1,
},
timeout=30,
)
resp.raise_for_status()
task_id = resp.json()["request"]
for _ in range(24):
time.sleep(5)
result = requests.get(
f"{CAPTCHAAI_URL}/res.php",
params={"key": CAPTCHAAI_KEY, "action": "get", "id": task_id, "json": 1},
timeout=30,
)
result.raise_for_status()
data = result.json()
if data.get("status") == 1:
return data["request"]
raise TimeoutError("Turnstile-Lösungszeit abgelaufen")
def inject_turnstile_token(driver, token):
# Token in das cf-turnstile-response-Feld einfuegen
driver.execute_script(
"document.querySelector(\"[name='cf-turnstile-response']\").value = arguments[0];",
token,
)
Wiederholungslogik für Produktions-Testläufe
import time
def with_retry(fn, retries=3, delay=5.0):
# Funktion mit Wiederholungslogik bei Fehlern ausfuehren
for attempt in range(1, retries + 1):
try:
return fn()
except Exception as exc:
if attempt == retries:
raise
print(
f"Versuch {attempt}/{retries} fehlgeschlagen: {exc} "
f"– neuer Versuch in {delay}s"
)
time.sleep(delay)
Fehlerbehebung
| Problem | Ursache | Maßnahme |
|---|---|---|
| ChromeDriver-Version passt nicht | Chrome-Update | uc.Chrome() lädt automatisch die passende Version |
| CAPTCHA erscheint nicht | Sitekey-Konfiguration | Sitekey in der Staging-Config prüfen |
| Token nach Einspeisung abgelehnt | Token abgelaufen (>120 s) | Token zeitnah nach Lösung einspeisen |
| NoSuchElementException | DOM-Änderung | Selektoren in der Staging-Umgebung prüfen |
| Session abgelaufen | Cookie-Verwaltung | Cookies zwischen Tests beibehalten |
FAQ
Wird der Chrome-Versionsabgleich automatisch gehandhabt?
Ja, undetected-chromedriver lädt automatisch die zum installierten Chrome passende ChromeDriver-Version herunter.
Kann ich die Bibliothek in headless CI/CD-Umgebungen einsetzen?
Ja, mit options.add_argument("--headless=new") und --no-sandbox. Testen Sie zuerst in headed mode, um sicherzustellen, dass CAPTCHA-Selektoren korrekt sind.
Was passiert, wenn kein CAPTCHA erscheint?
Wenn das CAPTCHA-Element nicht im DOM gefunden wird, überspringen Sie den Lösungsschritt und fahren Sie mit dem Test fort.
Verwandte Leitfäden
- Python + Selenium + CaptchaAI
- CAPTCHA-Token-Injection-Methoden
- Fehlerbehandlung und Wiederholungslogik
Integrieren Sie CaptchaAI in Ihre Selenium-Test-Pipeline – Holen Sie sich Ihren CaptchaAI-Schlüssel.