我正在使用 selenium 在网站上自动提交表单。有时,由于这个错误,我的表单提交失败。
0.62d2e676.js:1 Uncaught ReferenceError: grecaptcha is not defined
at Object.reply_chat_form_submit (6.b0af483c.js:1:22012)
...
这个变量
grecaptcha
通常由Google reCAPTCHA 库定义,用于防止自动提交表单。所以,我想要像 WebdriverWait
和 expected_conditions
这样的东西来检查该变量是否已加载到网页中。我敢肯定,熟悉网络应用程序中 reCAPTCHA 库结构的任何人都能够分辨出该变量的预期位置。
我想出了一个解决方案。我制作了自己定制的预期条件对象,可与硒一起使用。
class JsVariableExists(object):
"""Custom-made expected condition to use with selenium"""
def __init__(self, variable):
self.variable = variable
def __call__(self, driver):
return driver.execute_script(f"return typeof {self.variable} !== 'undefined';")
这个预期条件可以如下使用:
WebDriverWait(driver, 20).until(JsVariableExists("grecaptcha"))
这里的
grecaptcha
是我在尝试提交表单之前想要存在的变量名称。
例如,如果您在浏览器的开发工具的 javascript 控制台中运行
typeof abcd
,您会看到这将返回'undefined'
。但是,如果您使用 var abc = "haha"
在控制台中创建变量,则 typeof abcd
将返回 'string'
.