【问题标题】:How to wait for page to load completely using JavaScript in Selenium如何在 Selenium 中使用 JavaScript 等待页面完全加载
【发布时间】:2015-08-31 03:07:58
【问题描述】:

我正在尝试让页面在执行操作之前完全加载。我不想在浏览器选项卡上的加载圆圈仍在转动时开始操作。我的等待 ajax 功能在某些情况下不起作用,尤其是对于新页面加载。我的函数是基于 JQuery 的:

JavascriptExecutor jsDriver = (JavascriptExecutor) webDriver;
boolean stillRunningAjax = (Boolean) jsDriver
        .executeScript("return window.jQuery != undefined && jQuery.active != 0");
return !stillRunningAjax;

如果错误,请再次运行它。

但是对于页面加载,在它返回 true 之后,浏览器仍在加载(加载循环正在转动)几秒钟(有时更多)。

我已经尝试过隐式等待,但它会在我的函数同时停止该函数。

有人说硒没有完整的解决方案。但应该有。也许是一个包含 JavaScript 的解决方案,任何东西。

【问题讨论】:

  • 听起来你的“页面准备”取决于其他的东西,而不仅仅是 jQuery 的内部活动状态。您应该与页面的开发人员交谈,但我建议(也许)等到加载微调器消失以上变为真的之后。
  • java AND javascript 标记?
  • @Kayvar 是的,为什么?
  • @TaylanDerinbay 认为这是一个错误......我想即使它是用 Java 编写的,也有一些 jquery 所以没关系..

标签: java javascript selenium webdriver selenium-chromedriver


【解决方案1】:

使用javascript等待页面加载:

void waitForLoad(WebDriver driver) {
ExpectedCondition<Boolean> pageLoadCondition = new
    ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {
            return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
        }
    };
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(pageLoadCondition);
}

如果您正在等待 ajax 在页面上显示元素,则可以等待元素本身。

WebElement myDynamicElement = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

【讨论】:

  • 为什么选择 C#?这被标记为 [java]
  • OP 很清楚问题正在等待 Ajax 请求完成。 Ajax请求对document.readyState没有影响,所以检查document.readyState的值是没有意义的。
  • 那么在我看来,等待动态元素是最简单的方法。如果他想等待没有 ajax 的页面,那么第一个代码示例就可以了。在我的回答中更清楚地说明了这一点。谢谢!
  • 关于等待元素,大多数情况下我需要的元素已经加载并在页面中看到。但是如果我在不等待页面加载的情况下对它们进行操作,在某些情况下会出错,这就是为什么我需要等到页面完全加载。
  • @ingrid.e 顺便说一句,您的代码块给出的结果与我的相同。它在页面加载完成之前完成。还是谢谢
猜你喜欢
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多