您可以使用承诺作为断言的输入吗?

Can you use a promise as input for an assert?

我目前正在编写合成浏览器监控脚本,并且看到很多由于超时导致的失败——特别是在查找 html ID 时。

assert.ok($browser.waitForAndFindElement($driver.By.id("framedContent"), 5000))

$browser.waitForAndFindElement($driver.By.id("framedContent"), 5000) 是在查找 ID“framedContent”之前等待的承诺。我想知道 assert.ok 是否不够“聪明”以等待承诺实现,即使它在技术上可以将承诺作为输入?

The assert.ok docs 声明 assert.ok 只是测试真实性。所有 Promise 对象都是真实的,无论是否已解析,因为所有 Javascript 对象都是真实的。除此之外,assert.ok 是同步的,无论如何都无法对异步 Promise 的结果做出反应。

你可能会到达 assert.doesNotReject,它 接受 Promise 并且 等待结果,但它也行为异步并且 returns 一个 Promise。这不会比您对 waitForAndFindElement 的简单调用更好,如文档中所述:

Using assert.doesNotReject() is actually not useful because there is little benefit in catching a rejection and then rejecting it again. Instead, consider adding a comment next to the specific code path that should not reject and keep error messages as expressive as possible.

出于这个原因,您可能需要 await 您的 waitForAndFindElement 以便将其转化为实际(适当地)等待您的元素出现或进行测试的错误类型否则失败。