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

版权声明:本文为博主原创文章,转载请声明出处:) https://blog.csdn.net/chenpkai/article/details/73518844

用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()好像也可以实现这个功能,但我试了下不是很好用,大家有兴趣可以看看。

阅读更多

没有更多推荐了,返回首页