Selenium, JS — невозможно передать результат getText() переменной

#javascript #selenium #async-await

#javascript #селен #асинхронное ожидание

Вопрос:

Написание некоторых тестов с использованием Selenium Chrome.

У вас есть массив с именем dates , который содержит два элемента: пустой массив allDates и код, подобный этому:

     dates.forEach(async date => {
      console.log("🚀 ~ file: runSelenium.js ~ line 42 ~ position", await date.getText());
      let newDate = await date.getText();
      console.log("🚀 ~ file: runSelenium.js ~ line 44 ~ newDate", newDate)
      allDates.push(newDate);
    })
    console.log("🚀 ~ file: runSelenium.js ~ line 47 ~ allDates", allDates)
 

но результат выглядит примерно так:

 🚀 ~ file: runSelenium.js ~ line 47 ~ allDates []
    ✓ First test (678ms)
🚀 ~ file: runSelenium.js ~ line 42 ~ position 26-02-2021
🚀 ~ file: runSelenium.js ~ line 42 ~ position 06.11.2020
 

Прежде всего, странно, что first — это последний console.log (даже перед именем теста). Но самая большая проблема для меня заключается в том, что он полностью опускает second console.log (это с line 44 в середине).

Я попытался записать данные в newDate переменную несколькими способами, такими как:

 let newDate = (await date.getText()).toString();

let newDate = await date.getAttribute('value');

let newDate = (await date.getAttribute('value')).toString();
 

но ничего из вышеперечисленного не сработало.

Так мало вопросов:

  1. Как я могу изменить его, чтобы иметь возможность сохранять переменную newDate в массиве?
  2. Почему консоль.журнал с line 44 не отображается даже с пустым значением?
  3. Почему консоль.журналы и имя теста расположены не в правильном порядке?

Комментарии:

1. какой фреймворк вы используете

2. вы пробовали alldates = await dates.getText()4

3. Сохраните обещание в массиве, а затем используйте Promise.all(allDates);

Ответ №1:

Используйте for-loop вместо forEach

 for (const date of dates) {
  console.log("🚀 ~ file: runSelenium.js ~ line 42 ~ position", await date.getText());
  let newDate = await date.getText();
  console.log("🚀 ~ file: runSelenium.js ~ line 44 ~ newDate", newDate)
  allDates.push(newDate);
}

console.log("🚀 ~ file: runSelenium.js ~ line 47 ~ allDates", allDates)