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

如何在Python Selenium中等待grecaptcha变量加载完成?

解决Selenium中grecaptcha未定义的表单提交问题

核心问题分析

报错Uncaught ReferenceError: grecaptcha is not defined的本质是:Google reCAPTCHA的JS库还未完成加载/初始化,你的自动化代码就触发了依赖该变量的表单提交逻辑。

检查grecaptcha加载完成的方法

可以通过自定义等待条件,配合WebDriverWait实现精准等待:

自定义全局变量检查逻辑

直接验证浏览器全局环境中grecaptcha是否存在且具备核心方法:

from selenium.webdriver.support.ui import WebDriverWait

def is_grecaptcha_ready(driver):
    try:
        # 验证grecaptcha已定义且包含execute方法(reCAPTCHA v2/v3核心方法)
        return driver.execute_script("return typeof grecaptcha !== 'undefined' && typeof grecaptcha.execute === 'function';")
    except Exception:
        return False

# 等待最多20秒,直到grecaptcha就绪
WebDriverWait(driver, 20).until(is_grecaptcha_ready)

先等待reCAPTCHA脚本加载

reCAPTCHA的核心脚本通常来自google.com/recaptcha/api.js,可以先等待该脚本标签加载完成,再验证变量:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

# 等待reCAPTCHA脚本标签出现
WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'script[src*="recaptcha/api.js"]'))
)
# 额外等待变量初始化(脚本加载后可能需要极短时间完成全局变量挂载)
WebDriverWait(driver, 10).until(lambda d: d.execute_script("return typeof grecaptcha !== 'undefined';"))

grecaptcha的预期加载位置

  • 全局window对象:reCAPTCHA库加载完成后,会直接在浏览器的window全局对象下挂载grecaptcha变量,可通过window.grecaptcha直接访问。
  • 关联DOM元素:如果页面使用reCAPTCHA v2的可视化验证,页面中会存在div.g-recaptcha或类似容器,但核心的grecaptcha变量始终是全局的,和DOM元素仅为绑定关系。

注意:部分网站会采取懒加载策略,仅在用户和表单交互(如点击输入框、滚动到表单区域)后才加载reCAPTCHA脚本,这种情况下需要先执行对应的前置交互操作,再启动上述等待逻辑。

内容的提问来源于stack exchange,提问作者Ali Sajjad Rizavi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:02:07