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

Ожидание отработки Ajax при проверке одного и того же элемента на странице

rspec
ajax
selenium
webdriver
ruby
Теги: #<Tag:0x00007f7b70445be0> #<Tag:0x00007f7b70445a28> #<Tag:0x00007f7b70445820> #<Tag:0x00007f7b70445618> #<Tag:0x00007f7b70445280>

(Сергей Блохин) #1

На странице есть элемент <div>foo</div>.
По некому событию (клик на ссылку, например) идёт ajax запрос, который меняет текст внутри блока <div>bar</div>. Вот каким образом можно поставить ожидание, что запрос выполнился?
Я вижу пока только вариант, брать значение до события и в цикле проверять, что значение изменилось. Есть более правильные варианты?


(Максим Малунов) #2
  1. неявное ожидание появления/исчезновения/…/ какого-нибудь элемента
  2. JavaScript типа return jQuery.active == 0
 WebDriverWait wait = new WebDriverWait(webDriver,GlobalVariables.GlobalTimeOut);
    wait.until(new ExpectedCondition<Boolean>() {
        @Override
        public Boolean apply(org.openqa.selenium.WebDriver driver) {
            return (Boolean)((JavascriptExecutor)driver).executeScript("return jQuery.active == 0");
        }
  1. если ничего не помогает то Thread.sleep(100000)

(vmaximv) #3

Рискну предположить, что искомый элемент пересоздается а не просто меняет text.
В таком случае находим элемент, запускаем событие, ждем стейла (StaleElementReferenceException) найденного элемента, ищем его заново.


(Сергей Блохин) #4

Похоже, так и происходит. Я немного костыльно поступил, но сработало.
Я нахожу нужный элемент (на самом деле — у меня это массив элементов), потом инициализирую событие, потом снова нахожу нужный элемент по такому же пути и внутри wait цикла жду, пока оба элемента не будут разными.


(Sergey Korol) #5

Когда-то была задача - проверять динамическое изменение статуса файла при загрузке. Т.е. если вы знаете, какой текст нужно ждать, то кастомный expected condition решит проблему:

wait.until((WebDriver driver) -> findElement(locator).getText().equals(text));

(asolntsev) #6

Используйте библиотеку selenide. Она сама организовывает ожидание, вам остаётся только написать $(“div”).should Have(text(“bar”));