Attendez qu’un appel Ajax se termine avec Selenium 2 WebDriver

J’utilise Selenium 2 WebDriver pour tester une interface utilisateur qui utilise AJAX.

Y a-t-il un moyen de faire en sorte que le pilote attende un peu la requête Ajax.

Fondamentalement j’ai ceci:

d.FindElement(By.XPath("//div[8]/div[3]/div/button")).Click(); // This click sortinggger an ajax request which will fill the below ID with content. // So I need to make it wait for a bit. Assert.IsNotEmpty(d.FindElement(By.Id("Hobbies")).Text); 

 var wait = new WebDriverWait(d, TimeSpan.FromSeconds(5)); var element = wait.Until(driver => driver.FindElement(By.Id("Hobbies"))); 

Si vous utilisez jQuery pour vos requêtes ajax, vous pouvez attendre que la propriété jQuery.active soit à zéro. D’autres bibliothèques peuvent avoir des options similaires.

 public void WaitForAjax() { while (true) // Handle timeout somewhere { var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"); if (ajaxIsComplete) break; Thread.Sleep(100); } } 

Vous pouvez également utiliser l’attente explicite Selenium ici. Ensuite, vous n’avez pas besoin de gérer le timeout vous-même

 public void WaitForAjax() { var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0")); } 

Solution Java basée sur la réponse de Morten Christiansens

     void public WaitForAjax () lève InterruptedException
     {

         tandis que (vrai)
         {

             Booléen ajaxIsComplete = (booléen) (pilote (JavascriptExecutor)) .executeScript ("return jQuery.active == 0");
             if (ajaxIsComplete) {
                 Pause;
             }
             Thread.sleep (100);
         }
     }


Juste une petite amélioration en ajoutant un paramètre de délai d’attente:

 internal static void WaitForAllAjaxCalls(this ISelenium selenium, IWebDriver driver, int timeout = 40) { Stopwatch sw = new Stopwatch(); sw.Start(); while (true) { if (sw.Elapsed.Seconds > timeout) throw new Exception("Timeout"); var ajaxIsComplete = (bool)driver.ExecuteScript("return jQuery.active == 0"); if (ajaxIsComplete) break; Thread.Sleep(100); } } 

Voici mon code:

 public static void WaitForCommission (WebDriver driver) throws Exception { for (int second = 0;; second++) { if (second >= 30) fail("timeout"); try { if (IsElementActive(By.id("transferPurposeDDL"), driver)) break; } catch (Exception e) {} Thread.sleep(1000); } } private static boolean IsElementActive(By id, WebDriver driver) { WebElement we = driver.findElement(id); if(we.isEnabled()) return true; return false; } 

Ce code est vraiment efficace.

 Just small improvement //Wait for Ajax call to complete public void WaitForAjax1() throws InterruptedException { while (true) { if ((Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")){ break; } Thread.sleep(100); } } 

Si vous utilisez Graphene, vous pouvez utiliser ceci:

 Graphene.waitModel().until((Predicate) input -> (Boolean) ((JavascriptExecutor) input).executeScript("return jQuery.active == 0")); 

Le «XML Http Request» est le protocole utilisé pour envoyer des requêtes Ajax au serveur. La présence d’une telle requête indique donc une opération Ajax en cours.

Un certain nombre de plug-ins de navigateur vous permettent de surveiller les requêtes HTTP Http envoyées par le navigateur. J’utilise personnellement le plugin Firebug pour Firefox qui est un outil très utile. Une fois installé, Firebug affiche une icône en forme de bogue dans le coin inférieur droit de la fenêtre du navigateur. En cliquant sur l’icône en forme de bogue, vous lancez Firebug comme indiqué dans l’image ci-dessus. Sélectionnez le “Net” puis “XHR” pour lancer la console XHR où toutes les requêtes XML XML envoyées par le navigateur seront affichées.

Évitez d’utiliser thread.sleep () autant que possible. Voici un morceau de code qui accepte le temps d’attente comme entrée et exécute un chronomètre pendant le temps spécifié.

Vous pouvez définir le temps de saisie en secondes à 30 pour commencer.

 protected void WaitForAjaxToComplete(int timeoutSecs) { var stopWatch = new Stopwatch(); try { while (stopWatch.Elapsed.TotalSeconds < timeoutSecs) { var ajaxIsComplete = (bool)(WebDriver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"); if (ajaxIsComplete) { break; } } } //Exception Handling catch (Exception ex) { stopWatch.Stop(); throw ex; } stopWatch.Stop(); }