Почему ожидание Selenium getAttribute по-прежнему возвращает обещание? - PullRequest
0 голосов
/ 09 апреля 2020

Я использую Selenium для JavaScript и пытаюсь создать массив, содержащий входные значения формы. Я знаю, что getAttribute (как и большинство других методов) возвращает обещание. Но почему значения в массиве values Promises, хотя я и назвал await?

Then(/^The Author form should be empty$/, () => {
  return driver.findElements(By.css('.author-form input')).then( (inputs) => {
    expect(inputs.length).toBe(3)    
    let values = inputs.map(async (input) => await input.getAttribute('value'))
    console.log("The values")
    console.log(values)
    values.forEach((value) => {
      expect(value).toEqual('')
    })
  })
})

Когда я запускаю код, я получаю следующий вывод:

The values
[ Promise { <pending> }, Promise { <pending> }, Promise { <pending> } ]

Не вызывает ли await на getAttribute значение?

(Да, я знаю, что код выглядит немного странно. Я пытался выяснить, как вызвать expect внутри forEach l oop без получения UnhandledPromiseRejectionWarning - но это вопрос для другого поста.)

1 Ответ

2 голосов
/ 09 апреля 2020

Чтобы объяснить, почему это происходит, позвольте мне привести еще один пример:

let values = inputs.map(async (input) => {
    await input.getAttribute('value');
    console.log('After await');
});

Без асинхронности c Подождите, это становится:

let values = inputs.map((input) => {
    return input.getAttribute('value').then((result) => {
        console.log('After await');
    });
});

В этом случае вы ожидаете Эти значения - это список обещаний, которым он является.

Проблема, с которой вы столкнулись, - да, вы ожидаете результата. Однако функция asyn c ВСЕГДА возвращает обещание. map не делает ничего, чтобы выполнить это обещание. await внутри функции, переданной в map, на самом деле ничего не делает в этом случае. Вместо этого вам нужно сделать следующее:

const value_promises = inputs.map((input) => {
    return input.getAttribute('value');
});
const values = await Promise.all(value_promises);

Promise.all предназначен именно для этого случая, когда у вас есть список Обещаний и вы хотите получить их значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...