当使用隐式等待时,as advised here,我仍然 * 有时 * 想要Assert元素的立即不可见性或不存在。
换句话说,我 * 知道 * 一些元素应该被隐藏,并且希望我的测试使Assert * 快速 *,而不需要花费几秒钟,因为(否则有用的)隐式等待。
我尝试的一件事是这样的一个助手方法:
// 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超类中的一个helper:
protected void turnOffImplicitWaits() {
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
}
型
但我觉得这不太优雅。是否有更清晰的方法偶尔绕过隐式等待?
7条答案
按热度按时间tjvv9vkg1#
鉴于Selenium似乎不能直接提供我想要的东西(基于Mike Kwan和Slanec所说的),这个简单的助手方法就是我现在使用的方法:
字符串
如果元素被隐藏或根本不存在,则该方法返回true;如果它是可见的,则返回false。无论哪种方式,检查都是立即完成的。
使用上面的方法至少要比调用
turnOffImplicitWaits()
和turnOnImplicitWaits()
的测试用例本身更简洁。另请参阅以下答案,了解相同方法的微调版本:
By
locator as the parameter的7cwmlq892#
我还建议将参数更改为“By”定位器,以便在查找元素时具有更大的灵活性。
字符串
这样,如果需要的话,你可以通过css搜索,而不仅仅是id:
型
当然,你的定位器应该被设计成只返回一个元素(不像我快速抓取的“By”示例,它返回css表格中的所有部分链接……)
型
xzv2uavs3#
我的实现:
字符串
使用扩展方法:
型
和类:
型
3b6akqbq4#
@Jonic的回答帮助了我,但是我会添加一个
try { } finally { }
,并在finally
块中调用turnOnImplicitWaits()
,以确保它总是打开。字符串
ldxq2e6h5#
我的方法是完全绕过隐式等待,并在我自己的
findElement()
和findElements()
方法中重新实现它(添加可见性检查等),我现在默认使用这些方法。这样,当我想立即检查一些东西时,我可以调用原始的WebDriver方法,当然,它不会等待。ocebsuys6#
在一个现有的代码中,大量依赖于隐式等待的思维方式,并且没有CSS来拯救,我找到了一种解决这种事情的方法,用Jsoup补充它,并继续使用Jsoup:
字符串
31moq8wy7#
覆盖或临时跳过隐式等待。Selenium不提供任何直接的解决方案,因为这些是静态值。
为了实现这一点,我们需要一个本文中提到的解决方案。How to skip the implicit wait for some element in Selenium in JAVA