html - Selenium 如何点击 50% 在屏幕上和 50% 不在屏幕上的元素?
问题描述
有一个 div 元素。其大小的 50% 在屏幕上。其他 50% 超出屏幕高度并且不可见。无法滚动。
我尝试使用 Selenium 自动化测试并单击该 div 元素,但有时它可以工作,有时它不能。
为什么 Selenium 不只是单击该 div 的“屏幕区域”?
这个功能是如何实现的?当我告诉 Selenium 单击一个巨大的 div 元素时,它会单击该 div 上的随机位置吗?
解决方案
元素的视图中心点
根据WebDriver W3C 规范,元素的视图中心点是矩形的原点位置,该矩形是元素的第一个DOM客户端矩形和初始视口之间的交点。
给定一个已知可见的元素,可以这样计算:
- 让 rectangle 成为通过在 element 上调用 getClientRects 返回的 DOMRect 序列的第一个元素。
- 让left为max(0,min(x坐标,x坐标+宽度尺寸))。
- 设右为 min(innerWidth, max(x 坐标, x 坐标 + 宽度尺寸))。
- 让 top 为 max(0, min(y 坐标,y 坐标 + 高度维度))。
- 设底部为 min(innerHeight, max(y 坐标, y 坐标 + 高度维度))。
- 设 x 为 floor((left + right) ÷ 2.0)。
- 设 y 为 floor((top + bottom) ÷ 2.0)。
- 返回 (x, y) 对。
如果一个元素是它自己的指针可交互绘制树的成员,那么它就在视图中,假设它的指针事件没有被禁用。
元素点击
根据文档,如果元素尚未与指针交互,元素单击命令将滚动到视图中,并单击其视图中心点。
注意:如果元素的中心点被另一个元素遮挡,则返回元素点击拦截错误。如果元素在视口之外,则返回元素不可交互错误。
解决方案
在这种情况下,有以下两种可能的解决方案:
您可以诱导WebDriverWait将expected_conditions设置为
element_to_be_clickable()
. 因此,您的代码行将是:WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
可以分别使用
move_to_element(to_element)
和click(on_element=None)
方法。因此,您的代码行将是:ActionChains(driver).move_to_element(element).click(element).perform()
参考
您可以在 selenium.common.exceptions.ElementClickInterceptedException 中找到相关讨论:消息:元素单击被截获:元素无法使用 Selenium 和 Python 进行点击
推荐阅读
- git - npm-debug.log 在 .gitignore 文件中,但我仍然收到消息“没有添加到提交但存在未跟踪的文件(使用“git add”来跟踪)”
- lotus-notes - 如果在 Web 中不想要查看,则隐藏按钮 - Lotus Notes
- asynchronous - 如何从使用 Futures/async/await 的流中正确生成?
- android - 如何使用数据绑定和导航组件访问嵌套视图?
- php - 什么功能验证优惠券字段中的条目?(WooCommerce)
- scala - 在 Ubuntu 18.04 上找不到命令“scala”
- php - 表“catalog_product_super_link”和“catalog_product_relation”显示错误的父子记录
- angular - 处理响应数据而不是 Json,Angular 6
- python - 无法修复错误:create() 采用 1 个位置参数,但给出了 2 个并且似乎无法修复它
- .net - 如何将 pdf 转换为 iTextSharp.Text.Image?