You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Playwright绕过Cloudflare时无法定位验证iframe的问题

解决Cloudflare验证iframe无法定位的问题

针对你遇到的无法定位Cloudflare验证iframe、自动点击无效的问题,可从以下几个方向排查和修复:

1. 修正iframe选择器的准确性

Cloudflare的iframe属性(如title)可能因地区、版本或验证类型发生变化,建议改用更稳定的src属性匹配:

  • 原选择器依赖固定title,改为匹配包含Cloudflare验证域名的src:iframe[src*='challenges.cloudflare.com']
  • 可先打印页面所有frame信息排查实际属性:
    # 在找不到iframe时添加这段代码
    print("Available frames:")
    for frame in page.frames():
        print(f"Title: {frame.title()}, URL: {frame.url}")
    

2. 强化浏览器指纹伪装

仅禁用AutomationControlled不足以绕过Cloudflare的指纹检测,需补充更多真实浏览器特征:

context = await browser.new_context(
    # 使用真实Firefox的User-Agent
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0",
    # 设置常见屏幕尺寸
    viewport={"width": 1920, "height": 1080},
    # 启用JavaScript和Cookie(默认已开启,但明确声明更稳妥)
    java_script_enabled=True,
    accept_downloads=True
)

3. 优化等待策略

替换固定asyncio.sleep()为更智能的页面状态等待,避免因加载延迟错过iframe:

  • 使用await page.wait_for_load_state("networkidle")等待网络请求稳定
  • 给iframe选择器设置更长超时时间,应对缓慢加载的验证页面:
    iframe = await page.wait_for_selector("iframe[src*='challenges.cloudflare.com']", timeout=60000)
    

4. 模拟人类点击行为

直接点击复选框可能被检测为自动化,需模拟真实操作流程:

checkbox = await captcha_frame.wait_for_selector("input[type='checkbox']", timeout=30000)
# 先hover再点击,加入随机延迟
await checkbox.hover()
await asyncio.sleep(1.5)  # 模拟人类思考时间
await checkbox.click(force=True)  # 强制点击,避免元素不可交互的问题

修改后的完整示例代码

import asyncio
from playwright.async_api import Playwright, async_playwright

async def run(playwright: Playwright):
    args = ["--disable-blink-features=AutomationControlled"]
    browser = await playwright.firefox.launch(headless=False, args=args)
    
    # 强化指纹伪装
    context = await browser.new_context(
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0",
        viewport={"width": 1920, "height": 1080}
    )
    
    page = await context.new_page()
    await page.goto(url)
    print("Navigated to:", url)

    # 等待网络空闲,替代固定sleep
    await page.wait_for_load_state("networkidle")

    # 定位Cloudflare验证iframe
    try:
        iframe = await page.wait_for_selector("iframe[src*='challenges.cloudflare.com']", timeout=60000)
        captcha_frame = await iframe.content_frame()
        print("Found CAPTCHA iframe")
    except Exception as e:
        # 排查用:打印所有frame信息
        print("Failed to locate iframe. Available frames:")
        for frame in page.frames():
            print(f"Title: {frame.title()}, URL: {frame.url}")
        raise e

    # 模拟人类点击验证框
    checkbox = await captcha_frame.wait_for_selector("input[type='checkbox']", timeout=30000)
    await checkbox.hover()
    await asyncio.sleep(1.2)
    await checkbox.click(force=True)
    print("CAPTCHA checkbox clicked.")

    # 等待验证完成
    await page.wait_for_load_state("networkidle")
    await asyncio.sleep(5)

    await browser.close()

async def main():
    async with async_playwright() as playwright:
        await run(playwright)

if __name__ == "__main__":
    asyncio.run(main())

内容的提问来源于stack exchange,提问作者Elijah Leis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:25:58