解决Selenium报错:Element is not clickable at point (x, y). Other element would receive the click

本文介绍了解决Selenium中元素被遮挡导致无法点击的问题。通过监测弹窗的display属性变化来判断是否可以进行下一步操作。
部署运行你感兴趣的模型镜像

用Python写路由器控制脚本的时候遇到这个问题,Selenium提示如下:

Message: Element is not clickable at point (1191.5, 143). Other element would receive the click: <div style="display: block; width: 100%; height: 911px; opacity: 0.15;" id="lock_div"></div>

翻译过来的字面意思大概是:元素在坐标(1191.5,143)处不可进行点击操作,其他元素或许会收到这个点击操作。

我这里的操作是这样的:使用Selenium进行路由器参数配置,配置完成后保存,接着点击返回按钮。

问题就出现在点击返回按钮这个操作处,操作界面如图:


我第一反应是,图中的弹窗(“请稍后...”)需要一定时间完成,为了保证下一步返回按钮元素能被可靠点击,应当加入等待,于是我在点击前加上:

WebDriverWait(self.browser, 50).until(EC.element_to_be_clickable((By.CLASS_NAME, "return_a")))
但是这样做并没有效果,我在这条语句执行前后加上了时间戳,发现根本没有一点时间间隔:

time1: 2017-06-20 20:30:45
time2: 2017-06-20 20:30:45

也就是说,出现弹窗后,实际上这个按钮是clickable的,所以这样等待没用。

那么为什么会不能点击呢?由于我并不熟悉前端技术,我只能猜测可能是这个弹窗界面遮挡住了我的按钮,导致无法点击,顺着这个思路,那么我应该等待弹窗显示结束。

简单的等待方法就是直接采用time.sleep()方法进行延时,但这种方法比较土,等待时间并不精确,于是我想用一种更加优雅的方式。


经过查找,我发现弹窗有如下html标签:

<div style="left: 805.5px; top: 277px; display: none;" id="message_layer">
    <div id="msg_type" class="success"></div>
    <div id="msg" class="word">设置成功</div>
</div>

div标签的display属性在弹窗期间等于block,表示弹窗可见,而弹窗前和结束后会变为none,弹窗被隐藏。

那么代码就很好写了,只要等待这个div的display属性变为none就代表配置结束了,正好可以利用Selenium中的is_displayed()方法:

from time import sleep

msg_24g = self.browser.find_element_by_id("message_layer")
while msg_24g.is_displayed():
      sleep(1)

至此,问题得到了解决。 

另外expected_conditions里面有个方法is_visibility()好像也可以实现这个功能,但我试了下不是很好用,大家有兴趣可以看看。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们正在解决Selenium操作日期输入后点击其他元素时出现的"element click intercepted"错误。根据引用资料,这个错误通常是因为元素被其他元素遮挡(如弹窗、浮动广告等)或者元素尚未可交互(如加载未完成)导致的。以下是几种解决方案: 1. **使用JavaScript直接点击**(引用[5]): 通过执行JavaScript代码来点击元素,可以绕过前端事件监听和遮挡问题。 ```python element = driver.find_element(By.XPATH, "xpath表达式") driver.execute_script("arguments[0].click();", element) ``` 2. **显式等待元素可点击**(引用[4]): 在点击之前,使用显式等待确保元素不仅存在而且可点击(使用`element_to_be_clickable`条件)。 ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待元素可点击 element = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "xpath表达式")) ) element.click() ``` 3. **等待后添加短暂休眠**(引用[4]): 即使使用了显式等待,有时元素刚出现但可能还处于不可点击状态(比如动画效果未结束),可以在等待后加一个短暂休眠。 ```python element = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "xpath表达式")) ) time.sleep(1) # 等待1秒 element.click() ``` 4. **检查并关闭遮挡物**: 如果页面上有弹窗、广告等遮挡了目标元素,需要先关闭这些遮挡物。例如,可能会有一个日期选择面板在操作后没有及时关闭,导致后续元素被遮挡。 5. **滚动元素到可视区域**: 如果元素不在可视区域内,需要先滚动到该元素位置。 ```python element = driver.find_element(By.XPATH, "xpath表达式") driver.execute_script("arguments[0].scrollIntoView(true);", element) element.click() ``` 6. **尝试使用ActionChains**: 使用模拟鼠标操作,有时候可以解决遮挡问题。 ```python from selenium.webdriver.common.action_chains import ActionChains element = driver.find_element(By.XPATH, "xpath表达式") ActionChains(driver).move_to_element(element).click().perform() ``` 7. **检查元素是否在iframe中**(引用[3]): 如果目标元素在iframe内,需要先切换到对应的iframe。 ```python driver.switch_to.frame("iframe的id或name") # 或者通过索引、WebElement切换 # 操作元素 driver.switch_to.default_content() # 操作完成后切换回主文档 ``` 8. **调整浏览器窗口大小**: 有时候窗口大小不合适会导致元素被遮挡,可以尝试最大化窗口。 ```python driver.maximize_window() ``` 9. **检查元素是否被禁用**: 确保元素没有被设置`disabled`属性。 针对日期选择操作后的场景,特别要注意日期选择面板可能没有及时关闭,从而遮挡了后续元素。因此,在操作完日期选择后,确保日期面板已经关闭(比如点击一下页面其他空白区域关闭面板)再进行下一步操作。 如果以上方法都不能解决,可以尝试组合使用,比如先滚动到元素,再使用ActionChains点击,或者使用JavaScript点击。 **注意**:根据引用[4]的建议,使用显式等待后加一个短暂的休眠(如1秒)有时能解决元素刚出现但不可点击的问题。 **总结步骤**: 1. 确保日期选择面板已经关闭(可能需要点击页面空白处)。 2. 使用显式等待(`element_to_be_clickable`)等待目标元素可点击,并加上短暂休眠。 3. 尝试使用JavaScript点击。 4. 如果元素在iframe中,切换iframe。 5. 检查是否有其他遮挡物(如广告、弹窗),并关闭它们。 请根据实际情况选择合适的方法进行尝试。</think>### Selenium解决"element click intercepted"错误的完整指南 当使用Selenium操作日期输入后点击其他元素时出现"element click intercepted"错误,通常是由于元素被遮挡或页面状态未就绪导致的。以下是系统化的解决方案: #### 1. **确保元素可交互状态** ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 显式等待元素可点击(推荐) element = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//your/element/xpath")) ) element.click() # 添加短暂延迟(备选方案) time.sleep(1) # 处理页面过渡动画 ``` #### 2. **JavaScript直接点击(绕过遮挡)** ```python element = driver.find_element(By.XPATH, "//your/element/xpath") driver.execute_script("arguments[0].click();", element) # 通过JS执行点击[^5] ``` #### 3. **处理日期选择器的特殊场景** ```python # 关闭日期选择面板后再操作 date_picker = driver.find_element(By.ID, "datepicker") date_picker.click() # 打开日期选择器 # 选择日期后关闭面板 driver.find_element(By.XPATH, "//td[text()='15']").click() # 选择15号 driver.find_element(By.TAG_NAME, "body").click() # 点击空白区域关闭面板[^4] # 再操作其他元素 submit_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "submit")) ) ``` #### 4. **处理元素遮挡问题** ```python # 滚动元素到可视区域 element = driver.find_element(By.ID, "target-element") driver.execute_script("arguments[0].scrollIntoView({block:'center'});", element) # 关闭可能遮挡的浮动元素(如广告) if driver.find_elements(By.CLASS_NAME, "ad-popup"): driver.find_element(By.CLASS_NAME, "close-ad").click() ``` #### 5. **框架切换与等待策略** ```python # 处理iframe中的元素 WebDriverWait(driver, 10).until( EC.frame_to_be_available_and_switch_to_it((By.ID, "iframe-id")) ) # 操作iframe内元素 driver.find_element(By.ID, "inner-element").click() driver.switch_to.default_content() # 切回主文档[^3] # 复合等待策略 WebDriverWait(driver, 20).until( EC.visibility_of_element_located((By.ID, "element")) ) time.sleep(0.5) # 处理短暂不可点击状态[^4] ``` #### 6. **浏览器环境优化** ```python # 调整浏览器窗口尺寸 driver.set_window_size(1200, 900) # 避免响应式布局遮挡 # 使用无头模式测试 from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") ``` ### 根本原因分析 1. **日期选择器未关闭**:日期面板遮挡后续操作元素[^4] 2. **页面加载延迟**:AJAX请求未完成导致元素状态不稳定 3. **动画过渡效果**:CSS动画期间元素不可交互 4. **浮动元素遮挡**:广告弹窗或临时提示覆盖目标区域 5. **框架上下文错误**:未切换到正确的iframe上下文[^3] > **最佳实践建议**:优先使用`EC.element_to_be_clickable`显式等待配合JS点击方案,可解决90%的拦截问题。对于日期选择器等复杂组件,操作后需显式关闭面板再继续后续操作[^1][^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值