有一个 div 元素。其大小的 50% 在屏幕上。另外 50% 超出屏幕高度并且不可见。
无法滚动。
我尝试使用 Selenium 进行自动化测试并单击该 div 元素,但有时它有效,有时则无效。
为什么 Selenium 不直接点击该 div 的“屏幕区域”?
以及这个功能是如何实现的呢?当我告诉 Selenium 单击一个巨大的 div 元素时,它会单击该 div 上的随机位置吗?
视图中心点中的元素
根据WebDriver W3C 规范一个元素的视野内中心点是矩形的原点位置,该矩形是元素的第一个元素之间的交集DOM客户矩形和初始viewport.
给定一个已知在视图中的元素,可以这样计算:
- 令矩形为通过对 element 调用 getClientRects 返回的 DOMRect 序列的第一个元素。
- 令 left 为 max(0, min(x 坐标, x 坐标 + 宽度尺寸))。
- 令 right 为 min(innerWidth, max(x 坐标, x 坐标 + 宽度尺寸))。
- 令 top 为 max(0, min(y 坐标, y 坐标 + 高度尺寸))。
- 令底部为 min(innerHeight, max(y 坐标, y 坐标 + 高度尺寸))。
- 令 x 为下限((左 + 右) ÷ 2.0)。
- 设 y 为下限((顶部 + 底部) ÷ 2.0)。
- 返回 (x, y) 对。
如果某个元素是其自己的可与指针交互的绘制树的成员,并且假装其指针事件未禁用,则该元素处于视图中。
元素点击
![element_click](https://i.stack.imgur.com/k45SP.png)
根据文档元素点击如果该元素尚未可进行指针交互,命令将滚动到该元素的视图中,然后单击其视图中的中心点。
Note:如果元素中心点被其他元素遮挡,则返回元素点击拦截错误。如果元素位于视口之外,则会返回元素不可交互错误。
Solution
在这种情况下,有两种可能的解决方案:
-
你可以诱导WebDriver等待设置预期条件 as element_to_be_clickable()。因此,您的代码行实际上将是:
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
-
您可以使用move_to_element(to_element) and click(on_element=None)方法分别。因此,您的代码行实际上将是:
ActionChains(driver).move_to_element(element).click(element).perform()
参考
您可以在中找到相关讨论selenium.common.exceptions.ElementClickInterceptedException:消息:元素单击被拦截:元素在 Selenium 和 Python 中不可单击
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)