使用Selenium+2Captcha绕过H-Captcha时填充Token失败的问题排查
问题描述
我尝试使用Python结合Selenium和2Captcha绕过H-Captcha。获取到2Captcha Token后,试图将其填充到name为h-captcha-response和g-captcha-response的两个textarea中,但操作失败。这两个textarea的ID分别符合h-captcha-[ID]和g-recaptcha-[ID]的格式。当我尝试设置textarea的innerHTML时,因无法正确获取这两个元素而报错。
执行的代码如下:
driver.execute_script(''' let [captcha] = arguments[document.querySelectorAll('[name="h-captcha-response"], [name="g-recaptcha-response"]')].map(el => { el.innerHTML = captcha})''', code)
报错信息:
selenium.common.exceptions.JavascriptException: Message: javascript error: Cannot read properties of undefined (reading 'map')
我确认Token是正确的,需要将其填入这两个textarea中,想知道该execute_script命令为何失效?
问题原因与解决方法
你的JS代码存在两个核心错误:
- 参数使用逻辑错误:
arguments是Selenium传入的外部参数(即你最后传入的code),你错误地把document.querySelectorAll的结果当作arguments的索引,导致arguments[xxx]直接返回undefined,自然无法调用map方法。 - 变量解构与赋值逻辑混乱:你试图从一个不存在的数组里解构出
captcha变量,又把这个变量反向赋值给元素的innerHTML,逻辑完全颠倒。
修正后的代码如下:
driver.execute_script(''' const captchaToken = arguments[0]; // 获取目标textarea元素并遍历赋值 document.querySelectorAll('[name="h-captcha-response"], [name="g-recaptcha-response"]').forEach(el => { el.innerHTML = captchaToken; // 触发页面监听的输入事件,确保验证码系统能检测到值变化 el.dispatchEvent(new Event('input')); el.dispatchEvent(new Event('change')); }); ''', code)
额外说明:
- 用
forEach替代map:我们不需要返回新数组,只是遍历元素执行赋值操作,forEach更贴合需求。 - 必须触发事件:很多验证码会监听
input或change事件来验证值的有效性,仅设置innerHTML可能不会触发页面的验证逻辑。 - 简化引号写法:在Python的多行字符串中可以直接使用双引号,无需转义成
",提升代码可读性。
内容的提问来源于stack exchange,提问作者Josselin Duhamel
相关产品推荐
相关产品推荐

