Otomasyon için Chrome'u iki protokol kontrol eder: WebDriver (W3C standardı, Selenium tarafından kullanılır) ve Chrome DevTools Protokolü (CDP, Puppeteer/Playwright tarafından kullanılır). Her birinin farklı algılama profilleri, yetenekleri ve CAPTCHA işleme özellikleri vardır.
Protokol Mimarisi
WebDriver (Selenium):
Script ──HTTP──▶ ChromeDriver ──DevTools──▶ Chrome
(JSON Wire) (bridge) (internal)
CDP (Puppeteer/Playwright):
Script ──WebSocket──▶ Chrome
(direct) (no middle layer)
Bire Bir Karşılaştırma
| Özellik | Web Sürücüsü | CDP |
|---|---|---|
| Protokol | HTTP + JSON | WebSocket |
| Standart | W3C standardı | Chrome'a özel |
| Algılama yüzeyi | Yüksek (navigator.userAgent = true) |
Daha düşük (düzeltilebilir) |
| Ağa müdahale | Hayır (Selenium Wire gerekir) | Dahili (Fetch, Network) |
| JavaScript değerlendirmesi | executeScript (sarılmış) |
Runtime.evaluate (doğrudan) |
| Değişiklik iste | Hayır | Evet |
| Yanıt değişikliği | Hayır | Evet |
| Bağlantı yükü | Komut başına HTTP | Kalıcı WebSocket |
| Çapraz tarayıcı | Chrome, Firefox, Safari, Kenar | Yalnızca Chrome/Chromium |
| Gizlilik potansiyeli | Düşük (her zaman web sürücüsü bayrağını ayarlar) | Yüksek (bayrak yamalanabilir) |
Algılama Farklılıkları
Web Sürücüsü Algılama (Selenyum)
// What sites check for Selenium
navigator.userAgent // true (set by ChromeDriver)
document.$cdc_asdjflasutopfhvcZLmcfl // ChromeDriver internal variable
window.callSelenium // Older Selenium versions
window._selenium // Selenium internals
document.__webdriver_evaluate // WebDriver namespace
# Even with flag removal, ChromeDriver leaves traces
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--no-sandbox")
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
CDP Tespiti (Puppeteer)
// 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
});
CAPTCHA Çözümü: Web Sürücüsü Yaklaşımı
# 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()
options.add_argument("--no-sandbox")
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()
CAPTCHA Çözümü: CDP Yaklaşımı
// Puppeteer (CDP) + CaptchaAI
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer (varsayılan yapılandırma)");
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();
})();
CAPTCHA İş Akışları için Yetenek Karşılaştırması
Ağ Müdahalesi
# 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
// 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 });
});
Yanıt Değişikliği
// 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 });
}
});
Çerez Manipülasyonu
# WebDriver: Standard cookie API
driver.add_cookie({"name": "session", "value": "abc123"})
cookies = driver.get_cookies()
// 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");
Karar Matrisi
| Senaryo | Önerilen | neden |
|---|---|---|
| Çoklu tarayıcı testi | Web Sürücüsü | Çapraz tarayıcı desteği |
| Maksimum gizlilik | CDP | Alt algılama yüzeyi |
| Ağ hata ayıklaması | CDP | Dahili müdahale |
| CDP'ye aşina olmayan ekip | Web Sürücüsü | Daha basit API, daha fazla belge |
| Yüksek ölçekli kazıma | CDP | Oturum başına daha düşük ek yük |
| CI/CD entegrasyonu | Web Sürücüsü | Daha iyi takım desteği |
| CAPTCHA ağırlıklı siteler | CDP + CaptchaAI | Gizlilik + çözüm kombinasyonu |
| Basit form doldurma | Web Sürücüsü + CaptchaAI | Uygulaması daha kolay |
Hibrit Yaklaşım: WebDriver + CDP
Selenium 4, BiDi (çift yönlü) aracılığıyla CDP komutlarını destekler:
from selenium import webdriver
driver = webdriver.Chrome()
# Use WebDriver for navigation
driver.get("https://example.com")
# Use CDP for QA testi patches
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
"""
})
# Use CDP for network events
driver.execute_cdp_cmd("Network.enable", {})
Performans Karşılaştırmaları
| Metrik | Web Sürücüsü (Selenyum) | CDP (Puppeteer) | CDP (Oyun Yazarı) |
|---|---|---|---|
| Oturum başlangıcı | ~2,5sn | ~1,5sn | ~1,2sn |
| Sayfada gezinme | ~500ms ek yük | ~100ms ek yük | ~80ms ek yük |
| Komut dosyası yürütme | Çağrı başına ~200ms | ~Çağrı başına 50ms | ~Çağrı başına 40ms |
| Oturum başına bellek | ~350MB | ~280MB | ~260MB |
| CAPTCHA çözümü (CaptchaAI) | 15-30'lar | 15-30'lar | 15-30'lar |
CaptchaAI çözüm süresi aynıdır — tarayıcı protokolünden bağımsız bir API çağrısıdır.
Sorun giderme
| Sorun | Web Sürücüsü Düzeltmesi | CDP Düzeltmesi |
|---|---|---|
| Bot olarak algılandı | excludeSwitches + seçenekler |
Gizli eklenti + yamalar |
| İsteklere müdahale edilemiyor | Selenyum teli kullanın | Fetch.enable'yi kullanın |
| Yavaş yürütme | execute_script çağrılarını azaltın |
Toplu CDP komutları |
| Jeton enjeksiyonu başarısız oluyor | iframe bağlamını kontrol edin | Runtime.evaluate'yi bağlamla kullanın |
| Oturum kararsızlığı | ChromeDriver'ı güncelleyin | WebSocket bağlantısını kontrol edin |
SSS
Hangi protokol daha iyi CAPTCHA başarı oranları sağlar?
Başarı oranları aynıdır — CaptchaAI sunucu tarafında çözer. Protokol yalnızca algılama sıklığını (CAPTCHA'ların ne sıklıkta göründüğünü) etkiler.
WebDriver ile CDP'yi karıştırabilir miyim?
Evet. Selenyum 4, execute_cdp_cmd()'yi ortaya çıkarır. Gezinme için WebDriver'ı ve gizli yamalar için CDP'yi kullanın.
Oyun Yazarı her ikisinden de daha mı iyi?
Playwright, CDP'yi dahili olarak kullanır ancak otomatik bekleme ve daha iyi hata işleme özelliklerine sahip daha yüksek düzeyde bir API sağlar. İyi bir orta yol.
CAPTCHA çalışması için Selenium'dan Puppeteer'a geçmeli miyim?
Eğer tespit asıl sorununuzsa, evet. Tarayıcılar arası desteğe ihtiyacınız varsa Selenium + CaptchaAI ile kalın.
İlgili Kılavuzlar
CAPTCHA iş akışınız için doğru otomasyon protokolünü seçin —CaptchaAI anahtarınızı alınve protokolden bağımsız olarak CAPTCHA'ları çözün.