Вопрос про "глобальный wait"

81 views
Skip to first unread message

Роман

unread,
Jan 19, 2023, 3:15:38 AM1/19/23
to selenide-ru
Добрый день.
На одном из проектов, где используется старый HTML Elements ушедшие из компании автоматизаторы  прикрутили некоторый глобальный wait, который запускается при ЛЮБОМ действии со ВСЕМИ элементами

Цель этой реализации: сделать UI автотесты более устойчивыми, с учетом реалий данного проекта.

Что в этом "глобальном wait"?

1. Проверка того, нет ли каких то глобальных сбоев в системе в виде стандартных для данного проекта сообщений
В частности, в проекте выводиться сообщение "Сбой" с неким описанием, и т.п.
Реализация: Если сообщение висит, то фейлим тест без ожиданий.

2. Проверка отсутствия элементов подобных "песочным часам".
P.S. Система очень тормозная, да еще и бывает такое, что тестовый стенд просто подвисает и эти "песочные часы" могут висеть неожиданно долго.
Реализация: Проверяет наличие элемента, ждем пока данный элемент не пропадет, далее продолжаем тест.

3. Проверка отсутствия активных Ajax запросов.
Реализация: проверяем, ждем завершения.

4. И еще десятки мелких проверок.


Все проверки реализованы с использованием JavaScript.

Вопрос:

Сейчас идем по пути перехода на Selenide  
и на первых этапах этот "глобальном wait" хочется пока оставить, чтобы случайно не завалить весь этот процесс автоматизированного тестирования.

Куда или как можно прикрутить в Selenide этот "глобальном wait" и вопрос (глобальнее) как и чем можно его заменить(по пунктно) в будущем, и нужен ли он вообще?

Andrei Solntsev

unread,
Jan 19, 2023, 10:40:03 AM1/19/23
to Роман, selenide-ru
Привет.

1. В селениде можно повесить глобальный листенер на любые действия с вебдрайвером. 
Для этого надо реализовать интерфейс WebDriverListener. См. https://github.com/selenide/selenide/blob/master/statics/src/test/java/integration/WebDriverListenerTest.java
Там можно вызвать примерно такой же код, который был в вашем проекте. 

2. Кстати, как вы проверяете отсутствие активных Ajax запросов?
(Не факт, что правильно. Есть нюансы.)

3. А вот последний вопрос хороший. Возможно, что после перехода на селенид эта глобальная ожидалка станет не нужна. 
Потому, что в селениде и так все методы умеют ждать, когда надо. Так что селениду пофиг, горят ли часики - он просто перейдёт к проверке следующего элемента и будет ждать его. 

Andrei Solntsev


чт, 19 янв. 2023 г. в 10:15, Роман <rpol...@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на группу "selenide-ru".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес selenide-ru...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/selenide-ru/92680cd6-a352-4cfd-bcfb-3db0538cbffdn%40googlegroups.com.

Роман

unread,
Jan 20, 2023, 7:01:18 AM1/20/23
to selenide-ru
Андрей, привет.

1. За подсказку по WebDriverListener СПАСИБО.

2. Ответ на вопрос "Кстати, как вы проверяете отсутствие активных Ajax запросов?"
см ниже метод, т.е. фактически ждем, когда метод isHttpIsActive (driver) вернет false;
Если не правильно, то подскажите как правильно? и нужно ли вообще при использовании Selenide выполнять проверку эту? 


3.  "селениду пофиг, горят ли часики - он просто перейдёт к проверке следующего элемента"

И сколько Selenide будет ждать? время указанное в Configuration.timeout ? или время указанное в "явных ожиданиях"?

А что если на сайте проекта периодически появляются "Часики" и висеть они могут как 2 сек, там и несколько минут (иногда тестовое окружение тупит по страшному).
Мысль автоматизатора: Решение проверять "часики" и подобные элементы избавляет от указания большого значения в  Configuration.timeout, и избавляет от  постоянного указания таймаута в явных ожиданиях  (но в любом случае без них не обходиться, но не везде).

За идеи, подсказки, мысли буду благодарен.  


P.S
Код к п.2

private static boolean isHttpIsActive(WebDriver driver){
JavascriptExecutor jsExecutor = (JavascriptExecutor)driver;
monkeyPatchXMLHttpRequest(jsExecutor);
int requestsCount = Integer.valueOf(jsExecutor.executeScript("return window.openHTTPs").toString());
return requestsCount > 0;
}
private static void monkeyPatchXMLHttpRequest(JavascriptExecutor jsDriver) {
try {
Object numberOfAjaxConnections = jsDriver.executeScript("return window.openHTTPs");
if (numberOfAjaxConnections instanceof Long) {
return;
}
String script = " (function() {" +
"var oldOpen = XMLHttpRequest.prototype.open;" +
"window.openHTTPs = 0;" +
"XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {" +
"window.openHTTPs++;" +
"this.addEventListener('readystatechange', function() {" +
"if(this.readyState == 4) {" +
"window.openHTTPs--;" +
"}" +
"}, false);" +
"oldOpen.call(this, method, url, async, user, pass);" +
"}" +
"})();";
jsDriver.executeScript(script);
} catch (Exception e) {
/* // logger.info("monkeyPatchXMLHttpRequeste" + e.toString());*/
}
}

С уважением, Роман
четверг, 19 января 2023 г. в 18:40:03 UTC+3, andrei....@gmail.com:

Andrei Solntsev

unread,
Jan 20, 2023, 10:45:35 AM1/20/23
to Роман, selenide-ru
2. Код для проверки активных ajax запросов, кажется, верный.
НО
его ведь можно запустить только ПОСЛЕ того, как страница загрузилась.
А некоторые ajax-запросы вполне могли запуститься уже раньше - ДО того, как тест вызвал monkeyPatchXMLHttpRequest().

- Эту проблему можно исправить, если включить селенидовский прокси, и с помощью него в каждую html-страницу встраивать функцию monkeyPatchXMLHttpRequest. Наверное, такую фичу даже можно было бы встроить в сам селенид...
- А ещё можно получить количество текущих сетевых запросов с помощью CDP, но это надо будет свой код ещё дописать. Из коробки такого решения сейчас нет. 

3. Да, селенид будет ждать Configuration.timeout.
С одной стороны, идея автоматизатора хороша: ждать часики, чтобы не делать глобальный Configuration.timeout слишком большим. 
С другой стороны, решает ли эту проблему: ведь ожидалка часиков тоже должна быть с большим таймаутом?
И ещё с часиками есть другая проблема: тест может проверить, что часиков нет, и пойдёт дальше - а как раз в этот момент часики и появятся. 

Andrei Solntsev


пт, 20 янв. 2023 г. в 14:01, Роман <rpol...@gmail.com>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/selenide-ru/82031211-82ed-4109-b3df-4e3ce22fb904n%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages