当前位置: 首页 > 面试题库 >

暂时绕过WebDriver的隐式等待

狄鸿禧
2023-03-14
问题内容

当使用隐式等待, 因为在这里建议 ,我仍然 _有时_要断言 即刻 隐形或元素不存在。

换句话说,我 知道 某些元素应该被隐藏,并且希望我的测试能够使断言 快速进行 ,而无需花费几秒钟的时间,因为(否则很有用)隐式等待。

我尝试过的一件事是这样的辅助方法:

// 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超类的帮助者:

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()



 类似资料:
  • 我在Java使用Webdriver,我需要等待一个元素,它有一个动态ID显示在网页上。 例如,对于隐式wait,我有以下语句:WebDriverWait wait=new WebDriverWait(driver,30);Wait.Until(ExpectedConditions.VisibilityOfElementLocated(By.id(“DynamicId”))) 是我正在等待的元素ID

  • 问题内容: 我想知道WebDriver等待超时和隐式等待超时之间的技术差异。 问题答案: 如文档中所述: 在内部设置将用于所有连续搜索的超时。如果找不到该元素,它将尝试在指定的时间内反复查找该元素。它仅执行此操作,不能强制执行其他任何操作- 它等待元素显示。 ,或者只是您用于特定搜索的一次计时器。它具有更大的可扩展性,意味着您可以将其设置为等待可能需要的任何条件。通常,您可以使用一些预构建的元素来

  • 问题内容: 我在用: 但是对于以下元素它仍然连续失败 我添加了等待代码: 隐式等待是否应该等到找到一个元素后再进行处理?如果我使用而不是我添加的代码,还会更好吗? 问题答案: TL; DR:始终使用显式等待。忘记隐式等待的存在。 以下是显式等待与隐式等待之间的区别的简要概述: 显式等待: 记录和定义的行为。 在硒的本地部分运行(以你的代码语言显示)。 可以在你能想到的任何条件下工作。 返回成功或超

  • 我如何用一个显式的替换这个隐式的等待呢? driver=新ChromeDriver(功能); driver.manage().DeleteAllCookies();

  • 我正在阅读有关Webdriver隐式等待的文档,但我不确定我是否完全理解。 据我所知, 这将在查找任何元素时设置10秒的超时。 这到底是干什么用的? > 这是否意味着在查找任何元素时,即使该元素存在,我每次都会等待10秒?或者,在查找任何元素时,驱动程序是否会在确定缺少元素之前为浏览器提供 10 秒的宽限期来加载元素? 由于这适用于每个元素,我是否正确地假设对于Webdriver的每个实例只执行一

  • 问题内容: Selenium WebDriver中有隐式和显式等待。它们之间有什么区别? 请分享有关Selenium WebDriver的知识。请显示带有隐式和显式等待的实时示例。 问题答案: 检查以下链接: -通过轮询DOM来指示Web驱动程序等待一段时间。声明隐式等待后,它将在Web驱动程序实例的整个生命周期中都可用。默认情况下,该值将为0。如果设置了更长的默认值,则该行为将根据浏览器/驱动程