Как кликнуть по капче Cloudflare в Playwright: пошаговое решение

    При автоматизации проверки доменов на Ahrefs (или других сайтах с защитой Cloudflare) часто возникает проблема: фрейм с капчей не обнаруживается или не кликается. В этой статье разберём, почему стандартный код не работает, и предложим рабочий алгоритм на Playwright (Python/Node.js).

    Почему фрейм капчи Cloudflare не отлавливается?

    Основные причины:

    • Динамическая загрузка: iframe появляется не сразу после нажатия кнопки, а с задержкой (1-5 секунд).
    • Изменение src: атрибут src может содержать случайные параметры, поэтому частичное совпадение (например, [src*="challenges.cloudflare.com"]) может не сработать, если фрейм загружается через JavaScript.
    • Shadow DOM: некоторые элементы капчи (например, чекбокс) находятся внутри теневого DOM, что требует особого подхода.

    Правильный алгоритм: ожидание и клик

    Вот проверенный код, который сначала дожидается появления фрейма, а затем кликает по чекбоксу:

    const { chromium } = require('playwright');
    
    (async () => {
      const browser = await chromium.launch({ headless: false });
      const page = await browser.newPage();
      await page.goto('https://ahrefs.com/website-authority-checker');
      await page.click('button:has-text("Accept All")');
      await page.fill('input[placeholder="Enter domain"]', 'habr.com');
      await page.click('button:has-text("Check Authority")');
    
      // Ожидание появления iframe с капчей
      const iframeElement = await page.waitForSelector('iframe[src*="challenges.cloudflare.com"]', { timeout: 10000 });
      const frame = await iframeElement.contentFrame();
    
      // Ожидание загрузки содержимого фрейма
      await frame.waitForSelector('.cb-i', { timeout: 5000 });
    
      // Клик по чекбоксу (в некоторых версиях Cloudflare используется другой селектор)
      await frame.click('.cb-i');
    
      // Дополнительно: можно кликнуть по тексту "I am human"
      // await frame.click('text="I am human"');
    
      await page.waitForTimeout(3000);
      await browser.close();
    })();

    Ключевые моменты:

    • waitForSelector - дожидается появления фрейма в DOM (таймаут 10 секунд).
    • contentFrame() - получает объект фрейма из элемента iframe.
    • waitForSelector внутри фрейма - гарантирует, что чекбокс уже отрисован.

    Альтернативные селекторы для капчи Cloudflare

    В разных версиях защиты Cloudflare селекторы могут меняться. Если .cb-i не срабатывает, попробуйте:

    • #challenge-stage > label > input
    • label[for*="checkbox"]
    • div[class*="challenge-container"] > iframe

    Что делать, если капча не появляется в headless-режиме?

    Cloudflare часто блокирует headless-браузеры. Рекомендации:

    • Запускайте браузер с headless: false (как в примере выше).
    • Добавьте эмуляцию пользовательского агента и разрешения экрана.
    • Используйте --disable-blink-features=AutomationControlled.

    Работа с Proxy и IP

    Если капча появляется слишком часто - возможно, ваш IP попал в чёрный список Cloudflare. Используйте прокси-серверы (резидентные или мобильные) и ротацию User-Agent.

    Заключение

    Для успешного клика по капче Cloudflare в Playwright необходимо: дождаться полной загрузки iframe, получить его контекст и использовать правильный селектор. Если стандартный код не работает - проверьте актуальность селекторов и режим запуска браузера. Для массовой автоматизации рекомендуем использовать прокси и эмуляцию реального пользователя.

    Часто задаваемые вопросы