Андрей, привет.
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());*/
}
}
С уважением, Роман