【发布时间】:2019-09-25 21:40:20
【问题描述】:
我使用启用了同步模式的 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 中还是在它之外)。
在使用命令 Await 时也会切换到异步模式。
示例 4(示例 1 代码使用 await 关键字)
await console.log('123')
browser.url('... URL ...')
a = browser.$('... selector ...').getText()
console.log(a)
在这种情况下,为了程序的正确工作,有必要重做所有代码,同时考虑到异步处理。
作为一种解决方案,我可以异步编写所有测试,但代码会变得更加复杂。即使使用 Promise,我也可以同步使用 Webdriver.io 的命令吗?
【问题讨论】:
-
为什么在第三个例子中,
$('... selector ...').getText()不是browser.$?
标签: node.js asynchronous promise coffeescript webdriver-io