Дождитесь завершения вызова Ajax с Selenium 2 WebDriver - PullRequest
51 голосов
/ 01 июня 2011

Я использую Selenium 2 WebDriver для тестирования пользовательского интерфейса, использующего AJAX.

Есть ли способ заставить драйвер немного подождать, пока запрос Ajax завершится.В основном у меня есть это:

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

Ответы [ 10 ]

75 голосов
/ 26 августа 2011

Если вы используете jQuery для ваших запросов ajax, вы можете подождать, пока свойство jQuery.active не станет равным нулю. Другие библиотеки могут иметь аналогичные параметры.

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);
    }
}
41 голосов
/ 03 апреля 2013

Вы также можете использовать явное ожидание Selenium здесь.Тогда вам не нужно самостоятельно обрабатывать тайм-аут

public void WaitForAjax()
{
    var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
    wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
}
15 голосов
/ 01 июня 2011
var wait = new WebDriverWait(d, TimeSpan.FromSeconds(5));
var element = wait.Until(driver => driver.FindElement(By.Id("Hobbies")));
7 голосов
/ 16 июля 2015

Java-решение на основе ответа Мортена Кристиансенса

    public void WaitForAjax() throws InterruptedException
    {

        while (true)
        {

            Boolean ajaxIsComplete = (Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0");
            if (ajaxIsComplete){
                break;
            }
            Thread.sleep(100);
        }
    }


3 голосов
/ 03 октября 2012

Просто небольшое улучшение, добавив параметр времени ожидания:

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);
        }            
    }
2 голосов
/ 17 февраля 2016

Просто небольшое улучшение:

//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);
        }
    }
2 голосов
/ 05 апреля 2012

Вот мой код:

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

Этот код действительно работает.

1 голос
/ 20 октября 2018

Если вы используете Coypu , вы можете проверить, существует ли элемент после вызова AJAX, а затем вы можете щелкнуть по нему:

private void WaitUntilExistsThenClick(string selectorId)
{
    var searchBoxExists = new State(() => browser.FindId(selectorId).Exists());
    if (browser.FindState(searchBoxExists) == searchBoxExists)
    {                
        browser.FindId(selectorId).Click();
    }
}       
1 голос
/ 04 июля 2016

«XML Http Request» - это протокол, используемый для отправки Ajax-запросов на сервер, поэтому наличие такого запроса указывает на выполняющуюся операцию на основе Ajax.

Существует ряд плагинов для браузера, которые позволяют отслеживать запросы HTTP Http, отправляемые браузером. Я лично использую плагин Firebug для Firefox, который является очень полезным инструментом. После установки Firebug отображает значок в виде ошибки в правом нижнем углу окна браузера. Нажатие на иконку, похожую на ошибку, запускает Firebug, как показано на рисунке выше. Выберите «Net», а затем «XHR», чтобы запустить консоль XHR, где будут отображаться все запросы HTTP HTTP, отправленные браузером.

Старайтесь не использовать thread.sleep () в максимально возможной степени. Вот фрагмент кода, который принимает время ожидания в качестве входных данных и запускает секундомер в течение указанного времени.

Вы можете установить время ввода в секундах на 30, чтобы начать с.

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

        }
1 голос
/ 31 мая 2016

Если вы используете Графен , вы можете использовать это:

Graphene.waitModel().until((Predicate<WebDriver>) input -> (Boolean) ((JavascriptExecutor) input).executeScript("return jQuery.active == 0"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...