Esiste un approccio universale per il selenio per attendere che tutto il contenuto di ajax sia caricato? (non collegato a un sito Web specifico, quindi funziona per ogni sito Web di ajax)Il selenio attende il caricamento del contenuto Ajax - approccio universale
risposta
È 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);
}
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);");
}
};
}
}
Grazie per il vostro suggerimento. Ma cosa succede se un lato non usa jQuery? –
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) –
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.
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;) –
Grazie :) Funzionerà con ogni sito Web o solo con i siti Web che utilizzano jQuery? –
Funzionerà su qualsiasi sito Web, gestisce la presenza e l'assenza di Jquery e JS – LINGS
Grazie - ci proverò ora –