使用Selenium插入付费reCaptcha Token后报必填项空值错误的求助
我从付费服务获取了reCaptcha的Token,尝试将其填入reCaptcha表单以完成登录流程,执行了以下Selenium代码:
self.browser.get('https://visa.vfsglobal.com/rus/en/fra/login') self.browser.find_element(By.ID, 'mat-input-0').send_keys('login') self.browser.find_element(By.ID, 'mat-input-1').send_keys('password') self.browser.execute_script("document.getElementById('g-recaptcha-response').style.removeProperty('display');") self.browser.execute_script(f"document.getElementById('g-recaptcha-response').innerHTML = '{code}'") self.browser.execute_script('var element=document.getElementById("g-recaptcha-response"); element.style.display="none";') submit_btn = self.browser.find_element(By.XPATH, "//button[contains(@class, 'mat-focus-indicator')]") submit_btn.click()
但提交后收到“必填项不能为空”(Mandatory field cannot be left blank)错误。我还尝试了以下代码:
recaptcha_response_element = self.browser.find_element(By.XPATH, '//*[@id="g-recaptcha-response"]') self.browser.execute_script(f'arguments[0].value = "{code}";', recaptcha_response_element)
结果仍相同,请问该如何解决此问题?
解决方法
触发元素的输入/变更事件
仅填充g-recaptcha-response的value不足以让页面的表单校验逻辑识别到内容已填写,需要手动触发元素的input或change事件,告诉页面该字段已更新。修改后的代码如下:recaptcha_response_element = self.browser.find_element(By.ID, 'g-recaptcha-response') # 填充Token self.browser.execute_script(f'arguments[0].value = "{code}";', recaptcha_response_element) # 触发input事件(带冒泡,确保页面监听器能捕获) self.browser.execute_script('arguments[0].dispatchEvent(new Event("input", { bubbles: true }));', recaptcha_response_element) # 可选:触发change事件,适配部分页面的校验逻辑 self.browser.execute_script('arguments[0].dispatchEvent(new Event("change", { bubbles: true }));', recaptcha_response_element)检查是否存在关联隐藏字段
部分页面会搭配reCaptcha设置额外的校验字段(比如部分使用类reCaptcha服务的页面会有h-captcha-response或自定义校验参数)。打开浏览器开发者工具,查看表单提交时的Form Data或请求参数,确认是否有其他需要同步填充的字段,将对应的Token也填入这些字段中。确保Token有效且未过期
reCaptcha Token的有效期通常在2分钟以内,要保证填入的Token是刚从付费服务获取的新鲜值,避免因Token过期导致校验失败。模拟正常用户交互流程
不要直接操作隐藏的g-recaptcha-response元素,先等待页面上的reCaptcha组件完全加载(比如带有“我不是机器人”标识的按钮),先点击触发组件初始化,再进行Token填充操作。有些页面会在用户触发reCaptcha后才生成有效的g-recaptcha-response元素,直接提前操作可能导致字段未被页面识别。
内容的提问来源于stack exchange,提问作者AstFreelancer

