Тест падает до завершения GoToUrl

Привет!
Webdriver + C# + chromedriver 2.10
Проблема такая: есть куча тестов, которые состоят из следующих шагов:

  1. переход по ссылке GoToUrl
  2. проверка наличия элемента
  3. дальнейшие действия
    Тесты запускаются на отдельном сервере. Не постоянно, но иногда тесты падают по непонятным причинам, причем локально воспроизвести это не получалось. Выяснилось, что переход по ссылке не осуществился, а драйвер уже ищет элемент на странице.
    Вывела в консоль текущую ссылку до перехода, по какой ссылке переходим и текущую ссылку после перехода. Получилось вот так: http://joxi.ru/KAgKa8bi4R94Al
    Т.е. переход по ссылке не произошел, тест упал, а затем ссылка поменялась.
    Обновила версию хромдрайвера на последнюю, таких падений стало меньше, но все равно бывают.
    Кто-нибудь сталкивался с таким?

Implicit waits используете?

ImplicitlyWait стоит 1 секунда. + ожидание появления элемента 5 секунд

Что-то не то… Либо у вас страницы грузятся больше 5 секунд, либо вы некорректно засетили таймауты, либо implicit / explicit waits конфликтуют (помню было такое на одной из версии FF драйвера, когда implicit wait просто игнорил explicit). К слову, какой эксепшен летит? Пробовали увеличивать implicit waits? Уверены, что ошибка вылетает по 5 сек таймауту?

Падает с ошибкой

OpenQA.Selenium.NoSuchElementException : no such element Страница даже если грузится больше 5 секунд, стоит SetPageLoadTimeout равным 120. Кроме того, если почитать здесь: http://selenium.googlecode.com/svn/trunk/docs/api/dotnet/html/M_OpenQA_Selenium_INavigation_GoToUrl.htm ,метод должен дожидаться полной загрузки. А в моем случае, получается, что не дожидаясь выполнения метода тест идет дальше. Как будто тест пытается параллельно идти :)

А зачем вам нужен PageLoadTimeout (еще и такой большой), если вы уже используете оба типа вейтов? Могу лишь посоветовать попробовать погонять тесты, последовательно отключая те или иные таймауты (хотя, я бы вообще избавился от page load) + поиграться с увеличением / уменьшением значений. Мало ли, может баг зарыт в пересечении всех этих вейтов. Лично у себя использую только implicit + explicit. Никогда таких проблем не замечал. Но собственно и прямых редиректов я не делаю, т.к. это не совсем end-user сценарий.

Мне нужен PageLoadTimeout для некоторых страниц, которые открываются очень долго, так что я не могу его убрать…

Мне казалось, что ваша задача сейчас - определить root cause падений других тестов. А проблема с pageload легко решается кастомным visibility таймаутом для конкретных элементов. Но, как говорится, it’s up to you.

1 лайк

Хм… А Ajax / jQuery на страничке нету, случайно?
Может быть, ajax call занимает в некоторых случаях больше 5 сек и страница не успевает загрузиться полностью? Для Ajax waitForPageToLoad игнорируется. В этом случае используйте либо script injection для определения завершения выполнения ajax запроса, либо как более простой вариант - в учловие для wait поставьте visibility какого-нить контрола, появляющегося 100% после отработки ajax. Всё вышеописанное справедливо и для jQuery, только скрипт надо использовать другой.

1 лайк

можно попроьбовать такую ожидалку конца ajax

public void waitForEndOfAllAjaxes(){
        WebDriverWait wait = new WebDriverWait(webDriver,GlobalVariables.GlobalTimeOut);
        wait.until(new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(org.openqa.selenium.WebDriver driver) {
                return (Boolean)((JavascriptExecutor)driver).executeScript("return jQuery.active == 0");
            }
        });
    }
2 лайка