【问题标题】:Selenium Scroll into view doesn't work when element is already into view当元素已经在视图中时,Selenium 滚动到视图中不起作用
【发布时间】:2020-06-19 02:37:14
【问题描述】:

我体验到这种滚动到视图中的行为。通常,我使用 Actions 或 JavaScript 将元素滚动到视图中,如下所示:

Actions actions = new Actions(driver());
actions.moveToElement(element).build().perform();

js().executeScript("arguments[0].scrollIntoView();", element);

当元素超出视口时,它们都可以正常工作。但有时,我的元素已经在视口内,然后当它到达这些命令时,它实际上会将这些元素滚动到视图之外,并且测试失败,因为它不可点击。

有人遇到过同样的问题吗?有什么解决办法吗?

【问题讨论】:

  • 您是否尝试过先找到元素然后滚动?使用: if(driver.findElements(By.xpath("value")).size() != 0){ System.out.println("Element is Present"); }else{ js().executeScript("arguments[0].scrollIntoView();", element); }
  • jse.executeScript("arguments[0].scrollIntoView(true);", element); 呢?
  • @Avataar17:嗨,if else 也没有帮助,因为元素总是在那里,只是不在视口中
  • @NarendraR:嗨,我试过了,当元素已经在视图中时,它仍然会将元素滚动到视图之外

标签: java selenium selenium-webdriver automation


【解决方案1】:

您可以检查元素是否在视口中,并根据布尔值,您可以执行操作,以确定元素是否在我使用的视口中

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);
}

Reference

【讨论】:

  • 谢谢,我也找到了这个解决方法。在这种情况下它会有所帮助。
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 2018-08-09
  • 2017-06-10
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
相关资源
最近更新 更多