Phạm vi an toàn: Các kỹ thuật dưới đây chỉ áp dụng cho staging, QA hoặc pre-production mà bạn sở hữu hoặc được uỷ quyền kiểm thử — không nhắm vào hệ thống của bên thứ ba.
Chạy đi chạy lại cùng một kịch bản QA mà lần nào cũng phải giải lại CAPTCHA từ đầu? Nguyên nhân thường không ở CaptchaAI mà ở việc trình duyệt test khởi tạo một phiên trắng mỗi lần chạy. Lưu cookie và localStorage hợp lệ giữa các lần chạy giúp giảm challenge thừa và làm test dễ tái lập hơn.
Vì sao phiên bền vững giúp giảm CAPTCHA khi test
Nhiều hệ thống CAPTCHA chấm điểm rủi ro theo phiên — càng "sạch" càng dễ bị coi là bot:
- Phiên hoàn toàn mới, chưa cookie, chưa lịch sử duyệt: rủi ro cao, challenge dày hơn.
- Phiên khôi phục từ lần trước, còn cookie hợp lệ: rủi ro thấp, ít challenge thừa hơn.
Đây là vấn đề quen thuộc với các đội QA outsourcing tại TP.HCM hay Hà Nội chạy hàng trăm case CI mỗi ngày: trình duyệt "sạch" mỗi lần tự tạo thêm challenge không phản ánh hành vi thật.
Lưu trạng thái phiên với Playwright
storage_state của Playwright ghi lại cookie và storage vào một file JSON, có thể nạp lại cho lần chạy sau:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
ctx = p.chromium.launch().new_context()
page = ctx.new_page()
page.goto('https://staging.example.com/qa-form')
ctx.storage_state(path='qa-session.json')
Khôi phục phiên cho lần chạy tiếp theo
Nạp lại qa-session.json khi khởi tạo context cho lần chạy kế tiếp của cùng qa_case. Context mới có trạng thái đăng nhập tương tự lần trước — thay vì bắt đầu lại từ trình duyệt trắng.
Các lỗi thường gặp và cách xử lý
| Vấn đề | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Test không tìm thấy widget | Selector hoặc thời điểm load đã đổi | Kiểm tra selector và dùng wait_for_selector trên staging |
CaptchaAI trả ERROR_NO_SLOT_AVAILABLE |
Hàng đợi tạm thời đầy | Thử lại với backoff trong pipeline nội bộ |
| Backend QA từ chối token | Sai action, sitekey hoặc secret | Đối chiếu cấu hình backend với staging |
Gửi token CaptchaAI khi widget vẫn xuất hiện
Widget vẫn có thể xuất hiện dù đã khôi phục phiên — ví dụ khi phiên hết hạn hoặc trang QA cố tình bắt buộc challenge. Khi đó, gửi request tới in.php, poll res.php tới khi có kết quả, rồi xác thực token tại backend QA.
Ghi log để chẩn đoán nhanh hơn
Ghi log có cấu trúc cho mỗi lần chạy QA thay vì chỉ in console. Thu thập thời gian lấy token, mã trạng thái HTTP, ID task và độ sâu hàng đợi; tách theo môi trường và nối bằng một correlation id (OpenTelemetry nếu có). Phát lại chuỗi sự kiện từ một id giúp chẩn đoán nhanh hơn.
Checklist trước khi đưa vào CI
- Phạm vi test giới hạn trong ứng dụng hoặc tài nguyên đã được uỷ quyền.
- API key CaptchaAI nằm trong CI secret hoặc vault, không trong mã nguồn hay file session commit nhầm.
- Mỗi lần chạy ghi lại thời gian gọi và mã trạng thái phản hồi, đồng thời áp dụng thử lại idempotent có giới hạn cho lỗi tạm thời.
- Test tái lập được trên CI, không cần can thiệp.
Ví dụ code: gọi CaptchaAI trong luồng QA
Luồng tối thiểu để giải reCAPTCHA trên trang QA qua CaptchaAI: gửi task rồi lấy kết quả.
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()
Câu hỏi thường gặp
File qa-session.json có an toàn khi commit vào repo không?
Không. File chứa cookie thật của phiên staging — xử lý như secret: lưu qua artefact CI có kiểm soát quyền truy cập, thêm vào .gitignore.
Có thể đặt API key CaptchaAI trực tiếp trong mã không?
Không. Nạp khoá qua trình quản lý secret của CI hoặc vault. Khoá lỡ commit vào kho mã cần xoay vòng ngay.
Một phiên đã lưu dùng lại được bao lâu?
Tuỳ thời gian sống cookie staging — phiên hết hạn thì test tự quay lại luồng giải CAPTCHA bình thường.
Bạn khuyến nghị gì khi gặp lỗi tạm thời?
Thử lại idempotent với exponential backoff (1s, 2s, 4s) và giới hạn trên. Lỗi mạng, mã 5xx, ERROR_NO_SLOT_AVAILABLE nên thử lại; lỗi xác thực kéo dài thì không.
Tài nguyên liên quan
- CaptchaAI quickstart
- QA CAPTCHA được uỷ quyền
- Test endpoint CAPTCHA trên biểu mẫu
- Trình duyệt lỗi nhưng API vẫn chạy: gỡ lỗi
- Giải reCAPTCHA v2 qua API
- Giải Cloudflare Turnstile qua API
- Giải GeeTest v3 qua API
Lấy API key CaptchaAI và tích hợp giải token vào pipeline QA của bạn ngay hôm nay: captchaai.com.