Selenium 如何点击屏幕上 50% 和 50% 不在屏幕上的元素? [英] How does Selenium click on elements that are 50% on screen and 50% not on screen?

查看:49
本文介绍了Selenium 如何点击屏幕上 50% 和 50% 不在屏幕上的元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一个 div 元素.屏幕上显示其大小的 50%.其他 50% 超过屏幕高度并且不可见.无法滚动.

我尝试使用 Selenium 进行自动化测试并单击该 div 元素,但有时可以,有时却不能.

为什么 Selenium 不只是点击那个 div 的屏幕区域"?

这个功能是如何实现的?当我告诉 Selenium 点击一个巨大的 div 元素时,它是否点击了那个 div 上的随机位置?

解决方案

元素在视图中的中心点

根据 WebDriver W3C 规范,元素的 命令滚动查看元素,如果它还不是指针可交互的,则单击其视图中的中心点.

注意:如果元素的中心点被另一个元素遮挡,则返回元素点击拦截错误.如果元素在视口之外,则返回元素不可交互错误.

<小时>

解决方案

在这种情况下,有以下两种可能的解决方案:

  1. 你可以诱导WebDriverWait 设置 expected_conditions 作为 element_to_be_clickable().因此,您的代码行将是:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()

  2. 您可以使用 move_to_element(to_element)click(on_element=None) 方法.因此,您的代码行将是:

    ActionChains(driver).move_to_element(element).click(element).perform()

<小时>

参考

您可以在 selenium.common 中找到相关讨论.exceptions.ElementClickInterceptedException:消息:元素点击被拦截:元素不可使用Selenium和Python点击

There is a div-Element. 50% of its size are on the screen. The other 50% go over the screen height and are not visible. There is no scrolling possible.

I tried to automate a test with Selenium and click on that div-element, but sometimes it works and sometimes it does not.

Why does Selenium not just click on the "on-screen-area" of that div?

And how is this functionality implemented? When I tell Selenium to click on a huge div-element, does it click on a random position on that div?

解决方案

element’s in-view center point

As per the WebDriver W3C Specification an element’s in-view center point is the origin position of the rectangle that is the intersection between the element’s first DOM client rectangle and the initial viewport.

Given an element that is known to be in view, it can be calculated this way:

  1. Let rectangle be the first element of the DOMRect sequence returned by calling getClientRects on element.
  2. Let left be max(0, min(x coordinate, x coordinate + width dimension)).
  3. Let right be min(innerWidth, max(x coordinate, x coordinate + width dimension)).
  4. Let top be max(0, min(y coordinate, y coordinate + height dimension)).
  5. Let bottom be min(innerHeight, max(y coordinate, y coordinate + height dimension)).
  6. Let x be floor((left + right) ÷ 2.0).
  7. Let y be floor((top + bottom) ÷ 2.0).
  8. Return the pair of (x, y).

An element is in view if it is a member of its own pointer-interactable paint tree, given the pretense that its pointer events are not disabled.


Element Click

As per the documentation the Element Click command scrolls into view the element if it is not already pointer-interactable, and clicks its in-view center point.

Note: If the element’s center point is obscured by another element, an element click intercepted error is returned. If the element is outside the viewport, an element not interactable error is returned.


Solution

In such cases there are two possible solutionas follows:

  1. You can induce WebDriverWait setting the expected_conditions as element_to_be_clickable(). So effectively your line of code will be:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
    

  2. You can use move_to_element(to_element) and click(on_element=None) method respectively. So effectively your line of code will be:

    ActionChains(driver).move_to_element(element).click(element).perform()
    


Reference

You can find a relevant discussion in selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable with Selenium and Python

这篇关于Selenium 如何点击屏幕上 50% 和 50% 不在屏幕上的元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆