硒视域中元素的验证

Mad*_*uri 5 css java selenium viewport

如何验证元素在视口中是否可见(浏览器的可见性)或不使用Selenium?

我尝试使用下面的代码,但Point对象(Y值)返回巨大的值,因为页面是可滚动的.这里有元素维度,位置和浏览器的维度,并比较它们.

Dimension weD = element.getSize(); //to get the element Dimensions
Point weP = element.getLocation(); // getting the location of the element in the page.

Dimension d = driver.manage().window().getSize(); // To get the browser dimensions
int x = d.getWidth(); //browser width
int y = d.getHeight(); //browser height
int x2 = weD.getWidth() + ewp.getX();
int y2 = weD.getHeight() + ewp.getY();
return x2 <= x && y2 <= y; 
Run Code Online (Sandbox Code Playgroud)

如果有人参与其中,你能否分享一下解决方案?

Flo*_* B. 9

它不可能直接通过API,因此您必须使用脚本注入.

确定元素在视口中是否可见的最佳方法是使用document.elementFromPoint将元素放在假定位置.如果它不在视口中,则返回null,如果不是,则返回元素或后代.

public static Boolean isVisibleInViewport(WebElement element) {
  WebDriver driver = ((RemoteWebElement)element).getWrappedDriver();

  return (Boolean)((JavascriptExecutor)driver).executeScript(
      "var elem = arguments[0],                 " +
      "  box = elem.getBoundingClientRect(),    " +
      "  cx = box.left + box.width / 2,         " +
      "  cy = box.top + box.height / 2,         " +
      "  e = document.elementFromPoint(cx, cy); " +
      "for (; e; e = e.parentElement) {         " +
      "  if (e === elem)                        " +
      "    return true;                         " +
      "}                                        " +
      "return false;                            "
      , element);
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*tch 8

谢谢 Florent B。转换为 python:

def is_element_visible_in_viewpoint(driver, element) -> bool:
    return driver.execute_script("var elem = arguments[0],                 " 
                                 "  box = elem.getBoundingClientRect(),    " 
                                 "  cx = box.left + box.width / 2,         " 
                                 "  cy = box.top + box.height / 2,         " 
                                 "  e = document.elementFromPoint(cx, cy); " 
                                 "for (; e; e = e.parentElement) {         " 
                                 "  if (e === elem)                        " 
                                 "    return true;                         " 
                                 "}                                        " 
                                 "return false;                            "
                                 , element)
Run Code Online (Sandbox Code Playgroud)