当使用隐式等待, 因为在这里建议 ,我仍然 _有时_要断言 即刻 隐形或元素不存在。
换句话说,我 知道 某些元素应该被隐藏,并且希望我的测试能够使断言 快速进行 ,而无需花费几秒钟的时间,因为(否则很有用)隐式等待。
我尝试过的一件事是这样的辅助方法:
// 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()仅 在隐式等待时间过去之后 才返回对调用的调用,即,它不执行我想要的操作。
until()
到目前为止,这是我发现的唯一可行的方法:
@Test public void checkThatSomethingIsNotVisible() { turnOffImplicitWaits(); // ... the actual test turnOnImplicitWaits(); }
…例如,turnOffImplicitWaits()是常见的Selenium超类的帮助者:
turnOffImplicitWaits()
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()。
turnOnImplicitWaits()