Registrierungssysteme für Universitätskurse verwenden reCAPTCHA v2, um Anmeldeformulare, Kurssuchseiten und Stundenplaner zu schützen. QA-Teams, die diese Systeme testen, müssen CAPTCHAs in mehreren Testszenarien verarbeiten – Registrierungsworkflows, Wartelistenlogik, Sitzplatzverfügbarkeit und Fristendurchsetzung. Hier erfahren Sie, wie Sie die Lösung von CAPTCHAs in Registrierungstests integrieren.
Wo CAPTCHAs in Registrierungssystemen erscheinen
Registrierungsschritt
CAPTCHA-Typ
Zweck
Anmeldeseite für Studierende
reCAPTCHA v2
Verhindern Sie Credential Stuffing
Kurssuche/browse
reCAPTCHA v2
Beschränken Sie automatisierte Suchvorgänge
Fügen Sie /drop-Kurse hinzu
reCAPTCHA v2
Verhindern Sie die automatische Registrierung
Registrierung auf der Warteliste
reCAPTCHA v2
Blockieren Sie Bots zur automatischen Registrierung
Zeitplanplaner
Cloudflare Turnstile
Schützen Sie interaktive Tools
Transkriptanfragen
reCAPTCHA v2
Überprüfen Sie den menschlichen Benutzer
Registrierungstests mit CAPTCHA-Lösung
import requests
import time
import re
class RegistrationTester:
def __init__(self, api_key, portal_url):
self.api_key = api_key
self.portal_url = portal_url
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
def test_login(self, student_id, password):
"""Test login flow with CAPTCHA handling."""
login_page = self.session.get(f"{self.portal_url}/login")
site_key = self._extract_site_key(login_page.text)
token = self._solve_recaptcha(site_key, f"{self.portal_url}/login")
response = self.session.post(f"{self.portal_url}/login", data={
"studentId": student_id,
"password": password,
"g-recaptcha-response": token
})
return {
"status": response.status_code,
"redirected": response.url != f"{self.portal_url}/login",
"success": "dashboard" in response.url or response.status_code == 200
}
def test_course_search(self, term, department, level=None):
"""Test course search returns correct results."""
params = {"term": term, "dept": department}
if level:
params["level"] = level
response = self.session.get(
f"{self.portal_url}/courses/search", params=params
)
if self._has_captcha(response.text):
site_key = self._extract_site_key(response.text)
token = self._solve_recaptcha(
site_key, f"{self.portal_url}/courses/search"
)
response = self.session.post(
f"{self.portal_url}/courses/search",
data={**params, "g-recaptcha-response": token}
)
courses = self._parse_courses(response.text)
return {
"count": len(courses),
"courses": courses,
"all_match_dept": all(
c["department"] == department for c in courses
)
}
def test_enrollment(self, course_id, section):
"""Test enrolling in a course section."""
enroll_page = self.session.get(
f"{self.portal_url}/enroll/{course_id}/{section}"
)
if self._has_captcha(enroll_page.text):
site_key = self._extract_site_key(enroll_page.text)
token = self._solve_recaptcha(
site_key,
f"{self.portal_url}/enroll/{course_id}/{section}"
)
else:
token = None
form_data = {
"courseId": course_id,
"section": section,
"confirm": "true"
}
if token:
form_data["g-recaptcha-response"] = token
response = self.session.post(
f"{self.portal_url}/enroll/submit",
data=form_data
)
return {
"status": response.status_code,
"enrolled": "success" in response.text.lower(),
"waitlisted": "waitlist" in response.text.lower(),
"error": self._extract_error(response.text)
}
def test_seat_availability(self, course_ids):
"""Test seat availability display for multiple courses."""
results = []
for course_id in course_ids:
response = self.session.get(
f"{self.portal_url}/courses/{course_id}"
)
if self._has_captcha(response.text):
site_key = self._extract_site_key(response.text)
token = self._solve_recaptcha(
site_key, f"{self.portal_url}/courses/{course_id}"
)
response = self.session.post(
f"{self.portal_url}/courses/{course_id}",
data={"g-recaptcha-response": token}
)
availability = self._parse_availability(response.text)
results.append({"course_id": course_id, **availability})
return results
def _has_captcha(self, html):
return "g-recaptcha" in html or "recaptcha" in html.lower()
def _extract_site_key(self, html):
match = re.search(r'data-sitekey="([^"]+)"', html)
if match:
return match.group(1)
raise ValueError("reCAPTCHA site key not found")
def _solve_recaptcha(self, site_key, page_url):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": self.api_key,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"json": 1
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(3)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key,
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"]
raise TimeoutError("reCAPTCHA solve timed out")
def _parse_courses(self, html):
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
def text_or_empty(node):
return node.text.strip() if node and node.text else ""
courses = []
for row in soup.select(".course-row, tr.course"):
courses.append({
"id": row.get("data-course-id", ""),
"department": text_or_empty(row.select_one(".dept")),
"number": text_or_empty(row.select_one(".number")),
"title": text_or_empty(row.select_one(".title")),
"seats": text_or_empty(row.select_one(".seats"))
})
return courses
def _parse_availability(self, html):
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
def text_or_none(node):
return node.text.strip() if node and node.text else None
return {
"total_seats": text_or_none(soup.select_one(".total-seats")),
"enrolled": text_or_none(soup.select_one(".enrolled-count")),
"available": text_or_none(soup.select_one(".available-seats")),
"waitlist": text_or_none(soup.select_one(".waitlist-count"))
}
def _extract_error(self, html):
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
error = soup.select_one(".error-message, .alert-danger")
return error.text.strip() if error else None
re CAPTCHA v 2, Cloudflare Turnstile und Bild-CAPTCHAs auf Webformularen mit Selenium und Captcha AI lösen – Felder ausfüllen, Token eintragen, Formular absende...
re CAPTCHA v 2, Cloudflare Turnstile und Bild-CAPTCHAs auf Webformularen mit Selenium und Captcha AI lösen – F...
May 02, 2026
Anwendungsfälle
CAPTCHAs in automatisierten E 2 E-Tests lösen: Captcha AI in Git Hub Actions, Git Lab CI und Jenkins einbinden – mit pytest, Selenium und stabilen Pipelines.
CAPTCHAs in automatisierten E 2 E-Tests lösen: Captcha AI in Git Hub Actions, Git Lab CI und Jenkins einbinden...
May 04, 2026
Anwendungsfälle
Registrierungsflows automatisiert testen: re CAPTCHA v 2 und Cloudflare Turnstile mit Captcha AI lösen, Testnutzer erzeugen und Randfälle in Pytest prüfen.
Registrierungsflows automatisiert testen: re CAPTCHA v 2 und Cloudflare Turnstile mit Captcha AI lösen, Testnu...
May 05, 2026
Anwendungsfälle
Checkout-Flows automatisiert testen: re CAPTCHA v 2/v 3 und Cloudflare Turnstile in jeder Phase – von Warenkorb bis Bestellbestätigung – mit Captcha AI lösen.
Checkout-Flows automatisiert testen: re CAPTCHA v 2/v 3 und Cloudflare Turnstile in jeder Phase – von Warenkor...
May 11, 2026
Tutorials
CAPTCHAs in End-to-End-Tests automatisch lösen: Captcha AI-Fixture für Pytest, Token-Handling in Selenium und ein Git Hub-Actions-Workflow für stabile CI.
CAPTCHAs in End-to-End-Tests automatisch lösen: Captcha AI-Fixture für Pytest, Token-Handling in Selenium und...
May 21, 2026
Integrationen
Netzwerkverkehr in eigener QA mit Selenium Wire sichtbar machen: CAPTCHA-Requests prüfen, Token nachvollziehen und die Captcha AI-Integration verifizieren.
Diskussionen (0)
Beteiligen Sie sich an der Unterhaltung
Melden Sie sich an, um Ihre Meinung zu teilen.
AnmeldenNoch keine Kommentare.