Обработка элементов дочерних элементов с использованием async / await в Cucumber JS с Protractor, не возвращающим результатов - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь автоматизировать довольно тривиальный сценарий, когда мне нужно получить текст внутри нескольких li дочерних элементов ul элементов и сравнить его с заданным массивом. Я использую Protractor с Cucumber JS и использую async/await для управления обещаниями.

Мой сценарий HTML выглядит примерно так

       <div class="some-class">
          <ul class="some-ul-class">
               <li>
                <span>Heading1: </span>
                <span class="some-span-class> Value of Heading 1</span>
               </li>
               <li>
                <span>Heading2: </span>
                <span class="some-span-class> Value of Heading 2</span>
               </li>
               <li>
                <span>Heading3: </span>
                <span class="some-span-class> Value of Heading 3</span>
               </li>
               <li>
                <span>Heading4: </span>
                <span class="some-span-class> Value of Heading 4</span>
               </li>
               <li>
                <span>Heading5: </span>
                <span class="some-span-class> Value of Heading 5</span>
               </li>

Мне нужно получить значения первого элемента span, то есть тексты Heading1, Heading2. Я видел много подходов в SO, но ни один из них не привел к решению. В большинстве решений не реализовано async/await, и, если я попробую их, код не сделает то, для чего он предназначен.

Примеры, на которые я ссылался: Тесты транспортира получают значения записей в таблице Транспортир: чтение содержимого таблицы

Если я попытаюсь использовать функцию map внутри блока async, но это привело к ошибке ECONNREFUSED, и, следовательно, было предложено не делать этого здесь .

Буду признателен, если кто-нибудь поможет мне найти решение.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вы не можете ответить @Lunin Roman:

const elements = $$('.some-span-class');
const textFromElements = elements.getText();

textFromElements - это обещание строки []. Когда вы решаете обещание:

textFromElements.then((result) => { console.log(result) )})

вы должны получить массив результатов.

0 голосов
/ 11 января 2019

Это должно работать для вас:

const elements = $$('.some-span-class');
const expected = [];
const elementsLength = await elements.count();
for (let i = 0; i < elementsLength; i += 1){
    const text = await elements.get(i).getText();
    expected.push(text);
}

Когда вы делаете с async/await, вы должны проверить, какой метод транспортира возвращает API, например, $$ возвращает ElementArrayFinder и не требует ожидания, в то время как getText и count возвращает !webdriver.promise.Promise и сначала требуется оператор await.

...