【问题标题】:What is the best way to scroll to a web element located on the current page within the viewport using Selenium使用 Selenium 在视口内滚动到位于当前页面上的 Web 元素的最佳方式是什么
【发布时间】:2018-12-28 04:24:37
【问题描述】:

我是自动化的新手,我想知道如何使用 selenium 和 java 滚动到当前页面上的 Web 元素。

我尝试了许多在 stackoverflow 中描述的方法。但无法解决我的问题。

我尝试过的解决方案:

WebElement element = driver.findElement(By.id("id_of_element"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Thread.sleep(500);

【问题讨论】:

标签: java selenium selenium-webdriver webdriver webdriverwait


【解决方案1】:

您可以使用 Selenium 提供的 Actions 类。

public void scrollToElement(WebElement element){
    Actions actions = new Actions(driver);
    actions.moveToElement(element);
    actions.perform();
    WebDriverWait wait = new WebDriverWait(driver, 60);
    wait.until(ExpectedConditions.visibilityOf(element));
}

这里我添加了一个显式等待,它会一直等到网页元素可见。最长等待时间为 60 秒。如果 web 元素在 60 秒内不可见,则会引发异常。您可以通过更改此行来增加等待时间。

WebDriverWait wait = new WebDriverWait(driver, 60);

希望这会有所帮助。

【讨论】:

  • 这是做同样事情的好方法。与直接在浏览器中执行js相比,它总是会产生问题。
  • @pguardiario 不只是被fancy 链接Actions 如果元素从一开始就不可见/不存在,那么肯定会失败。
  • @deban - js 方式也是这样吗?
  • 我的元素从一开始就不可见。但这会滚动并找到元素。
  • @DebanjanB 我已经测试了你的代码,它也可以正常工作。
【解决方案2】:

要使用 SeleniumJavaViewport 内的当前页面上滚动 WebElement,您需要诱导 WebDriverWait 用于元素的可见性,您可以使用以下解决方案:

WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.id("id_of_element")));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element)

【讨论】:

    【解决方案3】:

    您将该元素从 javascript 传递到 java 并返回到 javascript。 这是个坏主意,当它进行往返时,它可能不再存在了。

    ((JavascriptExecutor) driver).executeScript("document.querySelector('#id_of_element').scrollIntoView(true);");
    

    此外,您需要滚动到视图中(使用较旧的 selenium)的很多事情,您不再这样做了。

    【讨论】:

    • 如果定位器策略在 xpath 中,您能否在此处提供滚动方式?我认为它会更有帮助
    • 我认为当你在 scrollIntoView() 中传递 true 时,它​​只会向下滚动。如果元素位于页面顶部,则可能会失败。
    • 您需要将 xpath 转换为 css。 scrollIntoView 的参数会影响对齐方式和行为。
    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多