Selenide. Есть ли возможность добавить wait пока не отработаются все AJAX запросы?

Есть ли возможность добавить wait пока не отработаются все AJAX запросы?

Expected Condition функция в selenium - это функция-предикат. Можно легко написать свое любое условие для ожидания.

2 лайка

Если на странице используется JQuery, можно это сделать простеньким JavaScript-кусочком.
Но в случае Selenide это попросту ненужно. Вам достаточно написать проверку на то изменение UI, которое должно случиться в результате этих ajax-запросов.

Скажем, если ajax-запрос должен подгрузить дополнительные данные и нарисовать в углу прогноз погоды, это и нужно проверить:

$("#pogoda").shouldHave(text("солнечно"));

Эта проверка сама дождётся, пока завершится ajax-запрос и текст нарисуется.

3 лайка

Поддерживаю @xotabu4, что лучше добавить в функцию ожидания появление какого-либо или нескольких ключевых элементов на странице.

Н-р на одном проекте была проблема, что ajax’ом подгружались данные с партнерских доменов, которые прямого влияния на продукт не оказывали, и случалось, что они отвечали ооооочень долго, так что загрузка страницы не укладывалась в разумные рамки.

1 лайк

У меня появляется попап, в котором нажатие на кнопку не приводит к действию пока не отработается AJAX запрос, соотвественно тест валится, есть ли возможность это как-то проверить?
Заранее спасибо :slight_smile:

@Free4evo, обработка ajax-ответа наверное меняет какое-либо свойство кнопки, раз она становится активной. Попробуйте добавить ожидания этого свойства.

И это будет универсальнее, чем ждать ajax, т.к. для вас руткозом является статус активности кнопки, а ajax - лишь способ привести ее в активное состояние, и может быть н-р заменен на другой способ в процессе разработки.

Если вы привяжетесь к ожиданию свойства, вам будет все равно, каким образом разработчики этого добиваются, через ajax, через цепочку коллбэков, или еще через что-нибудь.

2 лайка

Спасибо за ответ, буду пробовать :slight_smile:

Если уж сильно хочется ожидать окончания всех Ajax - то то поможет такой простой скрипт (js): $.active == 0 (нет запросов в статусе pending)

столкнулся с подобной ситуацией (использую selenide) - есть некий список и перечень фильтров , при нажатии на которые список фильтруется и изменяется. Проверить правильность отработки фильтра и выдачи списка можно перейдя в один из элементов списка и проверки наличия там некоего элемента, относящегося к контексту фильтра. По сути запрос перерисовывает этот список и привязаться к какому то новому элементу которого не было нет возможности, и кликнув по элементу из списка я попадаю в элемент из еще не обновленного списка. то есть по сути выход дождаться окончания всех запросов или добавить ожидание, или все же с 2017 года что то появилось?))

Так это получается хреновая ситуация с точки зрения юзабилити. Как пользователь должен понять, что фильтр применился? Как гарантировать, что пользователь не нажмёт кнопку раньше, чем все запросы завершились?

Для пользователя должны быть какие-то индикаторы загрузки, а ещё лучше - должны дизейблиться поля, пока все запросы не завершатся. Одним словом, что-то такое, что видно пользователю. Вот на эти же признаки и тест может ориентироваться.

P.S. Возможности есть, конечно, но всё это сложные варианты, поэтому советую всё-таки разобраться с юзабилити. А возможности тут:

  1. Как получить логи браузера
  2. Как получить логи браузера через JavaScript
  3. Как получить сетевые запросы с помощью прокси

видим изменения каунтера выдачи и изменение контента списка.
единственное на что можно опереться это на каунтер выдачи количества записей, который меняется в зависимости от фильтров, но он живет своей жизнью и может приехать раньше или позже. Или же на изменение контента айтема в списке - но тут вариант что он может попасть в выдачу

это конечно борется простым Selenide.sleep(ХХХ); но мы же хотим наоборот от этого уйти

Да, на изменение контента и надо ориентироваться. А что значит “попасть в выдачу”?

1 лайк

я опираюсь допустим на первый элемент в выдаче запоминаю его , применяю фильтр и проверяю опять первый элемент в новой выдаче (его изменение), и если он окажется таким же - то может все пропасть

Хороший пример кнопка “показать еще” которая догружает список, действительно тут очень верный совет дождаться именно изменения содержимого и не залазить в дебри с запросами, т.к. это гарантированно вылезет боком особенно когда есть 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 на то что содежимое элемента не равно самому себе :thinking:(казалось бы должно упать, но в том и вся суть selenide, что он понимает что это веб и есть запросы и надо подождать и будет пытаться это делать пока не поменяется содержимое или не настанет таймаут)
  • по скольку операция блокирующая мы спокойненько себе описываем дальше все остальные проверки

примечания:

  • это сиииильно лучше чем лезть в истории с трекингом запросов, лучше чем городить какие то кастомные wait until и уж тем более лучше чем делать sleep
  • если нет “спиннера” и список не меняется - естественно такой подход не подойдет
2 лайка