将 Protractor 测试移至 async/await(保留 selenium 控制流)

Moving Protractor tests to async/await (leaving selenium control flow)

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

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

1.通过 test

测试禁用它

我的第一个想法是使用 SELENIUM_PROMISE_MANAGER 以便从 selenium promises 转移到 async/await 代码。

不幸的是,为了顺利进行迁移,我发现无法将一项测试用于 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 中,而是将更改分散到多个小更改中

不兼容,因为

阅读 this issue here 中的所有内容。

由于它非常技术性,我(作为一个相对非技术性的人)理解它的方式是 jasminewd2protractorwebDriver,包括。 ControlFlow 并非旨在处理 native promisesmanaged promises 的混合。它只处理 managed promises 等是由许多 jasminewd2 命令创建的。但是,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 execute 和 flag。

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

The official introduction and migration guide

A good blog about async/await and promises

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