Перейти к содержимому

defacr

Регистрация: 27 сен 2013
Offline Активность: 15 июл 2016 13:18
-----

Мои темы

Webdriver, ожидание элементов

28 мая 2016 - 18:00

Всем привет.

С автоматизацией начал работать недавно, и взялся за небольшое корпоративное веб-приложение.

На страничке авторизации столкнулся с тем, что контролы подгружаются медленно, примерно до 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 секунды перед инициализацией вебэлементов. Но способ ужасный.

 

Какие еще могут быть варианты для решения такого рода проблемы?

Спасибо всем за помощь заранее!