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

Selenium点击验证码元素失败:无法定位元素问题求助

问题:验证码复选框定位失败,无法通过验证

我用Selenium尝试点击页面的验证码复选框,但不管用ID、CSS选择器、XPATH还是CLASS_NAME都找不到元素,一直抛出NoSuchElementException错误。

我的代码:

driver = webdriver.Chrome()
driver.get('https://www.pro-football-reference.com/years/2025/games.htm')
time.sleep(10)
clickable = driver.find_element(By.ID, 'BbLB6')
ActionChains(driver).move_to_element(clickable).pause(1).click().perform()

抛出的错误:

raise NoSuchElementException(f"Cannot locate relative element with: {by.root}")

解决办法

  • 检查元素是否在iframe中:验证码(如reCAPTCHA)常嵌入iframe,需先切换到对应iframe才能定位元素:
    # 切换到验证码所在iframe
    iframe = driver.find_element(By.XPATH, "//iframe[contains(@src, 'recaptcha')]")
    driver.switch_to.frame(iframe)
    # 定位并点击复选框
    checkbox = driver.find_element(By.CLASS_NAME, 'recaptcha-checkbox-border')
    checkbox.click()
    # 操作完成后切回主文档
    driver.switch_to.default_content()
    
  • 用显式等待替代固定等待:time.sleep(10)是固定等待,可能页面或验证码未加载完成。改用显式等待等待元素可点击:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get('https://www.pro-football-reference.com/years/2025/games.htm')
    # 最长等待20秒,直到元素可点击
    checkbox = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.CLASS_NAME, 'recaptcha-checkbox-border'))
    )
    checkbox.click()
    
  • 避免使用动态生成的定位符:你用的BbLB6可能是动态ID,每次页面加载都会变化。换用静态属性定位,比如reCAPTCHA复选框的类名recaptcha-checkbox-border,或者XPATH //div[@class='recaptcha-checkbox-checkmark']/parent::div。
  • 隐藏Selenium自动化特征:部分网站会检测Selenium标识,可通过配置Chrome参数规避:
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    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)
    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    driver.get('https://www.pro-football-reference.com/years/2025/games.htm')
    
  • 手动验证(临时方案):若上述方法无效,可加入等待让手动完成验证:
    driver = webdriver.Chrome()
    driver.get('https://www.pro-football-reference.com/years/2025/games.htm')
    input("请手动完成验证码验证后按回车继续...")
    # 后续逻辑
    

内容的提问来源于stack exchange,提问作者Cam Smithers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.03 15:12:31