Webdriver.io 的同步模式与 Promise 有问题

Synchronous mode of Webdriver.io have problems with Promise

我使用启用了同步模式的 Webdriver.io 框架(Wdio testrunner)在 CoffeeScript 上编写测试。根据文档,Webdriver.io 命令应该以同步模式执行。但是在使用Promise的过程中出现了意想不到的问题

我们正在考虑最简单的测试,即通过选择器在页面上找到一个元素,并将找到的元素的文本显示到控制台。

示例 1 – 没有承诺的代码

browser.url('... URL ...')
a = browser.$('... selector ...').getText()
console.log(a)

在此示例中,Webdriver.io 的命令可以正常工作。

示例 2 - 代码在 Promise 的构造函数中

p = new Promise((resolve, reject) -> 
    browser.url('... URL ...')
    a = browser.$('... selector ...').getText()
    console.log(a)
    resolve()
)
return p

如果命令包含在 Promise 的构造函数中,那么它们也会正确执行。

示例 3 - 代码在代码块中。然后返回 Promise

p = new Promise((resolve, reject) -> 
    resolve()
).then(() ->
    browser.url('... URL ...')
    a = $('... selector ...').getText()
    console.log(a)
)
return p

显示下一条错误消息:“$ (...)。GetText 不是函数”(示例 3)。显然,Webdriver.io 的命令开始异步工作。虽然我可以使用 await 关键字来处理这些 Promise,但我想以相同的方式(同步地)同样地执行代码,而不管代码的位置(在 Promise 中还是在 Promise 之外)。

使用命令 Await 时也会切换到异步模式。

示例 4(使用 await 关键字的示例 1 代码)

await console.log('123')
browser.url('... URL ...')
a = browser.$('... selector ...').getText()
console.log(a)

在这种情况下,为了程序的正确运行,需要重做所有代码,同时考虑到异步处理。

作为解决方案,我可以异步编写所有测试,但代码会变得更复杂。我可以在使用 Promise 时同步使用 Webdriver.io 的命令吗?

如果你想在同步模式下的wdio测试脚本中使用Promise,那么你需要使用wdio的browser.call()。有关 call 的更多详细信息:v5 and v4 .

您可以在此处找到示例代码以及有关如何使用调用的更多详细信息:How to use 3rd party method that takes callback in webdriverio

谢谢, 纳文