Selenium ждет загрузки контента Ajax - универсальный подход

Существует ли универсальный подход для Selenium дождаться загрузки всего содержимого ajax? (не привязанный к определенному веб-сайту - поэтому он работает для каждого веб-сайта ajax)

Ответ 1

Вам нужно дождаться завершения Javascript и jQuery. Выполните Javascript, чтобы проверить, jQuery.active ли jQuery.active 0 и complete document.readyState, что означает, что загрузка JS и jQuery завершена.

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);
}

Ответ 2

Как описал Марк Коллин в своей книге "Освоение Selenium Webdriver", используйте JavascriptExecutor, чтобы выяснить, завершил ли сайт, использующий jQuery, вызов AJAX

public class AdditionalConditions {

  public static ExpectedCondition<Boolean> jQueryAJAXCallsHaveCompleted() {
    return new ExpectedCondition<Boolean>() {

        @Override
        public Boolean apply(WebDriver driver) {
            return (Boolean) ((JavascriptExecutor) driver).executeScript("return (window.jQuery != null) && (jQuery.active === 0);");
        }
    };
  }
}

Ответ 3

Я не считаю, что существует универсальный подход из коробки. Обычно я делаю метод, который выполняет .waituntilrowcount(2) или waituntilvisible() который waituntilvisible() элемент.

Ответ 4

Я использовал этот простой do do для итерации до завершения AJAX. Это последовательно работает для меня.

public void waitForAjax() throws InterruptedException{
    while (true)
    {
        Boolean ajaxIsComplete = (Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0");
        if (ajaxIsComplete){
            info("Ajax Call completed. ");
            break;
        }
        Thread.sleep(150);
    }
}