Angularjs 将量角器测试移动到异步/等待(离开selenium控制流)

Angularjs 将量角器测试移动到异步/等待(离开selenium控制流),angularjs,selenium,async-await,protractor,end-to-end,Angularjs,Selenium,Async Await,Protractor,End To End,我想在量角器测试中从selenium控制流中移动appart 以下是我迄今为止经历的步骤和问题: 1。逐个测试禁用it测试 我的第一个想法是使用SELENIUM\u PROMISE\u MANAGER,以便从SELENIUM promises转换为异步/等待代码 不幸的是,我发现没有办法将一个测试放在SELENIUM\u PROMISE\u MANAGER=0上,而将其他测试放在SELENIUM\u PROMISE\u MANAGER=1上,以便顺利进行迁移 2。保留它,但也要使用异步/等待 因

我想在量角器测试中从selenium控制流中移动appart

以下是我迄今为止经历的步骤和问题:

1。逐个测试禁用it测试

我的第一个想法是使用
SELENIUM\u PROMISE\u MANAGER
,以便从SELENIUM promises转换为异步/等待代码

不幸的是,我发现没有办法将一个测试放在
SELENIUM\u PROMISE\u MANAGER=0
上,而将其他测试放在
SELENIUM\u PROMISE\u MANAGER=1
上,以便顺利进行迁移

2。保留它,但也要使用异步/等待

因此,我考虑使用async/await编写代码,同时保持
SELENIUM\u PROMISE\u MANAGER=1

不幸的是,它似乎不兼容:

硒方面并没有这样的问题,所以我想知道这是一个建议还是一个真正的建议,它总是失败

3。覆盖承诺。使用承诺管理器

使用
量角器.promise.USE\u promise\u MANAGER=false
对我不起作用(在beforeach中)

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

dragrator.promise.controlFlow().execute(/*my async code*/)

对我来说,它似乎混合了异步/等待来控制流

什么是正确的策略?

我想知道,在量角器测试中使用异步/等待的正确策略是什么


我不想将所有内容都放在async/Wait中,而是将更改分散在多个小更改中,因为不兼容

阅读所有关于

由于它非常技术性,我(作为一个相对不懂技术的人)理解它的方式是,
jasminewd2
量角器
webDriver
包括
ControlFlow
都不是为处理
本地承诺
管理承诺
的混合而设计的。它只处理
托管承诺
,这些承诺是由许多
jasminewd2
-命令创建的。然而,
async/await
创建了
本机承诺
并将其推送到控制流中,这将导致两种承诺类型的混合,并最终导致严重的时间问题。无法解决此问题,因为
控制流
的工作原理与预期相符,并且是为其设计的。
async/await
的情况从来不是
ControlFlow
设计的一部分

关闭
控制流
对我来说意味着,
管理承诺
被忽略。但是由于
async/await
任何
managed promise
都将被包装在
本机promise
中,因此这并不重要,
managed promises
会被忽略,因为您只通过跟踪
本机承诺来跟踪所有已经存在的异步任务

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

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

@DubZzz发现了一个可能的技巧,可以平滑地移动到
async/await
。他的诀窍是使用
async/await
转换
助手
,并在
量角器.promise.controlFlow().execute中调用它们。然后逐个测试移动测试,最后删除controlFlow execute和标志

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


。它还包含如何使async/await工作的有用信息。

阅读这篇文章似乎很简单。您需要通过命令行启用async/Wait(检查2月4日)。那么,为什么您认为它不兼容?您会遇到什么错误?我的问题是,量角器指南明确地说“但是,您不能混合使用异步/等待和控制流”,我还没有找到任何方法将部分测试移到异步/等待,而不是其他测试。非常感谢链接,我已经看过selenium提供的官方迁移指南。尽管如此,我不知道如何将它(选项3:迁移到异步/等待)应用到量角器。我还没有找到设置承诺的方法。请仅在某些特定测试中将\u promise\u MANAGER设置为false。谢谢您的评论。我确实误解了这一点。为什么不创建第二个
conf.js
文件,在其中列出要使用禁用的Promise Manager进行测试的
specs
?到目前为止,这应该是最简单的。您还可以在配置文件本身中跟踪迁移了哪些测试,这确实很好。问题是这些测试共享了一些帮助程序。这些助手依赖于selenium控制流。我想我找到了一个可能的技巧,可以顺利过渡到async/await,但我仍然不知道“不要混合控制流和javascript承诺”背后的真正问题是什么。我的诀窍是使用async/await转换帮助程序,并在paragrator.promise.controlFlow().execute中调用它们。然后逐个测试移动测试,最后删除controlFlow execute和标志。这听起来很合理。因为您无论如何都需要迁移
helpers
函数,所以我假设在任何情况下都需要这样做。关于为什么这一切都不兼容的问题,我建议,尽管这是高度技术性的。高度简化:
async/await
创建本机承诺,而dragrator/webdriver处理托管承诺。因为
async/await
通过
jasminewd2
将本机承诺推送到
ControlFlow
中,所以会变得混乱。它从来不是为这个设计的。我编辑了我的答案以与我们评论的结果相匹配。