Soal penyelesaian CAPTCHA, kedua protokol setara: CaptchaAI bekerja di sisi server, jadi token g-recaptcha-response yang Anda terima identik. Yang berbeda adalah frekuensi tantangan dan jumlah sesi yang muat di satu mesin.
Pakai WebDriver kalau skrip harus jalan di Firefox dan Safari; pakai CDP kalau targetnya hanya Chrome.
Pilih cepat: WebDriver atau CDP
- WebDriver — pengujian lintas browser dan suite CI/CD Selenium yang sudah mapan.
- CDP — sesi paralel padat, debug lalu lintas jaringan, dan halaman yang sering menampilkan tantangan.
Kenapa arsitektur keduanya berbeda
WebDriver adalah standar W3C: skrip bicara HTTP+JSON ke ChromeDriver, yang meneruskannya ke Chrome. CDP memotong perantara itu lewat satu WebSocket.
WebDriver (Selenium):
Script ──HTTP──▶ ChromeDriver ──DevTools──▶ Chrome
(JSON Wire) (bridge) (internal)
CDP (Puppeteer/Playwright):
Script ──WebSocket──▶ Chrome
(direct) (no middle layer)
Setiap perintah WebDriver adalah round-trip HTTP baru; CDP memakai koneksi yang tetap terbuka.
Perbandingan fitur WebDriver dan CDP
| Fitur | WebDriver | CDP |
|---|---|---|
| Protokol | HTTP + JSON | WebSocket |
| Permukaan deteksi | Tinggi | Lebih rendah |
| Intersepsi jaringan | Perlu Selenium Wire | Bawaan (Fetch, Network) |
| Evaluasi JavaScript | executeScript (terbungkus) |
Runtime.evaluate (langsung) |
| Modifikasi request/respons | Tidak | Ya |
| Overhead koneksi | HTTP per perintah | WebSocket persisten |
| Lintas browser | Chrome, Firefox, Safari, Edge | Chrome/Chromium saja |
| Kontrol sinyal otomatis | Rendah | Tinggi |
Kenapa jumlah tantangan CAPTCHA berbeda
Situs berpelindung anti-bot membaca sinyal browser sebelum menampilkan tantangan, dan kedua protokol meninggalkannya pada waktu berbeda.
Penanda yang ditinggalkan ChromeDriver
// What sites check for Selenium
sinyal browser otomatis // true (set by ChromeDriver)
document.$cdc_asdjflasutopfhvcZLmcfl // ChromeDriver internal variable
window.callSelenium // Older Selenium versions
window._selenium // Selenium internals
document.__webdriver_evaluate // WebDriver namespace
Opsi Chrome merapikan sebagian, tetapi variabel internal ChromeDriver tetap tertinggal:
# Even with flag removal, ChromeDriver leaves traces
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(options=options)
# Still detectable via $cdc variables in document
Cara Puppeteer menanganinya
// Puppeteer sets webdriver flag too, but it's fully patchable
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined,
});
// No $cdc variables to worry about
// No Selenium-specific traces
});
Dengan CDP, konteks halaman disiapkan sebelum skrip situs berjalan; di WebDriver sebagian sinyal sudah tertulis saat sesi dinyalakan. Efeknya terasa pada jumlah tantangan, bukan pada keamanan.
Integrasi CaptchaAI lewat Selenium
Alurnya sama di kedua protokol:
- Kirim task ke
in.php. - Simpan task ID dari respons.
- Polling
res.phpsampai hasilnya siap. - Suntikkan token, lalu kirim formulir.
# Selenium (WebDriver) + CaptchaAI
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
API_KEY = "YOUR_API_KEY"
API_URL = "https://ocr.captchaai.com"
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=options)
driver.get("https://example.com/form")
time.sleep(2)
# Extract sitekey
sitekey = driver.execute_script(
"return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)
# Solve via CaptchaAI
resp = requests.post(f"{API_URL}/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": driver.current_url, "json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{API_URL}/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1,
})
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
break
token = data["request"]
# Inject token
driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
document.querySelectorAll('[name="g-recaptcha-response"]')
.forEach(el => {{ el.value = '{token}'; }});
""")
driver.find_element(By.CSS_SELECTOR, "form").submit()
driver.quit()
Integrasi CaptchaAI lewat Puppeteer dan CDP
Urutannya identik; bedanya sesi CDP terpisah memantau request reCAPTCHA sekaligus menyuntikkan token lewat Runtime.evaluate.
// Puppeteer (CDP) + CaptchaAI
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra (mode standar)");
const https = require("https");
puppeteer.use(StealthPlugin());
const API_KEY = "YOUR_API_KEY";
const API_URL = "https://ocr.captchaai.com";
function solveCaptcha(siteUrl, sitekey) {
// Submit + poll (simplified)
return new Promise(async (resolve, reject) => {
const submitResp = await httpPost(`${API_URL}/in.php`, {
key: API_KEY, method: "userrecaptcha",
googlekey: sitekey, pageurl: siteUrl, json: "1",
});
const taskId = submitResp.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await httpGet(
`${API_URL}/res.php?key=${API_KEY}&action=get&id=${taskId}&json=1`
);
if (result.request !== "CAPCHA_NOT_READY") {
return resolve(result.request);
}
}
reject(new Error("Timeout"));
});
}
(async () => {
const browser = await puppeteer.launch({
headless: "new",
args: ["--no-sandbox", "--window-size=1920,1080"],
});
const page = await browser.newPage();
// CDP: Enable network interception
const cdp = await page.createCDPSession();
await cdp.send("Network.enable");
// Monitor CAPTCHA-related requests
cdp.on("Network.requestWillBeSent", (params) => {
if (params.request.url.includes("recaptcha")) {
console.log(`CAPTCHA request: ${params.request.url}`);
}
});
await page.goto("https://example.com/form", { waitUntil: "networkidle0" });
const sitekey = await page.evaluate(() =>
document.querySelector("[data-sitekey]")?.getAttribute("data-sitekey")
);
if (sitekey) {
const token = await solveCaptcha(page.url(), sitekey);
// CDP: Inject via Runtime.evaluate (lower-level than page.evaluate)
await cdp.send("Runtime.evaluate", {
expression: `
document.querySelector('#g-recaptcha-response').value = '${token}';
document.querySelector('form').submit();
`,
});
}
await browser.close();
})();
Field g-recaptcha-response sama persis di kedua contoh — token itu produk server.
Kemampuan yang hanya ada di CDP
Mencegat request
Di WebDriver Anda perlu pustaka pihak ketiga:
# WebDriver: Cannot intercept requests natively
# Requires selenium-wire (third-party)
from seleniumwire import webdriver
driver = webdriver.Chrome()
# selenium-wire proxies all traffic through a local proxy
Di CDP kemampuan itu bagian dari protokolnya:
// CDP: Built-in request interception
await cdp.send("Fetch.enable", {
patterns: [{ urlPattern: "*recaptcha*" }],
});
cdp.on("Fetch.requestPaused", async ({ requestId, request }) => {
console.log(`Intercepted: ${request.url}`);
await cdp.send("Fetch.continueRequest", { requestId });
});
Mengubah respons
// CDP: Can modify responses (WebDriver cannot)
cdp.on("Fetch.requestPaused", async ({ requestId, request }) => {
if (request.url.includes("captcha-config")) {
// Return modified response
await cdp.send("Fetch.fulfillRequest", {
requestId,
responseCode: 200,
body: btoa(JSON.stringify({ enabled: false })),
});
} else {
await cdp.send("Fetch.continueRequest", { requestId });
}
});
Cookie httpOnly
WebDriver hanya menyentuh cookie biasa:
# WebDriver: Standard cookie API
driver.add_cookie({"name": "session", "value": "abc123"})
cookies = driver.get_cookies()
CDP membaca dan menulis cookie httpOnly juga:
// CDP: Full cookie control including httpOnly
await cdp.send("Network.setCookie", {
name: "session",
value: "abc123",
domain: "example.com",
httpOnly: true,
secure: true,
});
// Get all cookies including httpOnly (WebDriver can't access these)
const { cookies } = await cdp.send("Network.getAllCookies");
Ketiganya paling berguna saat debugging: melihat request mana yang memicu tantangan.
Jalan tengah: Selenium 4 dengan perintah CDP
Anda tidak harus memilih salah satu. Selenium 4 mengekspos execute_cdp_cmd(): navigasi lewat API WebDriver, konfigurasi tingkat rendah lewat CDP.
from selenium import webdriver
driver = webdriver.Chrome()
# Use WebDriver for navigation
driver.get("https://example.com")
# Use CDP for konfigurasi standar
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
"""
})
# Use CDP for network events
driver.execute_cdp_cmd("Network.enable", {})
Bagi tim dengan ratusan test Selenium, ini jalur termurah: beberapa perintah CDP di titik yang bermasalah.
Biaya per sesi dan kuota thread
Angka berikut bersumber dari pengamatan dan laporan pengguna. Hasil dapat berbeda tergantung lingkungan, volume, dan waktu pengujian.
| Metrik | WebDriver (Selenium) | CDP (Puppeteer) | CDP (Playwright) |
|---|---|---|---|
| Mulai sesi | ~2.5 detik | ~1.5 detik | ~1.2 detik |
| Eksekusi skrip | ~200 ms | ~50 ms | ~40 ms |
| Memori per sesi | ~350 MB | ~280 MB | ~260 MB |
| Penyelesaian reCAPTCHA v2 (CaptchaAI) | <60 detik | <60 detik | <60 detik |
Baris terakhir tidak bergerak: penyelesaian CAPTCHA adalah panggilan API. Yang bergerak adalah baris memori. Contoh yang akrab bagi kontraktor scraping lepas di Indonesia: VPS 4 GB di AWS ap-southeast-3 (Jakarta) muat sekitar sembilan sesi Selenium, tetapi dua belas sesi Puppeteer. Karena CaptchaAI menagih per thread — BASIC $15/bulan untuk 5 thread, STANDARD $30/bulan untuk 15 thread, ADVANCE $90/bulan untuk 50 thread, solve tak terbatas — protokol yang hemat RAM membuat kuota berbayar Anda benar-benar terpakai.
Ketika ada yang tidak berjalan
| Masalah | Perbaikan di WebDriver | Perbaikan di CDP |
|---|---|---|
| Tantangan terlalu sering muncul | excludeSwitches + opsi Chrome |
Sesuaikan konteks halaman |
| Tidak bisa mencegat request | Pakai Selenium Wire | Pakai Fetch.enable |
| Penyuntikan token gagal | Periksa konteks iframe | Runtime.evaluate + konteks |
| Sesi tidak stabil | Perbarui ChromeDriver | Periksa koneksi WebSocket |
Pada jaringan seluler Indonesia yang naik-turun, perbesar jeda polling ke res.php; polling terlalu rapat hanya menghabiskan kuota request tanpa mempercepat hasil.
Pertanyaan yang sering diajukan
Berapa thread untuk 20 sesi browser paralel?
Hitung dari CAPTCHA yang menunggu bersamaan, bukan jumlah sesi. Kalau sepuluh sesi menunggu token serentak, STANDARD ($30/bulan, 15 thread) cukup.
Bagaimana dengan hCaptcha dan FunCaptcha?
Keduanya tidak didukung; GeeTest v4 baru berstatus segera hadir. Yang tersedia: reCAPTCHA v2 dan v3, Cloudflare Turnstile dan Challenge, GeeTest v3, CAPTCHA gambar dan grid, BLS, plus CaptchaFox, Friendly Captcha, dan Lemin (ketiganya beta).
Playwright termasuk WebDriver atau CDP?
CDP, dengan API tingkat lebih tinggi di atasnya: auto-wait dan penanganan kesalahan yang lebih rapi.
Bacaan lanjutan
- Chrome DevTools Protocol bersama CaptchaAI
- Intersepsi request dengan Selenium Wire
- Otomatisasi browser Puppeteer untuk QA
Ambil API key CaptchaAI dan jalankan solve pertama Anda — mulai di sini.