Comparisons

WebDriver vs Chrome DevTools Protocol untuk Otomatisasi CAPTCHA

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:

  1. Kirim task ke in.php.
  2. Simpan task ID dari respons.
  3. Polling res.php sampai hasilnya siap.
  4. 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 });
  }
});

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


Ambil API key CaptchaAI dan jalankan solve pertama Anda — mulai di sini.

Komentar dinonaktifkan untuk artikel ini.