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

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)

关键改动说明

  1. 移除了driver.implicitly_wait(50),创建统一的wait对象管理显式等待。
  2. 修正了广告元素定位的XPath语法错误。
  3. 先尝试原生点击,遇到遮挡异常时自动切换为JavaScript点击。
  4. 用EC.staleness_of等待按钮状态变化,替代固定时长的sleep,更贴合页面实际加载节奏。
  5. 扩大了异常捕获范围,覆盖了可能出现的几种常见异常。

内容的提问来源于stack exchange,提问作者Samson Bitrus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:21:03