【问题标题】:Moving Protractor tests to async/await (leaving selenium control flow)将 Protractor 测试移动到 async/await(离开 selenium 控制流)
【发布时间】:2018-03-20 23:57:15
【问题描述】:

我想在 Protractor 测试中将 appart 从 selenium 控制流中移出。

以下是我到目前为止所经历的步骤和问题:

1.逐个测试禁用它

我的第一个想法是使用 SELENIUM_PROMISE_MANAGER 来从 selenium 承诺转移到异步/等待代码。

不幸的是,为了顺利进行迁移,我发现无法将一项测试放在SELENIUM_PROMISE_MANAGER=0 上,而将其他测试放在SELENIUM_PROMISE_MANAGER=1 上。

2。保留它,但也要使用 async/await

所以我想到了一个使用 async/await 的代码,同时保留 SELENIUM_PROMISE_MANAGER=1

可惜好像不兼容:https://github.com/angular/protractor/tree/master/exampleTypescript/asyncAwait

Selenium 方面没有关于此类问题的任何内容,所以我想知道这是一个建议还是一个真正的问题它总是失败

3.覆盖 promise.USE_PROMISE_MANAGER

使用 protractor.promise.USE_PROMISE_MANAGER=false 对我不起作用(在 beforeEach 中)。

4.在异步代码上调用控制流

protractor.promise.controlFlow().execute(/* my async code*/);

对我来说,它似乎混合 async/await 来控制流程......

什么是正确的策略?

我想知道,在 Protractor 测试中转移到 async/await 的正确策略是什么?

我不想在一次更改中将所有内容都放在 async/await 中,而是将更改分散到多个小更改中

【问题讨论】:

  • 阅读full thread here about the deprecate issue 似乎很简单。您需要通过命令行启用 async/await(检查 2 月 4 日)。那么,您为什么认为它不兼容,您会遇到什么错误?
  • 我的问题是量角器指南明确表示“但是,您不能混合使用 async/await 和控制流”,我还没有找到任何方法仅将部分测试移动到异步/await 而不是其他人。

标签: angularjs selenium async-await protractor end-to-end


【解决方案1】:

不兼容,因为

this issue here 中阅读所有相关信息。

由于它非常技术性,我(作为一个相对非技术性的人)理解它的方式是 jasminewd2protractorwebDriver,包括。 ControlFlow 不是为处理 native promisesmanaged promises 的混合而设计的。它只处理managed promises,这些是由许多jasminewd2-commands 创建的。然而,async/await 创建了native promises 并将其推送到 ControlFlow 中,这以两种 promises 类型的混合结束,并且最终导致严重的时间问题。它无法解决,因为 ControlFlow 按预期工作并按其设计目的工作。 async/await 的情况从来都不是 ControlFlow 设计的一部分。

关闭ControlFlow 对我来说意味着managed promises 会被忽略。但是由于async/await,任何managed promise 都会被包裹在native promise 中,因此managed promises 会被忽略,因为您已经通过跟踪native promises 来跟踪所有异步任务。

如何同时测试已迁移和尚未迁移的测试用例

创建两个单独的conf.js(或任何您的配置文件名称)并将它们分开。如果您有公共部分,即helper 函数,也可以迁移这些部分,并可能将未迁移的部分保留为副本。 (创建到 .js 文件或使用布尔指示符来执行或)

@DubZzz 找到了一个可能的技巧来顺利移动到async / await。他的诀窍是使用async / await 转换helpers 并在protractor.promise.controlFlow().execute 中调用它们。然后逐个测试移动,最后删除 controlFlow 执行和标记。

对于迁移,我可以提供以下链接:

The official introduction and migration guide

A similar question witha well documented answer

A good blog about async/await and promises

The official thread about deprecate promise Manager。它还包含有关如何使 async/await 工作的有用信息。

【讨论】:

  • 非常感谢您的链接,我已经看过 selenium 提供的官方迁移指南。尽管如此,我看不出它(选项 3:迁移到异步/等待)如何应用于量角器。无论如何,我还没有发现仅针对某些特定测试将 promise.USE_PROMISE_MANAGER 设置为 false。
  • 感谢您的评论。我确实误读了。为什么不直接创建第二个 conf.js 文件,在其中列出要使用禁用的 Promise Manager 测试的 specs?这应该是最简单的。您还可以在配置文件本身中跟踪您迁移的测试。
  • 确实会很棒。问题是这些测试共享一些助手。这些助手依赖于 selenium 控制流。
  • 我想我找到了一个可能的技巧来平稳地移动到异步/等待,但我仍然不知道“不要混合控制流和 javascript 承诺”背后的真正问题是什么。我的诀窍是使用 async / await 转换助手并在 protractor.promise.controlFlow().execute 中调用它们。然后逐个测试移动,最后删除 controlFlow 执行和标记。
  • 听起来很合理。因为无论如何您都需要迁移 helpers 函数,所以我认为无论如何都需要完成它。关于为什么这一切都不兼容的问题,我建议reading this issue here,尽管它技术含量很高。高度简化:async / await 创建本地承诺,而量角器/webdriver 处理托管承诺。因为async/await 通过jasminewd2 将本机承诺推入ControlFlow,所以会变得混乱。它从来不是为此而设计的。我编辑了我的答案以匹配我们的 cmets 的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2017-04-23
相关资源
最近更新 更多