t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f9afcbc6b20> #<Tag:0x00007f9afcbc6a30> #<Tag:0x00007f9afcbc68f0>

Есть ли возможность добавить 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)