如何使用 webdriverIO、Mocha 和 Chai 验证元素是否消失

How to validate an element is gone using webdriverIO, Mocha and Chai

我正在使用 webdriverIO、Mocha 和 Chai 进行一些自动化测试。当我想验证一个元素是否被删除时,我一直 运行 陷入同样的​​问题。

我正在使用一个购物篮,我在其中删除了一个项目,然后验证它是否消失了。虽然物品消失需要一段时间,所以如果我立即去 expect,物品仍然在那里。

我已经通过这样做解决了这个问题:

browser.waitForExist(deletedProduct, 5000, true)
expect (boodschappenLijstPage.isProductPresent(SKU), 'the removed item was still there' ).to.equal(false)

webdriverIO waitfor 命令等待产品消失,之后chai expect 检查它是否消失。

我遇到的问题是 expect 永远不会失败。如果产品没有被正确删除,waitfortimeout 会在我到达预期部分之前抛出一个错误,这意味着只有在产品消失时才会达到预期部分

我已经通读了 chai 的文档,但我似乎找不到这样做的方法。

任何人都可以展示一种等待产品消失的方式,而不会错过预期(出于显而易见的原因,我不想使用 browser.pause)

您可以使用 try catch 并基本上等待错误。当元素从 DOM 中消失时,selenium 将抛出 NoSuchElementError 并且我们可以使用它。

isNotPresent(element) {
  try {
    return !element.isVisible()
  } catch (error) {
    return true
  }
}

// or wait for element to disappear from dom

waitForNotVisible(element) {
  browser.waitUntil(() => {
    try {
      return !element.isVisible()
    } catch (error) {
      return true
    }
  })
}

参考this

webElement.waitForDisplayed({ reverse: true });

如果您尝试验证某个元素是否已消失,那么使用 expect 是正确的解决方案,但您应该使用 Webdriver-expect 断言而不是 chai expect 断言。虽然 chai 断言 立即 检查状态,但 WebdriverIO-expect 断言内置了 waitFor 功能。这是一个例子:

let deletedProduct = $(/* your xpath/CSS selector/*);
expect(deletedProduct).not.toBeDisplayed();

断言和使用带有反向标志的 waitForDisplayed 之间的区别在于,一些报告者(例如 Allure)会将您的测试报告为 broken 而应该报告为失败。例如,当我们 运行 测试并有 waitForDisplayed 时,我们所有失败的测试都被标记为 黄色 。当我们使用 expect 时,测试标记为 red.

这是 WebdriverIO Expect matchers 的文档。他们没有非常清楚地记录 .not 方法,但在我的示例中,您可以看到我在 toBeDisplayed 调用之前添加了 .not。

同样,这个 expect 将等待 wdio.conf.js 中指定的超时,就像 waitFors 一样。