Честно говоря не знала что это паттерн, но у нас автомация очень стабильна именно благодаря такому подходу.
Практически все команды селениума обвернуты в ожидания, каждая секунда ожидания выводится в лог точкой "." Длина ожидания регулируется глобальным параметром DEFAULT_TIMEOUT_MNDT, который можно менять вручную из Jenkins и из Eclipse при запуске джоба/теста.
Например:
public void clickOnElement(String elementName, Object... placeholders) throws Exception {
log.debug("Verify element '" + elementName + "' appearance within " + almaTestSuper.DEFAULT_TIMEOUT_MNDT+ " seconds and click");
for (int second = 0; second <= almaTestSuper.DEFAULT_TIMEOUT_MNDT; second++) {
try {
WebElement e = findElement(elementName, placeholders);
e.click();
almaTestSuper.log("Clicked on element: " + elementName + "'", AlmaTestSuper.LOG_LEVEL.DEBUG, true);
return;
} catch (Exception e) {
Thread.sleep(1000);
almaTestSuper.log(".", AlmaTestSuper.LOG_LEVEL.INFO, false);
}
}
AlmaTestSuper.fail( elementName + "' does not appear");
}
Пример лога:
DEBUG - Check if the element 'DialogPopup' is visible within 15 seconds................
DEBUG - Verifying the element Common.InfoSection has text that matches 'Job has been submitted successfully.'............................................................
FATAL - 'Common.InfoSection' element does not appear
или:
DEBUG - Waiting for 'Common.LoadingBlocker': to appear within 0.3 seconds , to disappearе within 180 seconds
DEBUG - Loading blocker appeared! Waiting for Loading blocker to disappear
......Loading blocker disappeared!
или когда страницы вдруг медленно загружаются:
DEBUG - Clicked on element: Login.login'
INFO - Wait for page load for 'HomePage'..............
DEBUG - The page was loaded
Точно также обвернуты в sleep все ожидания длинных процессов в приложении (batch jobs, и т.п.)
Хотя ассы такой подход осуждают, интересно бы знать почему?
Коллеги-автоматизаторы, признайтесь честно, используете ли вы всячески осуждаемый паттерн "Сон" хотя бы изредка?
Есть ли ситуации, когда без него никак не получается обойтись?
P.S. Вопрос возник потому, что за прошлую неделю мне два раза чуть было не пришлось прибегнуть к такому "неправильному" решению, с трудом удалось реализовать более "правильное" решение, но я до сих пор в сомнениях -- стоило ли оно того...