当前位置: 首页 > 知识库问答 >
问题:

如何使硒网络驱动程序等待页面加载,当通过JS事件加载新页面时

苏晓博
2023-03-14

我正在努力自动化一个网站,该网站有许多链接,这些链接通过JS事件加载新页面。基本上,有些元素是可点击的,单击一个会导致一些JavaScript运行,这会导致提交表单并路由到新页面。

现在,如果这些只是标准的HTML链接,就不会有问题,因为Selenium足够聪明,可以告诉您有一个新页面即将到来,并等待处理。但尽管如此,Selenium无法判断在这个实例中的点击是否会导致新页面加载,因此它不会等待,只是继续。因此,它不会等待新页面,尝试查找不存在的元素,我的测试都失败了。真倒霉

作为临时解决方案,我只是暂停程序三秒钟,如下所示:

oldPageDriver.clickThatButton();

try {
  Thread.sleep(3000);
} catch(InterruptedException ex) {
  Thread.currentThread().interrupt();
}

newPageDriver = new NewPageDriver(driver);
newPageDriver.doStuffOnNewPage();

这有点可行。我不喜欢它,因为它是“黑客”,只是中断程序,而不是做更聪明的事情。因为延迟被硬编码为3秒,所以如果链路正在工作但速度很慢,我会失败。我考虑过类似于隐式等待的方法,但它也能实现同样的效果,而且经过大量的查找,我还没有在Java中找到一个可靠、可行的答案。

那么,有没有人可以建议一个解决方法?具体来说,如何让Selenium知道需要一个新页面,并一直等到它可用?

共有3个答案

彭成天
2023-03-14

简单的ready2use片段,非常适合我

static void waitForPageLoad(WebDriver wdriver) {
    WebDriverWait wait = new WebDriverWait(wdriver, 60);

    Predicate<WebDriver> pageLoaded = new Predicate<WebDriver>() {

        @Override
        public boolean apply(WebDriver input) {
            return ((JavascriptExecutor) input).executeScript("return document.readyState").equals("complete");
        }

    };
    wait.until(pageLoaded);
}
席言
2023-03-14

显式等待是您所需要的;

http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

您可以直接将它添加到您的测试中,或者您可能希望将它弄干,特别是如果有一个常见的等待预期,比如旋转图标的消失。

您可以扩展click方法,使其在单击后总是等待,或者如果跟踪页面对象,则向基类添加wait_until_loaded方法。还有许多其他有效的方法,但这取决于AUT是如何实现的

黄跃
2023-03-14

等待document.ready事件并不是解决此问题的全部方法,因为此代码仍处于竞争状态:有时此代码在处理单击事件之前被触发,因此它会直接返回,因为浏览器尚未开始加载新页面。

经过一番搜索,我在测试山羊Obay上找到了一篇帖子,它有解决这个问题的方法。该解决方案的c#代码如下所示:

 IWebElement page = null;
 ...
 public void WaitForPageLoad()
 {
    if (page != null)
    {
       var waitForCurrentPageToStale = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
       waitForCurrentPageToStale.Until(ExpectedConditions.StalenessOf(page));
    }

    var waitForDocumentReady = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    waitForDocumentReady.Until((wdriver) => (driver as IJavaScriptExecutor).ExecuteScript("return document.readyState").Equals("complete"));

    page = driver.FindElement(By.TagName("html"));

}

'我在driver.navigate.gotourl后直接触发此方法,以便它尽快获得页面的引用。玩得开心!

 类似资料:
  • 问题内容: 我正在自动化一个包含许多链接的站点,这些链接通过JS事件加载新页面。基本上,有一些元素是可单击的,单击其中一个会导致运行一些JavaScript,这会导致提交表单并将其路由到新页面。 现在,如果这些只是标准的HTML链接,那将没有问题,因为Selenium足够聪明,可以告诉我们即将出现一个新页面并等待处理。但是,尽管如此,Selenium并不能说这种情况下的点击导致了新页面的加载,因此

  • 我在eclipse中使用SeleniumWebDriver和TestNG。问题是页面在某些数据的中途重新登录,并且重新加载的时间是灵活的,这就是为什么我不能应用显式等待时间。我想让webdriver等待,直到重新加载完成。 我正在尝试通过此代码执行此操作……但它不起作用。

  • 我试图创建一个等待加载页面的方法,但我出现了一个错误。可能我没有正确使用这个方法。 错误是:

  • 本文向大家介绍jQuery EasyUI 页面加载等待及页面等待层,包括了jQuery EasyUI 页面加载等待及页面等待层的使用技巧和注意事项,需要的朋友参考一下 下面一个代码片段是 easyUI 页面加载等待,代码如下所示: 下面看个工具类 基于easyui的页面等待提示层,即mask 效果图: 以上所述是小编给大家介绍的jQuery EasyUI 页面加载等待及页面等待层,希望对大家有所帮

  • 问题内容: 我编写了一个脚本,该脚本从页面中获取数据,但是有时页面需要花费一些时间来加载,因此当将html拉到汤对象中时,有时它什么也不会拉,因为页面仍然需要完成。 我编写了以下代码以等待页面完成。 有用 但是调用函数时出现以下错误; 问题答案: 我认为您应该这样使用: 如手册所述。

  • 我正在使用selenium web驱动程序3.4.0查找网站的响应时间。在较早的版本中,我使用了WebDriver wait=new WebDriverWait(driver,10);Wait.Until(ExpectedConditions.VisibilityOfElementLocated(By.id(“myid”)));查找加载的页面。 但这两行代码不适用于版本3.4.0。有没有其他方法可