如果我让您正确,您正在尝试存档检查元素是否显示。你可以使用普通的 selenium 和 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));
}
您的测试(端到端的 UI 测试!)不应拘泥于像 display:none 或 display:block 这样的实现细节。想象一下实现将被更改为通过 javascript 或其他方式删除元素。一个好的 selenium 测试应该尽可能地代表真实用户的观点。表示如果 UI 的行为仍然相同,您的测试应该仍然成功。因此,您应该进行更一般的检查 - 是否显示元素。
这是Seleniums WebElement interface 的基本功能之一,或者更准确地说是isDisplayed() 方法。
引用 Selenium Java Docs:
布尔 isDisplayed()
这个元素是否显示?
这种方法避免了不得不
解析元素的“样式”属性。
回报:
是否显示元素
此外,我建议为此类事情编写一些小的辅助方法,根据我的经验,这是您会更经常遇到的常见用例。
例如,辅助方法可能看起来像这样:
boolean isElementVisible(final By by) {
return driver.findElement(by).isDisplayed();
}
boolean isElementVisible(final WebElement element) {
return element.isDisplayed();
}
如果您使用诸如 FluentLenium 或 Selenide 之类的 Selenium 抽象,事情将变得更加方便,因为它们为诸如 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 选择器不那么脆弱,它会加速您的测试并且可读性更好。
你应该看看隐式等待而不是使用线程睡眠(不好的做法)。您可以再次自己实现这样的辅助方法,例如:
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
如果您正在寻找更扩展的示例,可以在这里查看: