2015-10-26 18 views

risposta

14

È necessario attendere Javascript e jQuery per terminare il caricamento. 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); 
} 
+0

Grazie :) Funzionerà con ogni sito Web o solo con i siti Web che utilizzano jQuery? –

+0

Funzionerà su qualsiasi sito Web, gestisce la presenza e l'assenza di Jquery e JS – LINGS

+0

Grazie - ci proverò ora –

2

Come descritto da Mark Collin 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);"); 
     } 
    }; 
    } 
} 
+0

Grazie per il vostro suggerimento. Ma cosa succede se un lato non usa jQuery? –

+0

Beh, se hai altre librerie javascript, dovresti fare affidamento su di esse. Nello stesso libro ha un esempio per AngularJS, altrimenti sarei d'accordo con un'altra risposta che devi essere specifica del dominio, e usare [Explicit and Implicit Waits] (http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit -e-implicito-attende) –

0

Non credo che ci sia 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

Hm - dammn. Esiste qualche altra libreria in grado di eseguire la scansione dei siti Web di ajax? Stretto di selenio, unità html e crawljax. Problema htmlunit: Molto sensibile contro l'errore e non è possibile disattivarlo. Crawljax: Probabilmente in grado di eseguire la scansione di ajax ma non è possibile ottenere l'html di una pagina Web - ouch selenio: vedere la domanda;) –

Problemi correlati