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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:18:25