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

Ожидание загрузки последнего элемента на странице

selenium
webdriver
Теги: #<Tag:0x00007f7b68e24150> #<Tag:0x00007f7b68e25690>

(Михаил Корнилов) #1

Есть ли в Selenium функционал ожидания последнего “подгружаемого” элемента?

Вот например на странице http://www.wolframalpha.com/input/?i=cat
в течение нескольких секунд добавляются картинки.
Или в личном кабинете МТС в случайном порядке подгружаются инфоблоки.

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


(Nik Sidorenko) #2

На сколько я знаю, то “из коробки” у Selenium такого ожидания нет.
Вы должны самостоятельно “сказать” ему чего следует дождаться.
У разных страниц, у разных приложений признаки “полной” загрузки страницы могут быть принципиально разными. Поэтому сложно придумать такое ожидание, которое покрывало бы все варианты.


(Stas Dobromilskiy) #3

universalnogo methoda net, no ya ispolzyuu vot eto dlya kajdogo konkretnogo slychaya
public WebElement elemIsClickable() {
return (new WebDriverWait(wd, 5))
.until(ExpectedConditions.elementToBeClickable(By.)));


(Lev Yarushin) #4

В большинстве сайтов так или иначе используется jquery, а в нём есть недокументированная фича, как раз показывающая текущие ajax-запросы.

new WebDriverWait(driver, 30).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    return (Boolean) js.executeScript("return jQuery.active == 0");
    }
});

(Юрий Аксютин) #5

можно использовать в предыдущем примере другое условие:
return document.readyState == ‘complete’;


(Nik Sidorenko) #6

Поправьте меня, если ошибаюсь.

Не дожидается выполнения Java скриптов и Ajax запросов


(Юрий Аксютин) #7

Не дожидается выполнения Ajax запросов, но не Java скриптов(так ка они нужны для построения страницы)


(Михаил Корнилов) #8

Дело в том, что подгружаться могут не только XHR-запросы, а, например, картинки.
(загружаю карту)
Тут, видимо, требуется отслеживать количество текущих (незаконченных) запросов браузера
и время завершения последнего.
Решение проблемы вижу так:
на открытой странице нужно навесить обработчик события загрузки ресурса (есть такие в DOM-модели?) в котором проставлять время события в глобальную переменную.

Если от момента завершения последнего события загрузки (скрипта, картинки, css и т.п.) прошло более N секунд - считаем что загрузка страницы завершена


(Юрий Аксютин) #9

Возможно, я не до конца понимаю задачу, но при разработке стараюсь придерживаться принципа: “делай сейчас как можно проще и не забывай о возможных изменениях в будущем
Поэтому

  1. Если не странице с картой необходимо проверить checkbox, fields и другие DOM элементы, события readyState == ‘complete’; будет достаточно
    2.Если необходимо проверить элементы на самой карте, опишите карту в виде отдельного объекта, и в этот объект включите проверку того, что карта загружена(как вашей душе угодно, возможно просто проверить что такой-то город отображается на карте в течении допустимого интервала времени). Инициализируйте этот объект только в тестах использующих карту

(Михаил Корнилов) #10

Юрий, попробую описать задачу подробнее:
Хочу снять скриншот страницы и отправить в группу телеграма/ отобразить на табло
ресурсы:

  1. narodmon.ru (текущая температура)
  2. яндекс карты (текущая ситуация с пробками)

проблема - часть “тайлов” карты может не загрузиться (по разным причинам). В таком случае лучше перезапустить задачу (5-10 минут не критичны) чем выставлять на показ “кривой” скриншот.


(Oleksii Ihnatiuk) #11

Тогда сделайте вот так:

  1. Сделайте список элементов, которые вам необходимы и важны;
  2. Ожидайте пока они все будут отображены (для этого есть дефолтные методы в Селениуме)
  3. Делайте скрнишот ваш

Сейчас вы делаете только проблемы себе.