Saltar al contenido

Selenium espera a que se cargue el contenido de Ajax: enfoque universal

La guía paso a paso o código que hallarás en este post es la resolución más rápida y efectiva que encontramos a tu duda o problema.

Solución:

Debe esperar a que Javascript y jQuery terminen de cargarse. Ejecute Javascript para comprobar si jQuery.active es 0 y document.readyState es completelo que significa que la carga de JS y jQuery está completa.

public boolean waitForJSandJQueryToLoad() 

    WebDriverWait wait = new WebDriverWait(driver, 30);

    // wait for jQuery to load
    ExpectedCondition jQueryLoad = new ExpectedCondition() 
      @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 jsLoad = new ExpectedCondition() 
      @Override
      public Boolean apply(WebDriver driver) 
        return ((JavascriptExecutor)getDriver()).executeScript("return document.readyState")
        .toString().equals("complete");
      
    ;

  return wait.until(jQueryLoad) && wait.until(jsLoad);

Como Mark Collin describió en su libro “Mastering Selenium Webdriver”, el uso de JavascriptExecutor le permite averiguar si un sitio web que usa jQuery ha terminado de realizar llamadas AJAX.

public class AdditionalConditions 

  public static ExpectedCondition jQueryAJAXCallsHaveCompleted() 
    return new ExpectedCondition() 

        @Override
        public Boolean apply(WebDriver driver) 
            return (Boolean) ((JavascriptExecutor) driver).executeScript("return (window.jQuery != null) && (jQuery.active === 0);");
        
    ;
  

He estado usando este simple do while para iterar hasta que finaliza un AJAX. Funciona constantemente para mí.

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);
    

Recuerda algo, que puedes optar por la opción de aclarar tu experiencia si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *