【问题标题】:Webdriver: Wait for PagetoLoad and then Scroll to ElementWebdriver:等待 PagetoLoad 然后滚动到 Element
【发布时间】:2017-04-28 17:18:39
【问题描述】:
  1. 在滚动到相关 Web 元素之前,我需要等待页面“弹出叠加”加载。

  2. 以下代码在定位和滚动到 web 元素时是成功的,但我想避免使用 Thread.sleep。

    public void scrollToElementByLocator(WebElement element) throws InterruptedException {
    
    Thread.sleep(4000);
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element);
    
    ((JavascriptExecutor) driver).executeScript("window.scrollBy(0, -400)");
    

3.谁能建议另一种方法来等待页面加载,然后在不使用 thread.sleep 的情况下滚动到预期的 web 元素?

非常感谢您的帮助

【问题讨论】:

  • 在页面加载时尝试在任何元素上click()。你应该得到异常,比如element is not clickable at the point ... other element received the click... Show the part of exception with HTML of element that 实际上收到点击(覆盖目标元素的模态窗口)
  • 以下链接将满足您的需求stackoverflow.com/questions/15122864/…

标签: java selenium selenium-webdriver webdriver


【解决方案1】:

这是一种痛苦。理想情况下,您可以访问开发人员,他们可以告诉您哪些元素出现/消失,您可以等待。在这种情况下,我假设您无权访问它们。

我尝试做的是触发动作,快速右键单击并选择检查元素,然后查看弹出哪些元素。如果幸运的话,对话框等会一直显示并且很容易找到。在这种情况下,它们发生得如此短暂,以至于它真的很难。我所做的是执行上面的操作,直到我触发它打开/关闭并观察 DOM 元素的出现/消失。我终于找到了正确的地方,并使用 screencap 和 OCR 找到了这个

<div class="modal in" id="loading-modal" data-backdrop data-keyboard="false" tabindex="-1" role= "dialog" aria-hidden="true" style="z-index: 1100; top: 475px; display: block; padding-right: 17px;" modal-dialog">
<div> id="loading-page-backdrop" class="in"></div> 

那里有几个 DIV,其中一个很可能是您要查找的元素,并且都有 ID,因此它们应该很容易获取并等待它们不可见。

// wait for modal to disappear
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-modal")));
// do stuff

即使这些不是您要查找的元素,您也应该能够使用此技术找到您想要的元素。

顺便说一句,我用 Java 编写自动化程序,而且我从来不需要滚动窗口……它只是为我做的。你试过没有滚动码的场景吗?

【讨论】:

  • 非常感谢您的帮助,我目前使用的是 firefox 47.0.1,并且由于某种原因,如果我在尝试执行任何操作之前没有滚动到 WebElement 所在页面上的相关位置我收到无法点击的消息。 screencap 和 OCR 是一种软件吗?再次感谢
  • 截屏只是截屏...截屏。 OCR 是从图像中提取文本的软件。我这样做只是为了可以在此处发布文本,您实际上不需要该部分。只需截取屏幕截图,如果它很快消失,您仍然可以返回查看 HTML。
  • 如果您发现此答案(或任何答案)有用,请点赞。如果这回答了您的问题,请将其标记为已接受。谢谢!
【解决方案2】:

我用于等待页面加载的解决方案是等待页面标题与我期望的匹配。例如:

public Boolean waitForPageIsLoaded(String title) {
     return new WebDriverWait(driver, 10).until(ExpectedConditions.titleIs(title));
}

当然,如果您知道您在等待什么WebElement,那么您可以利用很多ExpectedConditions,例如visibilityOf()

【讨论】:

    【解决方案3】:

    要验证页面是否已完全加载,请循环执行以下语句,直到它返回值“完成”

    (String) ((JavascriptExecutor) driver).executeScript("return document.readyState");
    

    更多详情请咨询here

    【讨论】:

    • 比循环更好,会尝试 Selenium 的new WebDriverWait().until(ExpectedConditions...)...
    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2017-02-13
    • 2013-11-26
    相关资源
    最近更新 更多