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

Как дождаться выполнения ajax запроса и перезагрузки?

Теги: #<Tag:0x00007f74899d4248> #<Tag:0x00007f74899d4180> #<Tag:0x00007f74899d40b8>

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

Возникла такая проблема. Пытаюсь автоматизировать авторизацию и выход из аккаунта на сайте.

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

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

Получается пока выполняется ajax запрос запускается уже следующее действие - logout , не находит кнопку выхода и падает.

Как правильно дожидаться пока завершится ajax запрос, пойдет перезагрузка и только потом выполнять следующее действие?

Решение должно быть комбинированным

Добавить wait для кнопки logout, и выполнить js на странице, который вернет true/false если есть активные http запросы.

К сожалению рабочего куска кода сейчас под рукой нет, но теоретически можно обойтись одним лишь wait без ожидания ajax

Поделитесь если у кого есть готовая функция опроса страницы на ajax

1 Симпатия

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

По поводу аякса находил когда-то вот такое решение:
JQuery.active вроде возвращает число активных запросов в текущий момент, соответственно если их 0, то ф-я возвращает True, а если больше 0, то False

  def ajax_complete(driver):
        try:
            return 0 == driver.execute_script("return JQuery.active")
        except WebDriverException:
            pass

Затем в тесте использовать для ожидания того, что нет активных аяксов:

WebDriverWait(self.driver, 10).until(ajax_complete, "Timeout waiting for page to load")

пробовал, не получилось, но частично проблему решил.

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

Поэтому после отправки формы я и советовал сначала ждать исчезновения какого-нибудь элемента, чтобы selenium не продолжал пока не исчезнет элемент, что означало бы, что страница начала перезагружаться, а потом ожидать появления нужного элемента. Вы так тоже попробовали?

Ну либо выше с ajax.

так поставьте себе BMP, и следите за тем что приходит на страницу…
типа - если пришол такой ответ, значит сервер жив, можно дальше кликать, а нет, тогда ждать… всё.
ну и поставить мах время на выполнение действий (так сказать чтобы не зависнуть на всегда)

На морде веб-приложения случайно не AngularJS крутится? У него не совсем ajax запросы