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

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

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值