Phạm vi an toàn: Bài viết chỉ áp dụng cho môi trường QA, staging hoặc pre-production mà bạn sở hữu hoặc được uỷ quyền kiểm thử. Các ví dụ dưới đây là mẫu chẩn đoán và quan sát cho tích hợp CAPTCHA của chính bạn — không nhằm chạy trên hệ thống bên thứ ba hoặc luồng không được cho phép.
Kịch bản Puppeteer treo lại ở bước reCAPTCHA hoặc Turnstile vì trình duyệt headless chỉ điền form và click, không tự giải CAPTCHA — CaptchaAI lấp khoảng trống đó: nhận sitekey Puppeteer trích xuất, trả token trong vài giây để bạn tiêm vào form và chạy tiếp.
Phạm vi và khi nào dùng cách này
Cách này dùng cho kiểm thử CAPTCHA ở cấp trình duyệt trên biểu mẫu staging thuộc sở hữu hoặc được uỷ quyền của bạn — không phải kiểm thử API thuần. Áp dụng cho smoke test reCAPTCHA, Turnstile và GeeTest với dữ liệu giả lập: người dùng test, biểu mẫu QA, checkout thử nghiệm, token thanh toán sandbox. Bốn bước bên dưới dành cho QA engineer cần một pipeline chạy được trên staging của chính họ, không phải bài lý thuyết về chống phát hiện bot.
Bước 1: Khởi tạo Puppeteer cho môi trường QA
Cài Puppeteer như một dependency dev bình thường, rồi khởi tạo trình duyệt ở chế độ headless mới và tắt sandbox để chạy trong container CI:
npm install puppeteer
const puppeteer = require('puppeteer');
async function launchQa() {
return puppeteer.launch({ headless: 'new', args: ['--no-sandbox'] });
}
Bước 2: Phát hiện widget CAPTCHA trên trang staging
Trước khi gửi bất cứ thứ gì tới CaptchaAI, Puppeteer cần đọc sitekey trực tiếp từ DOM của trang staging:
const page = await (await launchQa()).newPage();
await page.goto('https://staging.example.com/qa-form');
const sitekey = await page.$eval('.g-recaptcha', el => el.dataset.sitekey);
Bước 3: Gửi sitekey và pageurl tới CaptchaAI
Với sitekey vừa lấy được, gửi task tới in.php rồi polling res.php mỗi 5 giây cho đến khi có token:
const fetch = require('node-fetch');
const KEY = process.env.CAPTCHAAI_API_KEY;
async function solve(sitekey, pageurl) {
const submit = await fetch(`https://ocr.captchaai.com/in.php?key=${KEY}&method=userrecaptcha&googlekey=${sitekey}&pageurl=${pageurl}&json=1`).then(r => r.json());
while (true) {
await new Promise(r => setTimeout(r, 5000));
const res = await fetch(`https://ocr.captchaai.com/res.php?key=${KEY}&action=get&id=${submit.request}&json=1`).then(r => r.json());
if (res.status === 1) return res.request;
}
}
Bước 4: Đưa token vào endpoint QA nội bộ
Gửi token tới endpoint backend QA — ví dụ https://staging.example.com/checkout-test — kèm body phù hợp, rồi kiểm tra mã trạng thái phản hồi để xác nhận backend đã chấp nhận token.
Ghi log, truy vết và một ví dụ từ đội QA tại Việt Nam
Với mỗi qa_case, ghi lại tối thiểu: thời gian giải token, mã phản hồi backend, số lần retry và ID task. Tách log theo môi trường (development, staging, pre-production) và liên kết các bước bằng một correlation id — ví dụ với OpenTelemetry — để phát lại toàn bộ kịch bản từ một id duy nhất, giúp rút ngắn đáng kể thời gian chẩn đoán khi CI báo lỗi.
Một đội QA outsourcing tại TP.HCM kiểm thử luồng checkout cho khách hàng thương mại điện tử có thể chạy pipeline này mỗi đêm: mở trang staging, giải reCAPTCHA v2 hoặc Turnstile qua CaptchaAI, gửi token tới endpoint thanh toán thử nghiệm và ghi log theo qa_case. Vì log có thể chứa dữ liệu người dùng test, hãy áp dụng nguyên tắc tối thiểu hoá dữ liệu theo tinh thần Nghị định 13/2023/NĐ-CP — chỉ lưu trường thực sự cần cho gỡ lỗi, và đặt thời hạn xoá log tự động.
Khắc phục sự cố thường gặp
- Test không tìm thấy widget — thường do selector thay đổi hoặc widget load muộn; kiểm tra lại selector và dùng
wait_for_selectortrê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 — thường do sai action, sitekey hoặc secret; đố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ử chỉ giới hạn trong ứng dụng của bạn hoặc tài nguyên đã được uỷ quyền, API key nằm trong CI secret hoặc vault.
- Mỗi lần chạy ghi lại thời gian gọi, mã trạng thái phản hồi, và có chính sách thử lại idempotent với giới hạn cho lỗi tạm thời.
- Bài kiểm thử tái lập được trên CI mà không cần can thiệp thủ công.
Ví dụ đầy đủ bằng Python
Với pipeline QA dùng Python thay vì Node.js, đoạn mã dưới đây gửi task và lấy kết quả từ CaptchaAI cho cùng widget staging:
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
Quy trình này có chạm vào 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 riêng của bạn — hãy tái tạo cấu hình CAPTCHA của production trong bản sao staging của chính bạn.
Có thể đặt API key trực tiếp trong mã nguồn không?
Không nên. Hãy nạp key qua trình quản lý secret của CI, biến môi trường hoặc vault. Key đã lỡ commit vào kho mã cần được xoay vòng ngay lập tức.
Một lần chạy Puppeteer + CaptchaAI mất khoảng bao lâu?
Phần lớn thời gian nằm ở bước polling res.php — thường vài giây đến nửa phút tuỳ loại CAPTCHA và tải hệ thống. Đặt timeout tổng cho mỗi qa_case thay vì chờ vô hạn.
Gặp lỗi tạm thời thì nên xử lý thế nào?
Thử lại idempotent kèm exponential backoff (1s, 2s, 4s) và một giới hạn số lần thử. Lỗi mạng, mã 5xx và ERROR_NO_SLOT_AVAILABLE phù hợp để 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
- Bắt đầu nhanh với CaptchaAI
- Kiểm thử CAPTCHA được uỷ quyền cho QA
- Test endpoint CAPTCHA trên biểu mẫu của bạn
- Trình duyệt test fail nhưng API pass: cách gỡ lỗi
- Giải reCAPTCHA v2 qua API
- Giải Cloudflare Turnstile qua API
- Giải GeeTest v3 qua API
Kiểm thử luồng CAPTCHA trên trình duyệt do bạn kiểm soát với CaptchaAI.