webentwicklung-frage-antwort-db.com.de

Selen wartet darauf, dass Ajax-Inhalte geladen werden - universeller Ansatz

Gibt es einen universellen Ansatz für Selenium, um zu warten, bis der gesamte Ajax-Inhalt geladen ist? (nicht an eine bestimmte Website gebunden - so funktioniert es für jede Ajax-Website)

16
Fabian Lurz

Sie müssen warten, bis Javascript und jQuery vollständig geladen sind. Führen Sie Javascript aus, um zu prüfen, ob jQuery.active0 und document.readyStatecomplete sind. Dies bedeutet, dass das Laden von JS und jQuery abgeschlossen ist.

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

Wie Mark Collin in seinem Buch "Mastering Selenium Webdriver" beschrieben hat, können Sie mit JavascriptExecutor herausfinden, ob eine Website, die jQuery verwendet, die Aufrufe von AJAX beendet hat

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);");
        }
    };
  }
}
2
Slav Kurochkin

Ich habe diese einfache Methode verwendet, um zu iterieren, bis ein AJAX abgeschlossen ist. Es funktioniert konsequent für mich. 

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);
    }
}
0
Aniket Wadkar

Ich glaube nicht, dass es eine universelle Herangehensweise gibt. Ich mache normalerweise eine Methode, die eine .waituntilrowcount(2) oder waituntilvisible() durchführt, die ein Element abfragt.

0
eagle12