Выберите первый видимый элемент в транспортир

Я пишу протрансляторные тесты и люблю его, хотя иногда кажется, что они попадают на что-то похожее, как будто оно должно быть простым. Например, я хочу пропустить все кнопки на одной из наших страниц с текстом "Назначить". На странице есть десятки, но только 1 или 2 будут видны. Поэтому я хочу щелкнуть первый, который есть. Здесь код, который я использую в настоящее время:

    var nominateButtons = element.all(by.buttonText('Nominate'));
    nominateButtons.then(function(els){
        for(var x = 0;x < els.length;x++){
            //Since isDisplayed returns a promise, I need to do it this way to get to the actual value
            els[x].isDisplayed().then(function(isVisible){
                //isVisible now has the right value                 
                if(isVisible){
                    //But now els is not defined because of the scope of the promise!!
                    els[x].click();
                }
            });
        }
    });

Когда я запускаю этот код, я получаю ошибку "не могу вызвать метод щелчка undefined", потому что els [x] больше не входит в область видимости, но я не могу проверить видимость без использования обещания. Итак, мой вопрос: как вы можете прокручивать коллекцию элементов, проверять их видимость и щелкнуть первый, который видим? (Я пытаюсь не использовать ожидающий проверки видимости, потому что я знаю, что большинство кнопок не будут видны)

Заранее спасибо

Ответ 1

els. Что не определено x. Легкий способ сделать это:

var nominateButtons = element.all(by.buttonText('Nominate'));
var displayedButtons = nominateButtons.filter(function(elem) {
   return elem.isDisplayed(); 
});
displayedButtons.first().click();

или

element.all(by.buttonText('Nominate')).
  filter(function(elem) {
    return elem.isDisplayed(); 
  }).
  first().
  click();

РЕДАКТИРОВАТЬ, кстати, вы не должны полагаться на это поведение (нажмите первую кнопку в тексте "Назначить" ), потому что это приведет к проблемам при изменении вашего приложения. Посмотрите, можете ли вы выбрать по идентификатору или выбрать более конкретный "Номинал", например element(by.css('the section the nominate is under')).element(by.buttonText('Nominate'));

EDIT еще раз: см. Использование транспортира с петлями для объяснения