13

我是量角器的新手。这个函数中的 async/await 是如何工作的?谁能给我解释一下?

it('TC_01 - Verify Home page title', async () => {
    await headerPage.waitForTitleContain('Homepage', 30000);
    await expect(headerPage.getTitle()).toEqual('Homepage');
});
4

1 回答 1

23

这都是关于 JavaScript 的异步特性的。

目前量角器提出了几种处理异步操作的方法,(我没有在这里描述直接的承诺链和生成器):

1) 承诺管理器/控制流

https://github.com/SeleniumHQ/selenium/wiki/WebDriverJs#control-flows

这是一种抽象,它使您的所有操作都像队列一样被一一调用。每个动作都会返回一个特殊的对象——一个 Promise。它代表异步操作的结果,将在未来收到。

2)第二种方式 - 异步/等待

https://ponyfoo.com/articles/understanding-javascript-async-await#using-async-await

它是围绕 Promise 对象的新抽象,允许轻松地逐个链接操作。优点是这是本地语言构造,而不是 Promise Manager,并使您的代码看起来像同步的,带有 try/catch 和其他熟悉的构造。

您可以将 await 想象为“暂停代码执行,直到从操作返回的承诺得到解决”

但是 async/await 仍然适用于内部的 Promise。

在 protractorJS 中使用 async/await 时的一些建议:

  1. 确保您禁用了控制流/承诺管理器:https ://github.com/angular/protractor/blob/master/lib/config.ts#L714 将等待与启用的控制流混合可能会导致不可预测的结果。

  2. 不要忘记在所有异步操作之前加上 await(通常这都是量角器 api 方法)。如果您忘记执行此操作 - 没有 await 的操作不会与其他操作一起排队,因此操作顺序将被破坏

  3. 确保您使用的是支持此功能的 nodejs - 至少 nodejs 7.8.x(或更高版本)。如果使用 TypeScript,请将编译目标设置为 "target": "es2017"

  4. 为了不忘记应该在哪里使用 await ,在哪里不使用,我可以建议使用插件设置 eslint - https://www.npmjs.com/package/eslint-plugin-no-floating-promise并配置 eslint 以抛出错误对于此规则:https ://eslint.org/docs/user-guide/configuring/rules#configuring-rules

更多阅读: https ://github.com/angular/protractor/blob/master/docs/control-flow.md

https://github.com/SeleniumHQ/selenium/wiki/WebDriverJs#option-3-migrate-to-asyncawait

于 2017-06-22T13:59:47.943 回答