当使用隐式等待 as advised here 时,我有时仍然想断言立即不可见或元素不存在。
换句话说,我知道某些元素应该被隐藏,并且希望我的测试使该断言更快,而无需花费几秒钟的时间,因为(否则很有用)隐式等待。
我尝试过的一件事是这样的辅助方法:
// NB: doesn't seem to do what I want
private boolean isElementHiddenNow(String id) {
WebDriverWait zeroWait = new WebDriverWait(driver, 0);
ExpectedCondition<Boolean> c = invisibilityOfElementLocated(By.id(id));
try {
zeroWait.until(c);
return true;
} catch (TimeoutException e) {
return false;
}
}
但是在上面的代码中,对
until()
的调用仅在隐式等待时间过去了之后才返回,即它没有执行我想要的操作。到目前为止,这是我找到的唯一可行的方法:
@Test
public void checkThatSomethingIsNotVisible() {
turnOffImplicitWaits();
// ... the actual test
turnOnImplicitWaits();
}
...例如
turnOffImplicitWaits()
是常见的Selenium父类(super class)的助手:protected void turnOffImplicitWaits() {
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
}
我认为那不是很优雅。 是否有更干净的方法偶尔绕过隐式等待?
最佳答案
鉴于Selenium似乎没有直接提供我想要的东西(基于Mike Kwan和Slanec所说的话),因此我现在使用的是这种简单的辅助方法:
protected boolean isElementHiddenNow(String id) {
turnOffImplicitWaits();
boolean result = ExpectedConditions.invisibilityOfElementLocated(By.id(id)).apply(driver);
turnOnImplicitWaits();
return result;
}
private void turnOffImplicitWaits() {
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
}
private void turnOnImplicitWaits() {
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
如果元素是隐藏的或根本不存在,则该方法返回true;否则,该方法返回true。如果可见,则返回false。无论哪种方式,检查都会立即完成。
使用上述内容至少比通过调用
turnOffImplicitWaits()
和turnOnImplicitWaits()
散乱测试用例本身更清洁。有关相同方法的精调版本,另请参见以下答案:
By
locator as the parameter