المقارنات

WebDriver مقابل بروتوكول Chrome DevTools لأتمتة CAPTCHA

هناك بروتوكولان يتحكمان في Chrome للتشغيل الآلي: WebDriver (معيار W3C، الذي يستخدمه السيلينيوم) وبروتوكول Chrome DevTools (CDP، الذي يستخدمه Puppeteer/Playwright). ولكل منها ملفات تعريف وإمكانيات اكتشاف مختلفة وخصائص معالجة اختبار CAPTCHA.


هندسة البروتوكول

WebDriver (Selenium):
  Script ──HTTP──▶ ChromeDriver ──DevTools──▶ Chrome
  (JSON Wire)        (bridge)      (internal)

CDP (Puppeteer/Playwright):
  Script ──WebSocket──▶ Chrome
  (direct)               (no middle layer)

مقارنة وجها لوجه

ميزة برنامج تشغيل الويب CDP
البروتوكول HTTP + جسون WebSocket
قياسي معيار W3C خاص بالكروم
سطح الكشف عالية (navigator.webdriver = true) أقل (قابل للتصحيح)
اعتراض الشبكة لا (يحتاج إلى سلك السيلينيوم) مدمج (Fetch، Network)
** تقييم JavaScript ** executeScript (ملفوفة) Runtime.evaluate (مباشر)
طلب التعديل لا نعم
تعديل الرد لا نعم
الاتصالات العامة HTTP لكل أمر WebSocket المستمر
** عبر المتصفح ** كروم، فايرفوكس، سفاري، إيدج Chrome/Chromium فقط
إمكانية التخفي منخفض (يقوم دائمًا بتعيين علامة برنامج تشغيل الويب) عالية (العلم قابل للتصحيح)

اختلافات الكشف

كشف WebDriver (السيلينيوم)

// What sites check for Selenium
navigator.webdriver                    // 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("--disable-blink-features=AutomationControlled")
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 (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: نهج WebDriver

# 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("--disable-blink-features=AutomationControlled")
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: نهج CDP

// Puppeteer (CDP) + CaptchaAI
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra-plugin-stealth");
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

اعتراض الشبكة

# 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 });
});

تعديل الاستجابة

// 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: 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");

مصفوفة القرار

السيناريو موصى به لماذا
اختبار متعدد المتصفحات برنامج تشغيل الويب دعم عبر المتصفحات
أقصى قدر من التخفي CDP سطح الكشف السفلي
تصحيح أخطاء الشبكة CDP اعتراض مدمج
فريق غير مطلع على CDP برنامج تشغيل الويب واجهة برمجة تطبيقات أبسط، المزيد من المستندات
تجريف على نطاق واسع CDP انخفاض الحمل لكل جلسة
التكامل مع CI/CD برنامج تشغيل الويب دعم أفضل للأدوات
مواقع CAPTCHA الثقيلة سي دي بي + CaptchaAI التخفي + حل التحرير والسرد
ملء نموذج بسيط برنامج تشغيل الويب + CaptchaAI أسهل في التنفيذ

النهج الهجين: WebDriver + CDP

يدعم السيلينيوم 4 أوامر CDP من خلال BiDi (ثنائي الاتجاه):

from selenium import webdriver

driver = webdriver.Chrome()

# Use WebDriver for navigation
driver.get("https://example.com")

# Use CDP for stealth 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", {})

معايير الأداء

متري برنامج تشغيل الويب (السيلينيوم) CDP (Puppeteer) سي دي بي (كاتب مسرحي)
بداية الجلسة ~2.5 ثانية ~1.5 ثانية ~1.2 ثانية
التنقل في الصفحة ~500 مللي ثانية الحمل ~100 مللي ثانية الحمل ~80 مللي ثانية النفقات العامة
تنفيذ البرنامج النصي ~ 200 مللي ثانية لكل مكالمة ~50 مللي ثانية لكل مكالمة ~40 مللي ثانية لكل مكالمة
الذاكرة لكل جلسة ~350 ميجابايت ~280 ميجابايت ~260 ميجابايت
حل اختبار CAPTCHA (CaptchaAI) 15-30 ثانية 15-30 ثانية 15-30 ثانية

وقت حل CaptchaAI متطابق — إنه استدعاء API مستقل عن بروتوكول المتصفح.


استكشاف الأخطاء وإصلاحها

قضية إصلاح برنامج تشغيل الويب إصلاح CDP
تم اكتشافه على أنه روبوت excludeSwitches + الخيارات البرنامج المساعد التخفي + التصحيحات
لا يمكن اعتراض الطلبات استخدم سلك السيلينيوم استخدم Fetch.enable
التنفيذ بطيء تقليل مكالمات execute_script أوامر CDP المجمعة
فشل حقن الرمز المميز تحقق من سياق iframe استخدم Runtime.evaluate مع السياق
عدم استقرار الجلسة قم بتحديث برنامج ChromeDriver تحقق من اتصال WebSocket

الأسئلة الشائعة

ما هو البروتوكول الذي يوفر معدلات نجاح أفضل في اختبار CAPTCHA؟

معدلات النجاح متطابقة — CaptchaAI يحل مشكلة جانب الخادم. يؤثر البروتوكول فقط على تكرار الكشف (عدد مرات ظهور اختبار CAPTCHA).

هل يمكنني المزج بين WebDriver وCDP؟

نعم. السيلينيوم 4 يكشف execute_cdp_cmd(). استخدم WebDriver للتنقل وCDP للتصحيحات الخفية.

هل Playwright أفضل من كليهما؟

يستخدم Playwright CDP داخليًا ولكنه يوفر واجهة برمجة تطبيقات ذات مستوى أعلى مع انتظار تلقائي ومعالجة أفضل للأخطاء. إنها حل وسط جيد.

هل يجب أن أتحول من السيلينيوم إلى Puppeteer لكي يعمل اختبار CAPTCHA؟

إذا كان الكشف هو مشكلتك الرئيسية، نعم. إذا كنت بحاجة إلى دعم عبر المتصفحات، فابق مع Selenium + CaptchaAI.


أدلة ذات صلة


اختر بروتوكول الأتمتة المناسب لسير عمل CAPTCHA الخاص بك —احصل على مفتاح CaptchaAI الخاص بكوحل اختبارات CAPTCHA بغض النظر عن البروتوكول.

التعليقات غير مفعّلة لهذا المقال.