Как кликнуть по капче 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 > inputlabel[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, получить его контекст и использовать правильный селектор. Если стандартный код не работает - проверьте актуальность селекторов и режим запуска браузера. Для массовой автоматизации рекомендуем использовать прокси и эмуляцию реального пользователя.