Selenium点击家谱网站Cookie弹窗与登录提交按钮被拦截如何解决?
问题原因
- 报错
ElementClickInterceptedException明确说明提交按钮被其他元素遮挡,遮挡元素为Cookie弹窗的根容器div#tarteaucitronRoot,本质是你之前的Cookie接受按钮点击操作未生效,弹窗没有关闭,一直悬浮在页面上层拦截了后续的点击事件。 - 原有Cookie点击失效的核心原因是使用了隐式等待,隐式等待仅能判断元素是否被加载到DOM树中,无法判断元素是否处于可交互(可点击)状态,可能出现元素还未渲染完成、点击事件还未绑定的时候就触发了点击,操作无效。
解决方案
优先使用方案1,特殊场景下可以搭配方案2使用:
方案1:使用显式等待保证交互有效性
修改逻辑为:打开页面后,先等待Cookie接受按钮可点击,点击后等待Cookie弹窗完全从DOM中移除,再执行后续的账号密码输入和提交操作,修正后代码如下:
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 PATH = "/usr/local/bin/chromedriver" driver = webdriver.Chrome(PATH) wait = WebDriverWait(driver, 15) # 最长等待时长可根据网络情况自行调整 driver.get("https://en.geneanet.org/connexion/") # 等待Cookie接受按钮可点击后再执行点击 cookie_accept_btn = wait.until(EC.element_to_be_clickable((By.ID, "tarteaucitronPersonalize2"))) cookie_accept_btn.click() # 等待Cookie弹窗完全消失,避免遮挡后续操作元素 wait.until(EC.invisibility_of_element_located((By.ID, "tarteaucitronRoot"))) # 执行登录操作 wait.until(EC.element_to_be_clickable((By.ID, "_username"))).send_keys('user') wait.until(EC.element_to_be_clickable((By.ID, "_password"))).send_keys("pwd") wait.until(EC.element_to_be_clickable((By.ID, "_submit"))).click()
方案2:使用JS强制触发点击
如果显式等待后Cookie按钮还是无法正常点击,可以用JS执行点击操作,绕过前端的交互限制,把Cookie点击的部分替换为以下代码即可:
cookie_accept_btn = wait.until(EC.presence_of_element_located((By.ID, "tarteaucitronPersonalize2"))) driver.execute_script("arguments[0].click();", cookie_accept_btn)
如果提交按钮还是被拦截,也可以用同样的JS方式点击提交按钮:
submit_btn = wait.until(EC.presence_of_element_located((By.ID, "_submit"))) driver.execute_script("arguments[0].click();", submit_btn)
内容的提问来源于stack exchange,提问作者lchan
相关产品推荐
相关产品推荐

