Почему я не могу использовать: "await .getAttribute ()" в Protractor, даже если он возвращает обещание? - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь изменить свои тесты Protractor, чтобы использовать async / await вместо потока управления селеном, но это не позволит мне использовать await для функции .getAttribute (). Все, что я получаю, это сообщение об ошибке: «SyntaxError: await действителен только в асинхронной функции». Но не должен ли .getAttribute () быть асинхронным, поскольку он возвращает обещание?

Вот один из многих примеров, где я получаю эту ошибку:

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 ]

1 голос
/ 11 марта 2019
(elem) => {
    var tmp = await elem.getAttribute('aria-describedby')
    if (tmp != null) {
        ...
    }

Эта функция не async, и она должна быть async, чтобы await работал.Сделайте ваш обратный вызов асинхронным, и он должен работать.

async (elem) => { //... }
0 голосов
/ 11 марта 2019

Если мы сломаем вашу функцию:

// 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)));
...