当前位置: 首页 > 知识库问答 >
问题:

如何等到硒中不再存在某种元素

越心水
2023-03-14

我正在测试用户单击删除按钮和表条目消失的UI。因此,我希望能够检查表条目是否不再存在。

我已经尝试使用< code > expected conditions . not()来反转< code > expected conditions . presenceofelementlocated(),希望它意味着“期望不存在指定的元素”。我的代码是这样的:

browser.navigate().to("http://stackoverflow.com");
new WebDriverWait(browser, 1).until(
        ExpectedConditions.not(
                ExpectedConditions.presenceOfElementLocated(By.id("foo"))));

但是,我发现即使这样做,我也会得到一个由NoSuchElementException引起的TimeoutExpcetion,说元素“foo”不存在。当然,没有这样的元素是我想要的,但我不希望抛出异常。

那么,我如何才能等到一个元素不再存在呢?我更喜欢一个不依赖于尽可能捕获异常的示例(据我所知,异常应该为异常行为抛出)。

共有3个答案

曾奇略
2023-03-14

你为什么不简单地找到元素的大小。我们知道如果元素不存在,元素大小的集合将为0。

if(driver.findElements(By.id("foo").size() > 0 ){
    //It should fail
}else{
    //pass
}
齐泰
2023-03-14

解决方案仍然依赖于异常处理。这几乎没问题,即使是标准的预期条件也依赖于findElement()引发的异常。

这个想法是创建一个自定义的预期条件:

  public static ExpectedCondition<Boolean> absenceOfElementLocated(
      final By locator) {
    return new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
        try {
          driver.findElement(locator);
          return false;
        } catch (NoSuchElementException e) {
          return true;
        } catch (StaleElementReferenceException e) {
          return true;
        }
      }

      @Override
      public String toString() {
        return "element to not being present: " + locator;
      }
    };
  }
康泽宇
2023-03-14

您还可以使用-

new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(locator));

如果您查看它的源代码,您可以看到NoSuchElementExceptionsteeElementReeuceException都已处理。

/**
   * An expectation for checking that an element is either invisible or not
   * present on the DOM.
   *
   * @param locator used to find the element
   */
  public static ExpectedCondition<Boolean> invisibilityOfElementLocated(
      final By locator) {
    return new ExpectedCondition<Boolean>() {
      @Override
      public Boolean apply(WebDriver driver) {
        try {
          return !(findElement(locator, driver).isDisplayed());
        } catch (NoSuchElementException e) {
          // Returns true because the element is not present in DOM. The
          // try block checks if the element is present but is invisible.
          return true;
        } catch (StaleElementReferenceException e) {
          // Returns true because stale element reference implies that element
          // is no longer visible.
          return true;
        }
      }
 类似资料:
  • 但是它抛出了-看起来像期望元素在那里,所以这是有缺陷的。这对硒来说一定是面包和黄油,不想推倒重来……有没有人可以提出一个替代方案,理想情况下不滚动我自己的?

  • 问题内容: 我正在测试一个UI,在该UI中用户单击“删除”按钮,而表条目消失。因此,我希望能够检查表条目是否不再存在。 我曾尝试使用invert ,希望它的意思是“期望不存在指定的元素”。我的代码是这样的: 但是,我发现即使这样做,我也因一个说法说元素“ foo”不存在。当然,我想要的是没有这样的元素,但是我不希望引发异常。 那么,如何等待直到元素不再存在?我希望有一个示例,该示例尽可能不依赖于捕

  • 问题内容: 我试图让Selenium等待页面加载后动态添加到DOM的元素。试过这个: 如果有帮助,这里是: 但是它抛出一个-看起来像期望元素存在,所以这是有缺陷的。这一定是Selenium的面包和黄油,不想重新发明轮子……任何人都可以提出其他选择,理想情况下不用自己动手做? 问题答案: 需要等待时,您需要异常调用以忽略。 有关更多信息,请参见FluentWait文档。但是请注意,此条件已经在Exp

  • 问题内容: 我正在开发Chrome中的扩展程序,但我想知道:找出元素何时存在的最佳方法是什么?使用纯JavaScript,间隔检查直到元素存在,或者jQuery是否有一些简单的方法来执行此操作? 问题答案: 由于性能问题,不建议将其与其他DOM突变事件一起弃用- 推荐的方法是使用MutationObserver来监视DOM。不过,只有新的浏览器才支持此功能,因此您应该在不可用时退回。

  • 我正在自动化一个枯燥的数据输入任务,所以我创建了一个程序,基本上是使用Selenium为我点击和键入。它跑得很好!除非它到达这个特定的“编辑详细信息...”元素,但是,无论我尝试什么方法,selenium都无法找到该元素。 我尝试使用一个CSS选择器来访问ID,但没有成功。我还尝试使用XPATH,并尝试通过给它一个带有按钮文本的'contains'语句来更加具体。最后,我使用selenium ID

  • 问题内容: 我在Python 2.7中使用selenium,并且有以下代码,但是我正在寻找一种更有效的方法: 问题答案: 您无需使用一段时间。它已经等待您在WebDriverWait()函数中显示的时间。