Selenium selenium 搜索不到页面最底部的按钮

狂天 · 2020年12月03日 · 最后由 fiskeryang 回复于 2020年12月15日 · 2436 次阅读

这个按钮位置在页面的最底部,但是有点奇怪,如下图一

(图一)
页面的滚动条看上去已经滚到最底部了,仍然没显示按钮,需要继续向下滚动才会显示该按钮,如下图二:滚动条相对于图一收缩了

(图二)
这就是这个按钮,用 selenium 定位不到,在定位的时候 selenium 会自动将页面滚动到图一的位置,就不会往下继续滚了。
可能是因为 selenium 就将页面滚到滚动条的底部,但是我这页面实际还可以往下继续滚动,我要的按钮也在下面。
这种情况该咋定位到这个按钮呢?

最佳回复

要明确一点 是定位不到还是无法操作 按理来说应该是可以定位得到的
只是由于不可见 所以无法执行 selenium 自带的 click 方法
可以尝试用 JS 的 click 方法来点击

共收到 11 条回复 时间 点赞
报错

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <i class="si icon-addpages"></i> is not clickable at point (34, 141). Other element would receive the click: <div id="topMask" style="position: fixed; top: 0px; left: 0px; bottom: 0px; right: 0px; z-index: 9999999999999;"></div>
  (Session info: chrome=75.0.3770.142)

#方法一:
loc = driver.find_element_by_xpath("//div[@class='sidebar-btn yellow']/div/i")
driver.execute_script("arguments[0].click();", loc)


#方法二:
loc = driver.find_element_by_xpath("//div[@class='sidebar-btn yellow']/div/i")
webdriver.ActionChains(driver).move_to_element(loc).click(loc).perform()

参考资料:
https://blog.csdn.net/sonnyuu/article/details/96482795
https://www.cnblogs.com/yhleng/p/9299317.html

1、直接用 JS 的 click 不管是否可见 都能响应点击事件,不过这样也可能带来一些负面影响。总体来说还是可控的
2、运行时查看浏览器的操作,确定你需要操作的元素是否滚动到可见了, action 的 click 是可以穿透遮罩层的。driver 的 click 方法不行
3、参考 7 楼的方法,用无界面模式 可以自定义分辨率

要明确一点 是定位不到还是无法操作 按理来说应该是可以定位得到的
只是由于不可见 所以无法执行 selenium 自带的 click 方法
可以尝试用 JS 的 click 方法来点击

提交 bug,bug 解决后按原方法就能定位。
不要因为技术能解决就忽略了测试流程规范性。

解决这种问题,两种方案:
1.设置原始尺寸足够大(开启浏览器后台模式,设置一个超大尺寸,如 5000*5000)
2.按照比例滑动滚动条,操作一次判定一次。
伴随前端框架化越来越强大,导致定位元素使用 id 的日子一去不复返;
UI 自动化遇到的问题就会越来越复杂;UI 自动化需要改变思路,若业务复杂,变化较快使用 UI 自动化无任何意义。

fiskeryang 回复

的确滚动到可见了,但是很快滚走了,没有点击,网上大多也是讲的这两种方法(action 和 js 点击),但是我很疑惑为什么 actionchains 不行。

滑动滚动条的方法我之前确实试过,但是太慢了,毕竟列表可能比较长。

fiskeryang 回复

今日发现,即使是 js 也有一定的几率选不中。

有这种情况 对这种情况特殊的元素 可以点击后 再判断下状态 如果没点上 多点几次 😂

狂天 关闭了讨论 01月05日 14:02
fiskeryang 回复

看了一下报错,确实是点击不到,报的是 ElementClickInterceptedException,
加了一句
driver.execute_script("arguments[0].click();", loc)
就好了。
大佬你是怎么一下就发现是可以定位到但是点击不到的?

fiskeryang 回复

遇到了一个类似的问题,我尝试使用ActionChains(self.driver).move_to_element(ele).click().perform(),仍然无效,按理说我 move to element 之后元素应该可见了,应该可以点击了才对,这个情况是为什么呢

狂天 回复

这个问题很常见 😂

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册