Всем привет.
С автоматизацией начал работать недавно, и взялся за небольшое корпоративное веб-приложение.
На страничке авторизации столкнулся с тем, что контролы подгружаются медленно, примерно до 3х секунд, подгрузка выполняется джаваскриптом (судя по файрбаг консоли)
Это и создает проблему при автоматизации логин пейджа - в большинстве случаев тест не видит поля с логином и паролем и не заполняет их.
При инициализации драйверу выставляю время:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Для логина и пароля так же делаю проверку на их появление через WebDriverWait:
WebElement userName = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[1]/input"))); WebElement userPass = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[2]/input")));
Пробовал разные методы для ExpectedConditions - и тоже не сработало.
В инете перелопатил всё что можно, нашел еще пару методов для проверки загрузки джаваскрипт элементов, и добавил их вызов перед инициализацией WebElement для юзернейм и пароля. Методы следующие:
public boolean waitForJSandJQueryToLoad() { WebDriverWait wait = new WebDriverWait(getDriver(), 50); // wait for jQuery to load ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver driver) { try { return ((Long)((JavascriptExecutor)getDriver()).executeScript("return jQuery.active") == 0); } catch (Exception e) { // no jQuery present return true; } } }; // wait for js to load ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver driver) { return ((JavascriptExecutor)getDriver()).executeScript("return document.readyState") .toString().equals("complete"); } }; return wait.until(jQueryLoad) && wait.until(jsLoad); } public static ExpectedCondition<Boolean> jQueryAJAXCallsHaveCompleted() { return new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver driver) { return (Boolean) ((JavascriptExecutor) driver).executeScript("return (window.jQuery != null) && (jQuery.active === 0);"); } }; }
И все равно проблема не исчезает.
При запуске теста в 30% случаев логин и пароль успешно заполняются и тест проходит. Но чаще всего тест либо пропускает поле с логином и заполняет пароль, либо пропускает оба поля и пытается сразу же залогиниться.
Единственный способ, который реально помог - выставить Thread.sleep минимум в 3 секунды перед инициализацией вебэлементов. Но способ ужасный.
Какие еще могут быть варианты для решения такого рода проблемы?
Спасибо всем за помощь заранее!