等待ajax请求完成 - selenium webdriver

时间:2018-03-12 07:42:37

标签: ajax selenium-webdriver

我被困在我希望我的脚本等待ajax请求完成的位置。

我试过了: 1.在慢速网络模式下运行应用程序,单击“创建”按钮并选中JQuery.active返回1.仅发生ajax调用。

问题是整页没有刷新。只是页面上的一些数据每次都会更新。

我使用显式等待,直到加载程序/进度条消失,但我被要求专门等待ajax完成,因为UI可能很快就会改变。

我尝试了实施:

public boolean waitForJSandJQueryToLoad() {

    WebDriverWait wait = new WebDriverWait(driver, 30);

    // wait for jQuery to load
    ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
        try {
          return ((Long)((JavascriptExecutor)getDriver()).executeScript("return jQuery.active") == 0);
        }
        catch (Exception e) {
          // no jQuery present
          return true;
        }
      }
    };

    // wait for Javascript to load
    ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
        return ((JavascriptExecutor)getDriver()).executeScript("return document.readyState")
        .toString().equals("complete");
      }
    };

  return wait.until(jQueryLoad) && wait.until(jsLoad);
}

但它不起作用。我的测试失败了,因为在ajax完成和数据更新之前调用了断言。

有人可以给我解决方案: 1.检查AJAX是否正在运行。 2.等到ajax完成。 3.等待数据更新/刷新,而不是整页。

谢谢!

1 个答案:

答案 0 :(得分:2)

这是我用来等待Ajax完成的代码:

public static void waitForAjaxToFinish() {

    WebDriverWait wait = new WebDriverWait(driver, 5000);
    wait.until(new ExpectedCondition<Boolean>() {

        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript("return jQuery.active == 0").equals(true);
        }

    });
}

和我用来等待JQuery活动的代码:

public static void waitForJQueryToBeActive() {
    Boolean isJqueryUsed = (Boolean) ((JavascriptExecutor) driver)
            .executeScript("return (typeof(jQuery) != 'undefined')");
    if (isJqueryUsed) {
        while (true) {
            // JavaScript test to verify jQuery is active or not
            Boolean ajaxIsComplete = (Boolean) (((JavascriptExecutor) driver)
                    .executeScript("return jQuery.active == 0"));
            if (ajaxIsComplete)
                break;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
        }
    }
}

希望这有帮助。