تستخدم أنظمة تسجيل الدورات الجامعية reCAPTCHA v2 لحماية نماذج التسجيل وصفحات البحث في الفصل الدراسي ومخططي الجدول الزمني. تحتاج فرق ضمان الجودة التي تختبر هذه الأنظمة إلى التعامل مع اختبارات CAPTCHA عبر سيناريوهات اختبار متعددة - سير عمل التسجيل، ومنطق قائمة الانتظار، وتوافر المقاعد، وتنفيذ الموعد النهائي. وإليك كيفية دمج حل اختبار CAPTCHA في اختبار التسجيل.
أين تظهر اختبارات CAPTCHA في أنظمة التسجيل
خطوة التسجيل
نوع التحقق
الغرض
صفحة تسجيل دخول الطالب
reCAPTCHA v2
منع حشو أوراق الاعتماد
البحث عن الدورة /browse
reCAPTCHA v2
الحد من عمليات البحث الآلية
إضافة دورات /drop
reCAPTCHA v2
منع التسجيل الآلي
تسجيل قائمة الانتظار
reCAPTCHA v2
منع روبوتات التسجيل التلقائي
مخطط الجدول الزمني
Cloudflare Turnstile
حماية الأدوات التفاعلية
طلبات النسخ
reCAPTCHA v2
التحقق من المستخدم البشري
اختبار التسجيل مع حل اختبار CAPTCHA
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
دليل عملي لأتمتة إرسال النماذج المحمية بـ CAPTCHA عبر Selenium: اكتشف نوع الاختبار، حلّه بـ Captcha AI، ثم احقن الرمز قبل الإرسال مع أمثلة Python جاهزة.
ابنِ فاحصًا آليًا لتدفق التسجيل يحلّ re CAPTCHA v 2 وCloudflare Turnstile عبر Captcha AI، ويغطّي البريد المكرر...
May 03, 2026
الدروس التطبيقية
دليل عملي لدمج Captcha AI في خط أنابيب اختبار آلي: مساعد لحل re CAPTCHA v 2، تركيبات pytest، اختبارات Selenium لتسجيل الدخول وإتمام الشراء عبر Git Hub Actions.
مرِّر اختبارات E 2 E عبر صفحات CAPTCHA داخل خط CI/CD دون تدخل يدوي: مساعد حل، تكامل pytest، وإعداد Git Hub Act...
May 02, 2026
حالات الاستخدام
اختبر نقاط نهاية API المحمية بـ CAPTCHA برمجياً دون متصفح: احصل على رمز حقيقي من Captcha AI، أرفقه في الحمولة، وتحقق من التحقق الخلفي ورموز الخطأ وحدود المعدل.
اختبر نقاط نهاية API المحمية بـ CAPTCHA برمجياً دون متصفح: احصل على رمز حقيقي من Captcha AI، أرفقه في الحمولة،...
May 07, 2026
حالات الاستخدام
تعرّف على كيفية دمج Captcha AI في خط أنابيب ضمان الجودة لأتمتة اختبار النماذج المحمية بـ re CAPTCHA v 2 عبر Pytest وSelenium وCI داخل بيئات مصرّح باختبارها.