Ошибка при ожидании JQuery


(Piotr_Iazadji) #1

Приветствую!

Для автоматизации использую Visual Studio, C# + WebDriver.
У меня есть тест, который проходит по различным страницам и проверяет не возникло ли JS, серверных и т.д. ошибок на странице. Имеется следующая функция, ожидающая полную загрузку страницы:

public static void WaitForAjax(int timeout = 60)
        {
            var wait = new WebDriverWait(WebDriver, TimeSpan.FromSeconds(timeout));
            wait.Until(d =>
            {
                var javaScriptExecutor = d as IJavaScriptExecutor;
                return javaScriptExecutor != null && (bool)javaScriptExecutor.ExecuteScript("return jQuery.active == 0");
            });
        }

Периодически, в этом месте тест валится с ошибкой : "Test method {MethodTitle из которого вызывается вышеуказанная функция} threw exception: System.InvalidOperationException: jQuery is not defined".

Если бы эта ошибка возникала каждый раз, я бы подумал, что проблема в самой функции. Но эта ошибка выскакивает периодически - 1-2 раза на 10 ранов. То есть для одной и той же страницы может 5 раз нормально пробежать тест, а на 6й валится.

Буду признателен за подсказку, где искать проблему!


(vmaximv) #2

А как Вы думаете, что означает "jQuery is not defined"?


(Piotr_Iazadji) #3

Что означает понятно. А вот что действительно непонятно, почему для одной и той же страницы ошибка возникает периодически...


(vmaximv) #4

Потому что на одной и той же странице, в разные моменты времени, переменная jQuery может присутствовать либо отсутствовать.


(Piotr_Iazadji) #5

А что если девелоперы утверждают, что jQuery на странице есть всегда, а в функции вроде стоит ожидание одна минута. Но реально валится раньше - одной минуты jQuery по факту тест не ждёт.


(Дмитрий Жарий) #6

Я вот что-то подобное использую:

public static void WaitForAjax()
{
    try
    {
        int i = 100;
        while (i --> 0)
        {
            bool ajaxIsComplete = true;
            try
            {
                ajaxIsComplete = (bool)(inst as IJavaScriptExecutor).ExecuteScript("var result = true; try { result = (typeof jQuery != 'undefined') ? jQuery.active == 0 : true } catch (e) {}; return result;");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return;
            }
            if (ajaxIsComplete)
            {
                break;
            }
            System.Threading.Thread.Sleep(10);
        }

        if (i == 0) throw new TimeoutException();
    }
    catch (UnhandledAlertException e)
    {
        Console.WriteLine("Unexpected alert");
    }
}

Selenium and AngularJS тестиривание application. Wait until page loads
(vmaximv) #7

То что девы "утверждают", опровергается вашим эксепшеном, т.е. слова против факта. В этом случае делайте как предлагает @dzhariy

return (typeof jQuery != 'undefined') ? jQuery.active == 0 : true;

и репортайте баги в багтрекер в случае фейла smile