如何使用Selenium网页自动化工具点击隐形reCAPTCHA按钮
问题核心原因
你观测到reCAPTCHA iframe内部无内容,是因为隐形reCAPTCHA的弹窗iframe仅在验证码被触发弹出时才会动态加载内部DOM节点,未触发状态下iframe默认是空的,无需纠结静态DOM下的节点缺失问题。
解决方案步骤
1. 等待弹窗触发后切换到对应iframe
不要提前切换iframe,等验证码弹窗弹出后,先定位弹窗专属的reCAPTCHA iframe,再切换进入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待reCAPTCHA弹窗iframe加载完成,适配隐形reCAPTCHA的动态加载逻辑 captcha_iframe = WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.XPATH, '//iframe[contains(@title,"reCAPTCHA") and contains(@src,"bframe")]')) ) driver.switch_to.frame(captcha_iframe)
注:Selenium 4.0+已废弃find_element_by_xpath()写法,推荐使用上述find_element(By.XPATH, 路径)的规范写法
2. 定位并点击音频验证按钮
切换进入iframe后,再用显示等待定位音频按钮,避免元素未加载导致的定位失败:
audio_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//button[@id="recaptcha-audio-button"]')) ) audio_button.click()
3. Headless Chrome适配配置
旧版headless模式特征明显,极易被reCAPTCHA识别为机器人,需要调整启动参数降低检测概率:
from selenium import webdriver options = webdriver.ChromeOptions() # 使用新版headless模式,特征与普通可视模式几乎一致 options.add_argument("--headless=new") # 移除自动化控制标记 options.add_argument("--disable-blink-features=AutomationControlled") # 隐藏webdriver特征 options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) driver = webdriver.Chrome(options=options) # 执行js覆盖navigator.webdriver标记 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" })
4. 降低验证码触发概率的额外优化
- 启动Chrome时加载本地已有正常使用痕迹的用户配置文件,不要每次都用全新无痕窗口
- 表单填写时每个输入框之间添加1-3秒的随机等待,不要一次性批量填充所有内容
- 点击提交按钮前先随机移动鼠标到按钮区域停留0.5-2秒再执行点击操作
内容的提问来源于stack exchange,提问作者LM2000
相关产品推荐
相关产品推荐

