使用Selenium无法点击提交按钮登录Rocket League网站的问题求助
Selenium登录rocket-league.com问题修复方案
报错根因说明
- 触发
javascript error: arguments[0].submit is not a function的核心原因:Selenium 原生submit()方法的设计是绑定在<form>表单元素上使用的,不能直接对表单内的按钮元素调用。你之前的代码是将查询到的GO按钮实例传入submit(),按钮本身没有对应JS submit方法,自然会抛出该错误。 - 触发
ElementClickInterceptedException的核心原因:发起GO按钮点击操作时,有其他页面元素(未完全关闭的隐私政策弹窗、页面悬浮导航层)覆盖在按钮的点击区域上,Selenium 无法对被遮挡的元素发起真实用户级点击,因此抛出拦截异常。
具体修复步骤
1. 引入必要依赖,替换硬编码的元素查询逻辑
把原来直接通过旧版find_element_by_xxx的写法(该系列方法在新版Selenium中已逐步弃用),替换成带显式等待的稳定查询,规避页面加载时序、元素遮挡带来的问题:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver_path = r"C:\Users\user\Downloads\chromedriver.exe" driver = webdriver.Chrome(executable_path=driver_path) # 配置合理的窗口尺寸,避免因窗口过窄导致的导航元素错位遮挡 driver.set_window_size(1280, 800) homepage_URL = 'https://rocket-league.com' driver.get(homepage_URL) # 初始化10秒超时的显式等待实例 wait = WebDriverWait(driver, 10)
2. 完成隐私弹窗处理,避免后续元素被遮挡
不要点击完隐私按钮就直接操作后续元素,要等弹窗完全从页面DOM中消失,确保遮挡层移除:
# 等待隐私政策按钮可点击后再点击 accept_btn = wait.until( EC.element_to_be_clickable((By.ID, "acceptPrivacyPolicy")) ) accept_btn.click() # 等待弹窗元素完全不可见,移除遮挡 wait.until( EC.invisibility_of_element_located((By.ID, "acceptPrivacyPolicy")) )
3. 输入账号信息,替换无等待的输入逻辑
# 等待邮箱输入框可交互后再输入 email_input = wait.until( EC.element_to_be_clickable((By.ID, "header-email")) ) email_input.clear() email_input.send_keys("你的登录邮箱") # 等待密码输入框可交互后再输入 pwd_input = wait.until( EC.element_to_be_clickable((By.ID, "header-password")) ) pwd_input.clear() pwd_input.send_keys("你的登录密码")
4. 修复GO按钮提交逻辑,解决两个核心报错
这里提供两种可用的提交方式,二选一即可:
- 方式一:等待GO按钮可点击后,用稳定的CSS选择器定位(替换原来容易失效的绝对XPath),再执行点击。如果还是出现点击拦截,就用JS点击兜底绕开遮挡:
go_btn = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "form input[value='GO']")) ) # 优先执行真实点击 try: go_btn.click() # 如果被元素拦截,就用JS执行点击 except: driver.execute_script("arguments[0].click();", go_btn) - 方式二:正确使用Selenium的submit()方法,定位到整个登录表单元素,直接对表单调用提交,完全不需要定位GO按钮:
login_form = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "header form")) ) login_form.submit()
更高效的替代方案
既然你已经通过requests的POST请求成功拿到了网站登录后的有效cookie,完全可以跳过Selenium手动填表单、点按钮的流程:
打开网站、关闭隐私弹窗后,直接把之前requests获取到的有效cookie添加到Selenium的cookie存储中,刷新页面即可直接进入登录态,能完全规避元素定位、点击拦截、JS报错这类Selenium常见问题。
内容的提问来源于stack exchange,提问作者beruz
相关产品推荐
相关产品推荐

