Как синхронизировать итерацию цикла одну за другой - PullRequest
0 голосов
/ 17 июня 2019

У меня есть выпадающий список стран на веб-странице.Мне нужно проверить, что названия стран в выпадающем списке отсортированы с помощью Protractor-Cucumber.

Я нашел все параметры в выпадающем списке с помощью element.all () и использовал цикл forEach для массива.Для каждой итерации он извлекает текст и добавляет в другой массив.Поскольку извлечение текста занимает некоторое время, мой результирующий массив не имеет текстов в том же порядке, в котором он отображается в раскрывающемся списке.

element.all(by.css('ul.sbsb_b')).then(function(allOptions){
  allOptions.forEach(function(optn){
    optn.getText().then(function(text){
    result.push(text); 
     })
  })
 });

Если в моем раскрывающемся списке указаны параметры A, B, C, D, то результирующий массив должен отображать меня в том же порядке.Вышеприведенная логика прекрасно работает для меньшего количества опций.Я хочу, чтобы forEach делал итерацию одну за другой вместо всех сразу из-за асинхронного характера.

1 Ответ

0 голосов
/ 18 июня 2019

Метод, который я попытался бы решить для этой проблемы, состоял бы в том, чтобы преобразовать ElementArrayFinder в массив строк, используя .getText().Я бы предположил, что это сохранило бы порядок, но не могу сказать наверняка.

element.all(by.css('ul.sbsb_b')).getText().then(function(allOptions){
    console.log(typeof allOptions)
    console.log(Array.isArray(allOptions))
}

Для предварительной проверки можно использовать два подхода, которые не требуют какого-либо определенного порядка извлекаемого массива имен состояний.

Вы можете отсортировать массив, а затем ожидать, что они оба будут равны.

element.all(by.css('ul.sbsb_b')).getText().then(function(allOptions){
    expect(allOptions.sort()).toEqual(expectedStates);
}

Или вы можете проверить, что созданный вами массив имеет ту же длину, что и ожидаемый массив состояний, а затем убедиться, что каждое ожидаемое состояние появляется хотя бы один раз в созданном массиве

element.all(by.css('ul.sbsb_b')).getText().then(function(allOptions){
    expect(allOptions.length).toBe(expectedStates.length);
    for(let i = 0; i < expectedStates.length; count++){
       expect(allOptions).toContain(expectedStates[i]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...