Quantcast
Channel: Selenium - Functional Testing: новые темы
Viewing all articles
Browse latest Browse all 703

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

$
0
0

Всем привет.

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

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

 

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

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



 

  
      


Viewing all articles
Browse latest Browse all 703

Trending Articles