Есть ли возможность добавить wait пока не отработаются все AJAX запросы?
Expected Condition функция в selenium - это функция-предикат. Можно легко написать свое любое условие для ожидания.
Если на странице используется JQuery, можно это сделать простеньким JavaScript-кусочком.
Но в случае Selenide это попросту ненужно. Вам достаточно написать проверку на то изменение UI, которое должно случиться в результате этих ajax-запросов.
Скажем, если ajax-запрос должен подгрузить дополнительные данные и нарисовать в углу прогноз погоды, это и нужно проверить:
$("#pogoda").shouldHave(text("солнечно"));
Эта проверка сама дождётся, пока завершится ajax-запрос и текст нарисуется.
Поддерживаю @xotabu4, что лучше добавить в функцию ожидания появление какого-либо или нескольких ключевых элементов на странице.
Н-р на одном проекте была проблема, что ajax’ом подгружались данные с партнерских доменов, которые прямого влияния на продукт не оказывали, и случалось, что они отвечали ооооочень долго, так что загрузка страницы не укладывалась в разумные рамки.
У меня появляется попап, в котором нажатие на кнопку не приводит к действию пока не отработается AJAX запрос, соотвественно тест валится, есть ли возможность это как-то проверить?
Заранее спасибо
@Free4evo, обработка ajax-ответа наверное меняет какое-либо свойство кнопки, раз она становится активной. Попробуйте добавить ожидания этого свойства.
И это будет универсальнее, чем ждать ajax, т.к. для вас руткозом является статус активности кнопки, а ajax - лишь способ привести ее в активное состояние, и может быть н-р заменен на другой способ в процессе разработки.
Если вы привяжетесь к ожиданию свойства, вам будет все равно, каким образом разработчики этого добиваются, через ajax, через цепочку коллбэков, или еще через что-нибудь.
Спасибо за ответ, буду пробовать
Если уж сильно хочется ожидать окончания всех Ajax - то то поможет такой простой скрипт (js): $.active == 0 (нет запросов в статусе pending)
столкнулся с подобной ситуацией (использую selenide) - есть некий список и перечень фильтров , при нажатии на которые список фильтруется и изменяется. Проверить правильность отработки фильтра и выдачи списка можно перейдя в один из элементов списка и проверки наличия там некоего элемента, относящегося к контексту фильтра. По сути запрос перерисовывает этот список и привязаться к какому то новому элементу которого не было нет возможности, и кликнув по элементу из списка я попадаю в элемент из еще не обновленного списка. то есть по сути выход дождаться окончания всех запросов или добавить ожидание, или все же с 2017 года что то появилось?))
Так это получается хреновая ситуация с точки зрения юзабилити. Как пользователь должен понять, что фильтр применился? Как гарантировать, что пользователь не нажмёт кнопку раньше, чем все запросы завершились?
Для пользователя должны быть какие-то индикаторы загрузки, а ещё лучше - должны дизейблиться поля, пока все запросы не завершатся. Одним словом, что-то такое, что видно пользователю. Вот на эти же признаки и тест может ориентироваться.
P.S. Возможности есть, конечно, но всё это сложные варианты, поэтому советую всё-таки разобраться с юзабилити. А возможности тут:
видим изменения каунтера выдачи и изменение контента списка.
единственное на что можно опереться это на каунтер выдачи количества записей, который меняется в зависимости от фильтров, но он живет своей жизнью и может приехать раньше или позже. Или же на изменение контента айтема в списке - но тут вариант что он может попасть в выдачу
это конечно борется простым Selenide.sleep(ХХХ); но мы же хотим наоборот от этого уйти
Да, на изменение контента и надо ориентироваться. А что значит “попасть в выдачу”?
я опираюсь допустим на первый элемент в выдаче запоминаю его , применяю фильтр и проверяю опять первый элемент в новой выдаче (его изменение), и если он окажется таким же - то может все пропасть
Хороший пример кнопка “показать еще” которая догружает список, действительно тут очень верный совет дождаться именно изменения содержимого и не залазить в дебри с запросами, т.к. это гарантированно вылезет боком особенно когда есть websockets
Более того, реализация этой штуки в доску простая:
$( "some-filter-button").click();
String text = $( "products-list").text();
$( "products-list").shouldNotHave(exactText(text));
// some other checks which will run after the list is updated
какая механика и как это работает:
- сразу после клика по кнопке, за вместо того что бы проверять все остальное мы забираем текущее содержимое элемента
- далее assert на то что содежимое элемента не равно самому себе (казалось бы должно упать, но в том и вся суть selenide, что он понимает что это веб и есть запросы и надо подождать и будет пытаться это делать пока не поменяется содержимое или не настанет таймаут)
- по скольку операция блокирующая мы спокойненько себе описываем дальше все остальные проверки
примечания:
- это сиииильно лучше чем лезть в истории с трекингом запросов, лучше чем городить какие то кастомные wait until и уж тем более лучше чем делать sleep
- если нет “спиннера” и список не меняется - естественно такой подход не подойдет