Если я правильно понимаю, вы пытаетесь архивировать, проверяя, отображается элемент или нет.Вы можете сделать что-то подобное, используя обычный селен и java:
// the @FindBy annotation provides a lazy implementation of `findElement()`
@FindBy(css = "#divDuplicateBarcodeCheck")
private WebElement barcode;
@Test
public void example() {
driver.get("http://some.url");
waitForElement(barcode);
// isDisplay() is natively provided by type WebElement
if (barcode.isDisplayed()) {
// do something
} else {
// do something else
}
}
private void waitForElement(final WebElement element) {
final WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.visibilityOf(element));
}
Ваш тест (сквозной тест пользовательского интерфейса!) Не должен придерживаться деталей реализации, таких как display:none
или display:block
.Представьте, что реализация будет изменена, чтобы удалить элемент с помощью JavaScript или чего-то еще.Хороший тест на селен должен всегда представлять реальную точку зрения пользователей как можно лучше.Означает, что пользовательский интерфейс будет продолжать работать так же, ваш тест должен пройти успешно.Поэтому вам следует выполнить более общую проверку - отображается элемент или нет.
Это одна из базовых функций интерфейса Seleniums WebElement , или, если быть более точным, его isDisplayed()
method.
Цитата из Selenium Java Docs :
логический isDisplayed ()
Отображается ли этот элементили нет?Этот метод избавляет от необходимости разбора атрибута "style" элемента.Возвращает: независимо от того, отображается элемент или нет
Кроме того, я бы порекомендовал написать несколько небольших вспомогательных методов для подобных вещей, по моему опыту, это общий случай использования, с которым вы будете сталкиваться чаще.вспомогательный метод может, например, выглядеть примерно так:
boolean isElementVisible(final By by) {
return driver.findElement(by).isDisplayed();
}
boolean isElementVisible(final WebElement element) {
return element.isDisplayed();
}
Если вы используете абстракции Selenium, такие как FluentLenium или Selenide , все станет еще удобнее, потому что онипредоставить такие вещи, как расширения утверждений и пользовательские средства сопоставления для хорошо известных библиотек утверждений, таких как assertJ, hamcrest, junit.
Например, для FluentLenium и AssertJ (стек, который я лично могу порекомендовать), ответ на вашу проблему выглядит так же простокак это:
// check if element is displayed
assertThat(el("#divDuplicateBarcodeCheck")).isDisplayed();
// check if element is not displayed
assertThat(el("#divDuplicateBarcodeCheck")).isNotDisplayed();
Еще несколько мыслей:
Вы должны также использовать CSS-селекторы, если это возможно, вместо селекторов xPath.Селекторы CSS менее хрупкие , они ускорят ваши тесты и лучше читаются .
Вместо этого вы должны взглянуть на неявные ожиданияиспользования Thread Sleep (плохая практика).Вы можете снова реализовать вспомогательные методы, подобные этим, например:
void waitForElement(final WebElement element) {
final WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.visibilityOf(element));
}
void waitForElement(final By by) {
final WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(by));
}
void waitForElementIsInvisible(final By by) {
final WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.invisibilityOfElementLocated(by));
}
или (что я бы порекомендовал) использовать для этого библиотеку, например Awaitility
Если вы ищете более расширенный пример, вы можете посмотреть здесь: