【问题标题】:Wait for ajax request to complete - selenium webdriver等待 ajax 请求完成 - selenium webdriver
【发布时间】:2018-08-20 04:19:40
【问题描述】:

我被困在我希望我的脚本等到 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. 等到数据更新/刷新,而不是整个页面。

谢谢!!

【问题讨论】:

  • 您谈到的 用例,例如检查 AJAX 是否正在运行等到 ajax 完成等到数据更新/刷新,而不是整个页面都是微不足道的。您的实际 usecase 应该是明确的,并且必须与页面上的 WebElements 交互相关。你能用你的确切用例、相关的HTML代码试验更新问题吗?
  • 这里是确切的用例:

标签: ajax selenium-webdriver


【解决方案1】:

这是我用来等待 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) {
            }
        }
    }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2014-02-19
    • 2013-03-27
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多