将Protractor测试移动到async/await(离开硒控制流)



我想在我的Protractor测试中将appart从硒控制流中移除。

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

1.逐个测试禁用

我的第一个想法是使用SELENIUM_PROMISE_MANAGER,以便从selenium-promise转换为异步/等待代码。

不幸的是,我发现没有办法将一个测试放在SELENIUM_PROMISE_MANAGER=0上,而将其他测试保留在SELENIUM_PROMISE_MANAGER=1上,以便顺利地进行迁移。

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

因此,我考虑了一个在保留SELENIUM_PROMISE_MANAGER=1的同时使用async/await的代码。

不幸的是,它似乎不兼容:https://github.com/angular/protractor/tree/master/exampleTypescript/asyncAwait

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

3.覆盖承诺。USE_PROMISE_MANAGER

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

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

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

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

什么是正确的策略

我想知道,在Protractor测试中,转移到异步/等待的正确策略是什么?

我不想在一次更改中将所有内容都放在异步/等待中,而是将更改分散在多个小更改中

不兼容,因为

请在此处阅读本期的全部内容。

由于这是非常技术性的,我(作为一个相对不技术的人)理解它的方式是,jasminewd2protractorwebDriver(包括ControlFlow)不是为处理native promisesmanaged promises的混合而设计的。它只处理managed promises,这是由许多jasminewd2命令创建的。然而,async/await创建native promises并将其推送到ControlFlow中,ControlFlow以两种promise类型的混合而告终,并且都以严重的时序问题而告终。它无法解决,因为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执行和标志。

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

的官方介绍和迁移指南

一个类似的问题,有一个有充分记录的答案

一个关于async/await和承诺的好博客

关于弃用承诺经理的官方帖子。它还包含关于如何使async/await工作的有用信息。

最新更新