【Python】selenium 点击某个按钮 click() 出现的报错问题--ElementClickInterceptedException(全!)

写在前面:

我们在使用selenium 点击某个元素时或者获取find_element的某个网页元素时,总会遇到一些问题。本人经验是,最直接的方法是用try_except 报错 ,直接绕过问题,可以直接看第一条。如果有兴趣具体解决,可以看后面的几个方法,赶时间的伙伴可以只看第一条就好了!

我们在Python中使用Selenium库进行自动化测试时,如果遇到点击某个按钮时click()方法出现问题,Selenium会抛出一个异常。如果这个异常是

selenium.common.exceptions.ElementClickInterceptedException

这表明,我们点击的操作被另一个元素拦截了,导致我们点不到我们想要的东西,而是点到别的东西。

解决这个问题,以下有几种方法:

1、try-except捕获异常报错:

个人觉得使用try-except语句来捕获这些异常是最直接和快捷的,将报出的问题捕获到,并给出下一步更具体的提示,去恢复操作,以下是代码的部分:

python 复制代码
#调用selenium的
from selenium.common.exceptions import NoSuchElementException, ElementClickInterceptedException

try:
    element = driver.find_element(By.XPATH,'//*[@id="app"]/main/section[1]/div/div[3]/span')
    element.click()
except ElementClickInterceptedException as e:
    print("点击被拦截,请检查是否有其他元素覆盖在按钮上。")
    #这里可以写遇到这个问题的解决方法,可以报错给自己看,也可以直接忽略到下一步等等。
except NoSuchElementException as e:
    print("找不到元素,请检查元素的定位方式是否正确。")
except Exception as e:
    print(f"发生了一个错误:{e}")

通过捕获特定的异常类型并给出相应的错误信息,在写代码的时候,可以更快速地定位和解决问题。

当这些异常发生时,我们也可以通过编写自定义的错误来捕捉处理这些异常,如果想了解其他的异常Exception类,可以参考:

2、检查覆盖元素,关闭弹窗:

检查并解决覆盖元素: 检查页面上的覆盖元素,并尝试解决它们。

检查我们点击的元素是不是上面有一层覆盖的模态框或弹出窗口,如果有,尝试关闭或隐藏它们,点击关闭的键,例如如图:(图片来自网络)

代码:

python 复制代码
# 假设弹出窗口有一个关闭按钮
close_button = driver.find_element(By.ID, "closeButton")
close_button.click()

如果不是窗口,那么看看是否有关闭下拉菜单、隐藏覆盖层等。具体问题具体分析。如果是有隐藏的覆盖层,需要找到下一层的接口网址。

3、滚动到元素的位置:

如果元素不在可视区域内,在页面底下,要滚动到该元素可以使它变得可点击。

python 复制代码
driver.execute_script("arguments[0].scrollIntoView();", element)

4、使用显式等待,直到元素可以被点击

可能网站显示的速度太慢,需要等到页面加载才会让元素出来,这时候就可以用显性等待的方法。

python 复制代码
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
    element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "myElement"))
    )
    element.click()
except TimeoutException:
    print("元素在指定时间内不可点击")

5、使用ActionChains模拟鼠标移动到元素上再点击

这种情况适用于对方网站的服务器已经检测到了爬虫操作,普通的click不能通过检验,需要点击元素才能让页面加载(当然这种情况其实少见),解决方法:

python 复制代码
from selenium.webdriver.common.action_chains import ActionChains

action = ActionChains(driver)
action.move_to_element(element).click(element).perform()

6、刷新页面:

如果元素应该可见但当前不可见,可能是因为页面状态不正确。尝试刷新页面。

python 复制代码
driver.refresh()

7、使用JavaScript:

通过执行 JavaScript 来点击元素,这可以绕过一些覆盖元素。

python 复制代码
driver.execute_script("arguments[0].click();", element)
相关推荐
布谷歌3 分钟前
Oops! 更改field的数据类型,影响到rabbitmq消费了...(有关于Java序列化)
java·开发语言·分布式·rabbitmq·java-rabbitmq
被程序耽误的胡先生8 分钟前
java中 kafka简单应用
java·开发语言·kafka
刀客1239 分钟前
python小项目编程-中级(1、图像处理)
开发语言·图像处理·python
卷卷的小趴菜学编程13 分钟前
c++之多态
c语言·开发语言·c++·面试·visual studio code
信阳农夫22 分钟前
python 3.6.8支持的Django版本是多少?
python·django·sqlite
冷琴199633 分钟前
基于Python+Vue开发的反诈视频宣传管理系统源代码
开发语言·vue.js·python
楠枬41 分钟前
网页五子棋——对战后端
java·开发语言·spring boot·websocket·spring
带娃的IT创业者43 分钟前
《Python实战进阶》专栏 No2: Flask 中间件与请求钩子的应用
python·中间件·flask
kyle~44 分钟前
thread---基本使用和常见错误
开发语言·c++·算法
坚持就完事了1 小时前
Python之numpy
开发语言·python·numpy