Phạm vi an toàn: Bài viết chỉ áp dụng cho môi trường QA hoặc staging bạn sở hữu hoặc được uỷ quyền, không áp dụng cho hệ thống bên thứ ba.
Cùng một bộ test, nhưng CI chạy buổi sáng thì xanh còn buổi chiều thì đỏ vì widget CAPTCHA bất ngờ hiện thử thách. Nguyên nhân thường không nằm ở code test: hành vi CAPTCHA thay đổi theo kịch bản gửi request, nên bộ QA chạy đúng một kịch bản chỉ đo được lát cắt rất hẹp. Bài viết trình bày cách dựng ma trận kịch bản QA nội bộ và cách đo kết quả trên staging.
Dựng ma trận kịch bản kiểm thử
Một team ở TP.HCM phục vụ cả khách trong nước lẫn nước ngoài sẽ thấy widget CAPTCHA phản ứng khác nhau giữa các nhóm, nên một runner CI cố định không tái tạo được lớp hành vi ấy. Hãy giữ một bảng kịch bản nhỏ:
- Kịch bản nền: runner CI mặc định — đường cơ sở của bạn.
- Kịch bản phiên cố định nội bộ: giữ một phiên qua các bước load trang, lấy token và submit, để kiểm tra ràng buộc phiên trong backend QA.
- Kịch bản trình duyệt: Playwright hoặc Selenium, chế độ headless và có giao diện — đôi khi cho kết quả khác nhau.
- Kịch bản tải: nhiều luồng song song để xem hàng đợi giãn ra thế nào.
Mọi kịch bản trỏ tới cùng domain staging (staging.example.com/qa-login) với cùng cấu hình CAPTCHA của production.
Đo cái gì và ghi lại như thế nào
Với mỗi lần chạy, thu thập tối thiểu:
| Chỉ số | Ngưỡng tham chiếu |
|---|---|
| Tỷ lệ challenge | So với đường cơ sở của bạn |
| Thời gian lấy token | reCAPTCHA v2 <60 s, Cloudflare Turnstile <10 s |
| Mã trạng thái HTTP | 5xx và timeout thì thử lại |
| Độ sâu hàng đợi | Theo số thread của gói |
Ghi nhật ký có cấu trúc và liên kết mọi bước bằng correlation id (ví dụ qua OpenTelemetry). Nếu dữ liệu QA chạm tới thông tin cá nhân, log theo schema còn giúp bạn chứng minh nguyên tắc tối thiểu hoá dữ liệu theo Nghị định 13/2023/NĐ-CP.
Vai trò của CaptchaAI trong staging
CaptchaAI cho phép bộ test chạy hết luồng thay vì dừng ở widget: gửi task, nhận ID task, polling kết quả rồi đặt token vào biểu mẫu QA. Các loại thường gặp — reCAPTCHA v2 và v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest v3, CAPTCHA ảnh/OCR — đều được hỗ trợ. Cần nói rõ: hCaptcha, FunCaptcha và GeeTest v4 không được hỗ trợ (GeeTest v4 sắp ra mắt), còn CaptchaFox, Friendly Captcha và Lemin ở giai đoạn beta.
CaptchaAI tính giá theo thread (luồng giải đồng thời), không theo từng lần giải. Với pipeline QA nội bộ, BASIC ($15/tháng, 5 thread) thường đủ; khi thêm kịch bản tải, STANDARD ($30/tháng, 15 thread) là bước nâng tự nhiên.
Ví dụ gọi QA bằng Python
Luồng tối thiểu để kiểm thử một widget trên staging qua CaptchaAI:
import os
import requests
API_KEY = os.environ['CAPTCHAAI_KEY']
QA_PAGE_URL = os.environ['QA_PAGE_URL'] # ví dụ https://staging.example.com/qa-login
QA_SITE_KEY = os.environ['QA_SITE_KEY']
def submit_qa_recaptcha() -> str:
payload = {
'clientKey': API_KEY,
'task': {
'type': 'NoCaptchaTaskProxyless',
'websiteURL': QA_PAGE_URL,
'websiteKey': QA_SITE_KEY,
},
}
response = requests.post(
'https://api.captchaai.com/createTask',
json=payload,
timeout=30,
)
response.raise_for_status()
return response.json()['taskId']
def fetch_qa_result(task_id: str) -> dict:
payload = {'clientKey': API_KEY, 'taskId': task_id}
response = requests.post(
'https://api.captchaai.com/getTaskResult',
json=payload,
timeout=30,
)
response.raise_for_status()
return response.json()
Gắn taskId vào correlation id để truy lại kịch bản sinh ra thời gian giải bất thường.
Khắc phục sự cố thường gặp
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Không thấy widget | Selector/timing | Soát wait_for_selector |
ERROR_NO_SLOT_AVAILABLE |
Hàng đợi đầy | Thử lại với backoff |
| Backend từ chối token | Sai action/sitekey/secret | Đối chiếu cấu hình |
| Kết quả lệch giữa kịch bản | Staging lệch cấu hình | Soát biến môi trường |
Danh mục kiểm tra trước khi đưa vào CI
- Khoá CaptchaAI nằm trong CI secret hoặc vault, không nằm trong mã nguồn.
- Thử lại idempotent kèm giới hạn cho lỗi tạm thời.
- Ma trận kịch bản phiên bản hoá cùng mã nguồn.
Câu hỏi thường gặp
Cần bao nhiêu kịch bản QA là đủ?
Bốn kịch bản như trên là điểm khởi đầu hợp lý. Quan trọng hơn là giữ nguyên chúng qua các sprint để có đường cơ sở.
CaptchaAI có giải được hCaptcha không?
Không. hCaptcha và FunCaptcha không nằm trong danh sách hỗ trợ. Hãy đổi widget bản sao QA sang loại được hỗ trợ.
Gói nào phù hợp cho pipeline QA nội bộ?
BASIC ($15/tháng, 5 thread) đủ cho vài kịch bản song song. Vì mỗi thread giải không giới hạn số lần, yếu tố quyết định là mức đồng thời của CI.
Hướng dẫn liên quan an toàn
- Quickstart CaptchaAI
- QA được uỷ quyền
- Kiểm thử endpoint
- Trình duyệt hỏng, API chạy
- reCAPTCHA v2 qua API
- Cloudflare Turnstile qua API
- GeeTest v3 qua API
Xác thực tích hợp CAPTCHA nội bộ với CaptchaAI.