【问题标题】:Synchronous mode of Webdriver.io have problems with PromiseWebdriver.io的同步模式与Promise有问题
【发布时间】: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


【解决方案1】:

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

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

谢谢, 纳文

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多