如何在Selenium中提交reCaptcha完成UEFA账户注册
问题分析与解决方案
你遇到的核心问题是:注入reCaptcha token后无法触发表单提交,本质是没有正确完成reCaptcha验证的闭环,且依赖了脆弱的页面元素定位方式。以下是针对性的解决步骤:
1. 修正reCaptcha Token注入逻辑
直接修改innerHTML无效,因为g-recaptcha-response是textarea元素,需修改value属性,同时必须触发reCaptcha的验证回调:
result = SolveCaptcha() if result: code = result['code'] # 正确注入token并触发验证回调 driver.execute_script(f''' const responseEl = document.getElementById("g-recaptcha-response"); responseEl.value = "{code}"; // 触发reCaptcha官方回调完成验证 if (typeof grecaptcha !== 'undefined') {{ grecaptcha.execute(); }} ''') time.sleep(3) # 给页面处理验证的时间
2. 找到并触发表单提交
UEFA的注册表单提交按钮可能是动态显示或隐藏的,可通过两种方式触发提交:
方式一:查找并点击提交按钮
# 用相对选择器查找按钮(避免绝对XPATH的脆弱性) try: submit_btn = driver.find_element(By.XPATH, '//button[contains(text(), "创建账户") or contains(text(), "Create Account")]') # 强制点击,即使按钮不可见 driver.execute_script("arguments[0].click();", submit_btn) except NoSuchElementException: print("未找到可见提交按钮,尝试直接提交表单")
方式二:直接调用表单的submit方法
如果找不到按钮,可直接定位表单元素提交:
form = driver.find_element(By.CSS_SELECTOR, 'form') form.submit()
3. 优化代码中的关键问题
- 修正2Captcha API Key读取逻辑:你之前把sitekey当作环境变量名是错误的,应该用专门的环境变量存储API密钥:
def SolveCaptcha(): # 从环境变量读取API密钥,备用值填你的2Captcha密钥 api_key = os.getenv('TWOCAPTCHA_API_KEY', 'a733edea49a8327795d56edc9f06d391') solver = TwoCaptcha(api_key) try: return solver.recaptcha( sitekey=g_key, url=current_url ) except Exception as e: print(e) return None - 替换绝对XPATH:绝对XPATH极易因页面结构变化失效,改用相对选择器,比如:
# 邮箱输入框 email = driver.find_element(By.CSS_SELECTOR, 'input[type="email"]') # 密码输入框 password = driver.find_element(By.CSS_SELECTOR, 'input[type="password"]')
内容的提问来源于stack exchange,提问作者Ruibin Wu
相关产品推荐
相关产品推荐

