Abbiamo una funzione generica per verificare se la pagina è stata caricata completamente in Selenium

Sto cercando di verificare se la pagina web è stata caricata completata o meno (cioè controllando che tutto il controllo sia caricato) nel selenium.

Ho provato sotto il codice:

new WebDriverWait(firefoxDriver, pageLoadTimeout).until( webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete")); 

ma anche se la pagina si sta caricando sopra il codice non aspetta.

So che posso controllare un particolare elemento per verificare se è visibile / cliccabile ecc ma sto cercando una soluzione generica

Come hai detto se esiste una funzione generica per verificare se la pagina è stata caricata completamente in Selenium, la risposta è No.

Per prima cosa diamo un’occhiata al tuo codice di prova che è il seguente:

 new WebDriverWait(firefoxDriver, pageLoadTimeout).until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete")); 

Il parametro pageLoadTimeout nella riga di codice precedente non è realmente reseamble all’effettiva pageLoadTimeout() .

Qui puoi trovare una discussione dettagliata di pageLoadTimeout in Selenium che non funziona


Ora, poiché il tuo caso utilizza la pagina caricata completamente, puoi utilizzare la pagina pageLoadStrategy() impostata su normal [i valori supportati sono none , desiderosi o normali ] utilizzando l’istanza di DesiredCapabilities Class o ChromeOptions Class come segue:

  • Usando la class DesiredCapabilities :

      import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.remote.DesiredCapabilities; public class myDemo2 { public static void main(String[] args) throws Exception { System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); DesiredCapabilities dcap = new DesiredCapabilities(); dcap.setCapability("pageLoadStrategy", "normal"); FirefoxOptions opt = new FirefoxOptions(); opt.merge(dcap); WebDriver driver = new FirefoxDriver(opt); driver.get("https://www.google.com/"); System.out.println(driver.getTitle()); driver.quit(); } } 
  • Utilizzo della class ChromeOptions :

     import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.PageLoadStrategy; public class myDemo1 { public static void main(String[] args) throws Exception { System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); FirefoxOptions opt = new FirefoxOptions(); opt.setPageLoadStrategy(PageLoadStrategy.NORMAL); WebDriver driver = new FirefoxDriver(opt); driver.get("https://www.google.com/"); System.out.println(driver.getTitle()); driver.quit(); } } 

Puoi trovare una discussione dettagliata nella Page load strategy for Chrome driver (Updated till Selenium v3.12.0)


Ora l’impostazione di PageLoadStrategy su NORMAL e la prova del codice garantiscono entrambi che il client del browser abbia (cioè il browser Web ) raggiunto 'document.readyState' uguale a "complete" . Una volta soddisfatta questa condizione, Selenium esegue la riga successiva del codice.

È ansible trovare una discussione dettagliata in Selenium IE WebDriver only works while debugging

Ma il client browser che raggiunge 'document.readyState' uguale a "complete" continua a non garantire che tutte le chiamate JavaScript e Ajax siano state completate.


Per attendere il completamento di tutte le chiamate JavaScript e Ajax, è ansible scrivere una funzione come segue:

 public void WaitForAjax2Complete() throws InterruptedException { while (true) { if ((Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")){ break; } Thread.sleep(100); } } 

È ansible trovare una discussione dettagliata in Wait for ajax request to complete - selenium webdriver


Ora, i due precedenti approcci attraverso PageLoadStrategy e “return jQuery.active == 0” sembrano essere in attesa di eventi indefiniti. Quindi, per un’attesa definita, è ansible indurre l’ inconnessione di WebDriverWait con ExpectedConditions impostata sul metodo titleContains() che assicurerà che il Page Title (ovvero la Pagina Web ) sia visibile e presupponga che tutti gli elementi siano visibili come segue:

 driver.get("https://www.google.com/"); new WebDriverWait(driver, 10).until(ExpectedConditions.titleContains("partial_title_of_application_under_test")); System.out.println(driver.getTitle()); driver.quit(); 

Ora, a volte è ansible anche se il titolo della pagina corrisponde al titolo dell’applicazione, tuttavia l’elemento desiderato che si desidera interagire non ha completato il caricamento. Quindi un approccio più granulare sarebbe quello di indurre l’ inconnessione di WebDriverWait con ExpectedConditions impostata sul metodo visibilityOfElementLocated() che farà in modo che il programma attenda che l’ elemento desiderato sia visibile come segue:

 driver.get("https://www.google.com/"); WebElement ele = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_of_the_desired_element"))); System.out.println(ele.getText()); driver.quit(); 

Io uso anche il selenium e ho avuto lo stesso problema, per risolvere il problema, ho solo dovuto aspettare il caricamento di jQuery.

Quindi se hai lo stesso problema prova anche questo

 ((Long) ((JavascriptExecutor) browser).executeScript("return jQuery.active") == 0); 

Puoi racchiudere entrambe le funzioni in un metodo e controllare finché non vengono caricate sia la pagina che jQuery

Implementalo, lavora per molti di noi, incluso me. Comprende l’attesa della pagina Web su JavaScript, Angular, JQuery, se presente.

Se la tua applicazione contiene Javascript e JQuery puoi scrivere il codice solo per quelli,

Definirlo in un unico metodo e puoi chiamarlo ovunque:

  // Wait for jQuery to load { ExpectedCondition jQueryLoad = driver -> ((Long) ((JavascriptExecutor) driver).executeScript("return jQuery.active") == 0); boolean jqueryReady = (Boolean) js.executeScript("return jQuery.active==0"); if (!jqueryReady) { // System.out.println("JQuery is NOT Ready!"); wait.until(jQueryLoad); } wait.until(jQueryLoad); } // Wait for ANGULAR to load { String angularReadyScript = "return angular.element(document).injector().get('$http').pendingRequests.length === 0"; ExpectedCondition angularLoad = driver -> Boolean.valueOf(((JavascriptExecutor) driver).executeScript(angularReadyScript).toString()); boolean angularReady = Boolean.valueOf(js.executeScript(angularReadyScript).toString()); if (!angularReady) { // System.out.println("ANGULAR is NOT Ready!"); wait.until(angularLoad); } } // Wait for Javascript to load { ExpectedCondition jsLoad = driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").toString() .equals("complete"); boolean jsReady = (Boolean) js.executeScript("return document.readyState").toString().equals("complete"); // Wait Javascript until it is Ready! if (!jsReady) { // System.out.println("JS in NOT Ready!"); wait.until(jsLoad); } } 

Clicca qui per il link di riferimento

Fammi sapere se sei bloccato ovunque implementando.

Supera l’uso di Thread o Explicit Wait.

  public static void waitForPageToLoad(long timeOutInSeconds) { ExpectedCondition expectation = new ExpectedCondition() { public Boolean apply(WebDriver driver) { return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete"); } }; try { System.out.println("Waiting for page to load..."); WebDriverWait wait = new WebDriverWait(Driver.getDriver(), timeOutInSeconds); wait.until(expectation); } catch (Throwable error) { System.out.println( "Timeout waiting for Page Load Request to complete after " + timeOutInSeconds + " seconds"); } } 

Prova questo metodo