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

WebDriver: как узнать установленое значение implicitlyWait параметра


(Aleksey) #1

Описание проблемы: использую Thucydides, в конфигурационных параметрах устанавливается значение параметра “webdriver.timeouts.implicitlywait”, который в недрах Thucydides устанавливается как значение implicitlyWait для WebDriver.

В определенном месте мне нужно выполнить “быстрый” поиск элемента - просто удостовериться, что нет определенного элемента прямо здесь и сейчас (точно уверен, что страница загружена полностью и ничего подгружаться не будет), использую условие findElements(locator).size>0. Но в итоге приходится ждать этот implicitlyWait интервал впустую.

Как вариант решения проблемы - ставить implicitlyWait значение в 0, делать действие и восстанавливать значение implicitlyWait. Соответственно вопросы:

  1. как имея инстанс WebDriver узнать текущее значение интервала implicitlyWait?
  2. (исключительно для экспертов в Thucydides) как программно узнать значение конфигурационных параметров Thucydides? (поковырялся в исходниках, но чего-либо публичного подходящего не нашел)

Публичного АПИ у веб-драйвера для чтения этого параметра нет (установить можно без проблем), есть разные извращенные варианты (поискать какой-нить несуществующий элемент и засечь время поиска или прочитать тот же конфигурационный файл thucydides), но не хочется на такое соглашаться :slight_smile: Хотя не думаю, что конечное решение (если оно существует) будет таким уж изящным.

Ваши варианты?


(sidelnikovmike) #2

А выставлять перед проверкой чем плохо?
По поводу как взять - как то этим вопросом занимался. Завтра гляну, вродь как то мне казалось получалось это у меня. Правда могу и ошибаться))))


(Natalja Librante Lace) #3

Я совсем не гуру в Thucydides, но в случае когда мне надо переустановить implicitlyWait для какого-то определенного метода, то я просто в самом методе переустанавливаю
setWaitForTimeout(значение в милисекундах);

здесь setWaitForTimeout - метод из PageObject


(Aleksey) #4

С установкой никаких проблем нет - хоть через Thucydides, хоть прямо в веб-драйвере. Вопрос - как считать текущее значение параметра, чтобы восстановить его потом.
В принципе эта проблема шоустоппером не является (неполный список обходных путей приводил в исходном сообщении и сейчас один из них нормально используется), но интересны мнения можно ли сделать “правильно” :slight_smile:


(Александр Таранков) #5

Читайте из своего конфига. И в случае начальной установки и в случае повторной. Это самый прямой способ решения вашей проблемы.

А лучше подумайте над тем как вообще не решать эту проблему, а сделать так, чтоб её не было


(sidelnikovmike) #6

Мдаа. получается что никак не взять. selenium нигде не проставляет никаких переменных, из которых можно было бы вынуть значение. а с браузером он работает через запросы, а запроса что-то типа getTimeout нету. Так что видимо никак не взять.


(Aleksey) #7

Собственно так сейчас и делается.
Относительно самой сути проблемы - вроде как в начальном посте изложил зачем надо, в зависимости от наличия/отсутствия элемента нужно делать разные действия, при этом не хочется ждать “ненужное” время.


(Александр Таранков) #8

Озвучьте масштаб обсуждаемой проблемы - ненужное время это сколько? За раз, за тест.

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


(Aleksey) #9

Типичная схема для интернетов - вместо ответа на заданный вопрос, получаешь или ответ на вопрос, который знает отвечающий, или убеждение, что тебе это не надо :wink: (за помощь и участие спасибо)

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

Подходящий воркераунд был сделан еще до написания поста, интересует в первую очередь решал ли кто-либо эту задачу и чем закончилось (гугление не дало ответа).


(5am) #10

в случае с .net - наверно можно покопать в сторону reflection. но в целом - это больше похоже на извращение :slight_smile:


(sidelnikovmike) #11

Ну не только в случае .net)) я уже думал над этим. Но нигде в коде селениума не хранится этот таймаут в какой нибудь переменной. Я это писал чутка повыше.


(5am) #12

…выкачать сорцы, подправить и собрать свой веб драйвер, с блекджеком и прочими вкусностями
p.s. чем бы детя не тешилось, лишь бы не забеременело…


(sidelnikovmike) #13

вот это клевое решение! можно в принципе и не выкачивать - думаю простое наследование поможет. А вообще идея хороша)))
Может сделаем? :smile: :smile: