如何在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
相关产品推荐
相关产品推荐

