Я столкнулся с проблемой, которую Firefox Webdriver не определяет правильно, если элемент виден или нет: это код, который я использую, который возвращает элемент, видимый, хотя он не
wait.ignoring(UnhandledAlertException.class).until(ExpectedConditions.visibilityOfElementLocated(By.id("ad")));
Теперь, что, если я тестирую веб-сайт, где элемент можно найти в источнике сайта, но не видно (например, потому что перед ним есть другой элемент). Из того, что я мог собрать, метод visibilityOfElementLocated
проверяет только, имеет ли ширина и высота элемента> 0, не так ли? Есть ли способ проверить, является ли элемент ДЕЙСТВИТЕЛЬНО видимым для пользователя, занимающегося серфингом на сайте, учитывая плохой макет и неправильные z-индексы и т.д.? Это было бы здорово...
Спасибо!
Вы уверены, что не пытаетесь фактически проверить наличиеOfElementLocated вместо visibilityOfElementLocated? ВидимостьOfElementLocated работает только в том случае, если локатор, который вы ищете, имеет атрибут CSS отображения. Некоторые люди проверяют "elementExists", используя ".findElements(By).size()> 0", но вот альтернативный метод, требующий обработки исключений.
Это может быть излишним, но вы можете написать свою собственную функцию видимости. В этом примере я называю это "elementExists()". Он проверяет "присутствиеOf", но затем обрабатывает исключение "visiblity", если оно есть:
public boolean elementExists( By locator ) {
WebElement foo = null;
try {
foo = this.getElementByLocator( locator, 10 );
} catch ( TimeoutException te) {
System.out.println("There was a timeout looking for element: " +
locator.toString() );
//Swallow exception: ExceptionUtils.getMessage(te);
return false;
} catch ( ElementNotVisibleException env ) {
System.out.println("The element was found but is invisible: " +
locator.toString() );
//Swallow exception: ExceptionUtils.getMessage(env);
return false;
}
if ( foo == null ) {
return false;
} else {
return true;
}
}
public WebElement getElementByLocator( By locator, int timeout ) {
System.out.println("Calling method getElementByLocator: " +
locator.toString() );
int interval = 5;
if ( timeout <= 20 ) interval = 3;
if ( timeout <= 10 ) interval = 2;
if ( timeout <= 4 ) interval = 1;
Wait<WebDriver> wait = new FluentWait<WebDriver>( se.myDriver )
.withTimeout(timeout, TimeUnit.SECONDS)
.pollingEvery(interval, TimeUnit.SECONDS)
.ignoring( NoSuchElementException.class,
StaleElementReferenceException.class );
WebElement we = wait.until( ExpectedConditions
.presenceOfElementLocated( locator ) );
return we;
}
protected void asChk(By what, int presence) {
asChk(what, presence, false);
}
protected void asChk(By what, int presence, boolean isGreater) {
List<WebElement> boxesHeader = driver.findElements(what);
if(isGreater)
assertTrue(boxesHeader.size() >= presence);
else
assertTrue(boxesHeader.size() == presence);
}
Попробуйте этот код.
Как это использовать:
asChk (By.localizator(* localizatorDomValue *), 1);
или:
asChk (By.localizator(* localizatorDomValue *), 1, true); - если вы знаете theres больше чем одно но не знаете точное число.
С наилучшими пожеланиями, Michał Felicjańczuk