我为什么不能在Protractor中使用:“ await .getAttribute()”,即使它返回了一个Promise?

时间:2019-03-11 09:48:44

标签: javascript angular async-await protractor angular-e2e

我正在尝试将我的量角器测试更改为使用async / await而不是硒控制流,但它不允许我将.getAttribute()函数使用await。我得到的只是该错误消息:“ SyntaxError:await仅在异步函数中有效”。但是.getAttribute()是否应该异步,因为它返回了Promise?

这里是出现此错误的许多示例之一:

this.navBarcreator = async () => {        
    var mapArray = {}

    await element.all(by.tagName('mat-list-item')).each((elem) => {
        var tmp = await elem.getAttribute('aria-describedby')
        if (tmp != null) {
            ...
        }
    })

2 个答案:

答案 0 :(得分:1)

(elem) => {
    var tmp = await elem.getAttribute('aria-describedby')
    if (tmp != null) {
        ...
    }

该功能不是async,并且必须为asyncawait才能正常工作。使您的回调异步,它应该工作。

async (elem) => { //... }

答案 1 :(得分:0)

如果我们破坏了您的职能:

// We have this first part which is async/await
this.navBarcreator = async () => {        
    // ...
});

// Then we have this part, where we are calling a function
// using each, and this function is not async/await
// but you are trying to use the keyword await in it
var mapArray = {}

await element.all(by.tagName('mat-list-item')).each((elem) => {
   // ... await ...
});

正确的语法是

await element.all(by.tagName('mat-list-item')).each(async (elem) => {
   // ... await ...
});

但是我不知道.each是否适合使用异步功能。

我自己,我喜欢映射并返回使用Promise.all解决的诺言,例如:

async function treatElement(x) {
   // ... await ...
}

await Promise.all(myArr.map(x => treatElement(x)));