it-swarm.dev

Il selenio attende il caricamento del contenuto Ajax: approccio universale

Esiste un approccio universale per il Selenium per attendere che tutto il contenuto di ajax sia caricato? (non legato a un sito Web specifico, quindi funziona per ogni sito Web di ajax)

16
Fabian Lurz

Devi aspettare che Javascript e jQuery finiscano di caricare. Esegui Javascript per verificare se jQuery.active è 0 e document.readyState è complete, il che significa che il caricamento di JS e jQuery è completo.

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

Come Mark Collin ha descritto nel suo libro "Mastering Selenium Webdriver", utilizzare JavascriptExecutor consente di capire se un sito Web che utilizza jQuery ha finito di effettuare chiamate 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);");
        }
    };
  }
}
2
Slav Kurochkin

Ho usato questo semplice comando while per iterare fino a quando AJAX è finito. Funziona costantemente per me. 

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

Non credo che esista un approccio universale fuori dagli schemi. Generalmente faccio un metodo che fa un .waituntilrowcount(2) o waituntilvisible() che esegue il polling di un elemento.

0
eagle12