我想在我的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测试中,转移到异步/等待的正确策略是什么?
我不想在一次更改中将所有内容都放在异步/等待中,而是将更改分散在多个小更改中
不兼容,因为
请在此处阅读本期的全部内容。
由于这是非常技术性的,我(作为一个相对不技术的人)理解它的方式是,jasminewd2
、protractor
和webDriver
(包括ControlFlow
)不是为处理native promises
和managed 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工作的有用信息。