59 votes

attendre qu'un appel ajax se termine avec le pilote Web Selenium 2

J'utilise le pilote Web Selenium 2 pour tester une interface utilisateur qui utilise AJAX.

Existe-t-il un moyen de faire attendre un peu le pilote pour que la requête ajax se termine

en gros j'ai ceci:

 d.FindElement(By.XPath("//div[8]/div[3]/div/button")).Click();
// this^ click triggers 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);
 

82voto

Si vous utilisez jQuery pour vos requêtes ajax, vous pouvez attendre que la propriété jQuery.active soit nulle. 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);
    }
}
 

46voto

Mila Points 121

Vous pouvez également utiliser l'attente explicite Selenium ici. Ensuite, vous n'avez pas besoin de gérer le délai d'attente 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"));
}
 

18voto

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

3voto

Victor Hugo Points 31

Juste une petite amélioration en ajoutant un paramètre de timeout:

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

1voto

Anton Points 11

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 fonctionne vraiment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X