Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

ajax
python
webdriver
Теги: #<Tag:0x00007f7b6482c648> #<Tag:0x00007f7b6482c4e0> #<Tag:0x00007f7b6482c350>

(Bitande7) #1

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

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

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

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

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

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


(Oleksandr Khotemskyi) #2

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

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

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

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


(Ильдар Бекмансуров) #3

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

По поводу аякса находил когда-то вот такое решение:
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")

(Bitande7) #4

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

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


(Ильдар Бекмансуров) #5

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

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


(t62) #6

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


(ex3me0) #7

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