ElementClickInterceptedException错误无法解决,求Selenium代码解决方案
解决ElementClickInterceptedException问题的调整方案
问题根源分析
这个错误本质是要点击的元素被其他页面元素(比如弹窗、广告、加载遮罩)挡住了,或者你的等待逻辑、元素定位存在偏差,导致实际点击时目标元素未处于可交互状态。
具体修复步骤
- 清理等待逻辑,避免隐式+显式等待混用:Selenium中同时使用隐式等待和显式等待会导致等待时间不可控,建议移除
driver.implicitly_wait(50),全程用显式等待控制元素状态。 - 修正元素定位的语法错误:你写的
//a[contains(class='ot-buttons-fw')]语法有误,contains检查class属性的正确写法是contains(@class, 'ot-buttons-fw')。 - 统一元素定位表达式:等待可点击的元素和实际点击的元素应该是同一个,避免定位不一致导致的问题。比如目标按钮的class是
event__more event__more--static,直接用这个class定位更可靠,比文本定位更稳定(文本可能随语言变化)。 - 遇遮挡时用JS点击替代原生click:如果页面元素确实被遮挡,通过JavaScript执行点击可以绕过遮挡问题。
- 完善异常捕获范围:把
ElementClickInterceptedException也加入捕获列表,避免单次异常直接终止循环。
修改后的代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import ElementClickInterceptedException, ElementNotInteractableException, TimeoutException, WebDriverException, NoSuchElementException from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait import re import pandas as pd def get_links(link): driver = webdriver.Firefox() driver.get(link) _flag = True knt = 0 wait = WebDriverWait(driver, 20) # 统一设置显式等待时长,按需调整 while _flag: try: # 等待广告弹窗类元素消失(修正语法错误) wait.until(EC.invisibility_of_element_located((By.XPATH, "//a[contains(@class, 'ot-buttons-fw')]"))) # 定位目标按钮,等待可点击 show_more_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@class='event__more event__more--static']"))) # 尝试原生点击,失败则用JS点击 try: show_more_btn.click() except ElementClickInterceptedException: driver.execute_script("arguments[0].click();", show_more_btn) print("点击成功....................................") # 等待加载完成,用显式等待替代sleep更高效 wait.until(EC.staleness_of(show_more_btn)) # 等待按钮状态变化,证明新内容加载中 knt += 1 if knt > 5: # 测试用终止条件 print("已达到测试点击次数,停止循环") _flag = False except (ElementNotInteractableException, ElementClickInterceptedException, TimeoutException): print("遇到异常,终止循环") _flag = False driver.close() return None link = "https://www.flashscore.com/basketball/usa/nba/results/" _ = get_links(link)
关键改动说明
- 移除了
driver.implicitly_wait(50),创建统一的wait对象管理显式等待。 - 修正了广告元素定位的XPath语法错误。
- 先尝试原生点击,遇到遮挡异常时自动切换为JavaScript点击。
- 用
EC.staleness_of等待按钮状态变化,替代固定时长的sleep,更贴合页面实际加载节奏。 - 扩大了异常捕获范围,覆盖了可能出现的几种常见异常。
内容的提问来源于stack exchange,提问作者Samson Bitrus
相关产品推荐
相关产品推荐

