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

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

Теги: #<Tag:0x00007f7487a61ed8> #<Tag:0x00007f7487a61d70>

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

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

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

1 Симпатия

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

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

В большинстве сайтов так или иначе используется 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");
    }
});

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1 Симпатия