Phạm vi an toàn: Hướng dẫn này chỉ áp dụng cho môi trường QA, staging hoặc pre-production thuộc sở hữu hoặc được uỷ quyền của bạn — không áp dụng cho bên thứ ba hoặc luồng không được phép.
Suite QA chạy đúng nhưng ngày càng chậm khi số kịch bản tăng lên? Vấn đề hiếm khi nằm ở CaptchaAI — nó thường nằm ở cách bạn quản lý concurrency và BrowserContext trong Puppeteer. Bốn mẫu dưới đây giúp pipeline kiểm thử CAPTCHA trên staging chạy nhanh hơn và dễ chẩn đoán hơn.
Giới hạn concurrency theo qa_case, không theo cảm tính
Đặt trần song song theo qa_case thay vì một con số cố định cho toàn suite. Mỗi kịch bản tốn chi phí CaptchaAI và tải staging khác nhau, nên trần chung dễ nghẽn quota hoặc đẩy hàng đợi vào ERROR_NO_SLOT_AVAILABLE không cần thiết. Vấn đề này quen thuộc với đội QA outsourcing ở TP.HCM hay Hà Nội chạy song song cho nhiều khách hàng: không tách concurrency theo client, một client lỗi selector kéo theo backlog của các client khác.
Ví dụ: gọi CaptchaAI trong kịch bản QA
Đoạn mã Python dưới đây minh hoạ luồng tối thiểu để kiểm thử một CAPTCHA widget trên staging của bạn 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()
Tái sử dụng BrowserContext để rút ngắn thời gian chạy
Chia sẻ BrowserContext giữa các bước không phá huỷ trạng thái thay vì khởi tạo lại cho từng bước — cắt bớt thời gian khởi động trình duyệt lặp lại, phần tốn thời gian nhất trong nhiều suite Puppeteer trên CI.
Đóng handle sạch trong finally
Đảm bảo page và context luôn được đóng trong khối finally, kể cả khi bước trước ném lỗi — handle rò rỉ là nguyên nhân phổ biến khiến runner CI chậm dần hoặc hết bộ nhớ.
Log có cấu trúc cho mỗi lần chạy QA
Chỉ số cần thu thập
Chỉ số tối thiểu: tổng thời gian lấy token, mã trạng thái HTTP, ID task và độ sâu hàng đợi.
Liên kết các bước bằng correlation ID
Tách các môi trường (development, staging, pre-production) thành kênh log riêng, và liên kết các bước qua một correlation ID. Phát lại cả kịch bản từ một ID duy nhất thường cắt giảm thời gian chẩn đoán ít nhất một nửa.
Bảng khắc phục sự cố thường gặp
| Vấn đề | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Test không tìm thấy widget | Thay đổi selector hoặc thời điểm load | Kiểm tra lại selector và wait_for_selector trên staging |
CaptchaAI trả ERROR_NO_SLOT_AVAILABLE |
Hàng đợi đầy tạm thời do concurrency vượt trần theo qa_case | Thử lại với backoff trong pipeline nội bộ |
| Backend QA từ chối token | Sai action/sitekey/secret giữa các môi trường | Đối chiếu cấu hình backend với staging |
Danh mục kiểm tra trước khi đưa vào CI
- Phạm vi kiểm thử giới hạn trong ứng dụng của bạn hoặc tài nguyên đã uỷ quyền.
- API key CaptchaAI nằm trong CI secret hoặc vault, không nằm trong mã nguồn.
- Mỗi lần chạy ghi lại thời gian gọi và mã trạng thái phản hồi.
- Có chính sách thử lại idempotent kèm giới hạn cho lỗi tạm thời.
- Bài kiểm thử tái lập được trên CI, không cần can thiệp.
Câu hỏi thường gặp
Quy trình này có ảnh hưởng tới lưu lượng production không?
Không. Mọi ví dụ giả định một môi trường được uỷ quyền như staging.example.com hoặc domain QA do bạn sở hữu — tái tạo cấu hình CAPTCHA của production ở đó trước khi chạy suite.
Nên giới hạn bao nhiêu context song song trên CI?
Không có con số chung — đặt trần theo qa_case và theo dõi độ sâu hàng đợi thay vì đoán cố định. ERROR_NO_SLOT_AVAILABLE thường xuyên là dấu hiệu trần đang cao hơn khả năng xử lý.
Có thể đặt API key trực tiếp trong mã không?
Không. Hãy nạp khoá qua trình quản lý secret của CI, biến môi trường hoặc vault. Khoá đã commit vào kho mã phải được xoay vòng ngay lập tức.
Bạn khuyến nghị gì cho lỗi tạm thời?
Thử lại idempotent kèm exponential backoff (1s, 2s, 4s) và giới hạn trên. Lỗi mạng, mã 5xx và ERROR_NO_SLOT_AVAILABLE nên thử lại; lỗi xác thực kéo dài thì không.
Hướng dẫn liên quan an toàn
- CaptchaAI quickstart
- Kiểm thử QA CAPTCHA được uỷ quyền
- Kiểm thử endpoint CAPTCHA trên biểu mẫu của bạn
- Khi kiểm thử trình duyệt thất bại còn API thành công: gỡ lỗi
- Giải reCAPTCHA v2 qua API
- Giải Cloudflare Turnstile qua API
- Giải GeeTest v3 qua API
Xác thực tích hợp CAPTCHA của bạn trong môi trường nội bộ với CaptchaAI.