問題描述
我是量角器的新手.這個函數中的 async/await 是如何工作的?誰能給我解釋一下?
I'm new to protractor. How does async/await in this function works? Can anybody explain it to me?
it('TC_01 - Verify Home page title', async () => {
await headerPage.waitForTitleContain('Homepage', 30000);
await expect(headerPage.getTitle()).toEqual('Homepage');
});
推薦答案
這完全是關于 JavaScript 的異步特性.
This is all about asynchronous nature of JavaScript.
目前 protractor 提出了幾種處理異步操作的方法,(我沒有在這里描述直接的 Promise 鏈和生成器):
Currently protractor proposes several ways to handle asynchronous actions, (I didn't describe direct promise chaining, and generators here):
1) 承諾管理器/控制流
https://github.com/SeleniumHQ/selenium/wiki/WebDriverJs#控制流
這是一種抽象,使您的所有操作都被一個一個地調用,就像一個隊列.每個動作都會返回一個特殊的對象——一個 Promise.它表示異步操作的結果,將在將來接收.
This is abstraction that makes all your actions to be called one by one, like a queue. Each action returns a special object - a Promise. It represents result of async operation, that will be received in future.
2) 第二種方式 - 異步/等待
https://ponyfoo.com/articles/understanding-javascript-async-await#using-async-await
它是圍繞 Promise 對象的新抽象,允許輕松地逐個鏈接操作.優點是這是本地語言構造,而不是 Promise Manager,并使您的代碼看起來像同步的,帶有 try/catch 和其他熟悉的構造.
It is new abstraction around promises objects and allows to easily chain actions one by one. Advantage is this is native language construction, instead of Promise Manager, and makes your code look like synchronized, with try/catch and other familiar constructions.
您可以將 await 想象為暫停代碼執行,直到從操作返回的承諾得到解決"
You can think of await like "suspend code execution until promise that returned from action is resolved"
但是 async/await 仍然可以在內部使用 Promise.
But async/await still works with promises inside.
在 protractorJS 中使用 async/await 時的一些建議:
確保您禁用了控制流/承諾管理器:https://github.com/angular/protractor/blob/master/lib/config.ts#L714將等待與啟用的控制流混合可能會導致不可預知的結果.
Make sure you disabled control flow / promise manager: https://github.com/angular/protractor/blob/master/lib/config.ts#L714 Mixing awaits with enabled control flow may lead to unpredictable results.
不要忘記在所有異步操作前加上 await(通常這都是量角器 api 方法).如果您忘記執行此操作 - 沒有 await 的操作不會與其他操作一起排隊,因此操作順序將被破壞
Do not forget to prepend ALL your async actions with await (usually this is all protractor api methods). If you will forgot to do this - action without await won't be queued with other actions, so order of actions will be broken
確保您使用的是支持此功能的 nodejs - 至少 nodejs 7.8.x(或更高版本).如果使用 TypeScript,請將編譯目標設置為target":es2017"
Make sure you are using nodejs that supports this - at least nodejs 7.8.x (or newer). If TypeScript is used, set compile target as "target": "es2017"
為了不忘記應該在哪里使用 await,而在哪里不使用,我可以建議使用插件設置 eslint - https://www.npmjs.com/package/eslint-plugin-no-floating-promise 并配置 eslint 為這條規則拋出錯誤:https://eslint.org/docs/user-guide/configuring/rules#配置規則
To not forget where await should be used, and where is not, i can suggest to setup eslint with plugin - https://www.npmjs.com/package/eslint-plugin-no-floating-promise and configure eslint to throw errors for this rule: 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
這篇關于解釋 Protractor 中的 async/await的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!