2015-01-12 4 views
10

Я пишу протрансляторные тесты и тому подобное, хотя иногда кажется, что они попадают на что-то похожее, как будто оно должно быть простым. Например, я хочу пропустить все кнопки на одной из наших страниц с текстом «Назначить». На странице есть десятки, но только 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(); 
       } 
      }); 
     } 
    }); 

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

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

ответ

15

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(); 

EDIT, кстати, вы не должны полагаться на это поведение (нажмите первую кнопку текста «номинировать»), потому что приведет к проблемам при изменении вашего приложения. Смотрите, если вы можете либо выбрать по ID или выбрать более конкретный «номинировать» как element(by.css('the section the nominate is under')).element(by.buttonText('Nominate'));

EDIT снова: см Using protractor with loops для объяснения

+0

Спасибо так много. Я весь день борюсь с этим. Я не только не понял, что х был виновником, я не знал о первой() функции, на которую вы ссылались, поэтому я очень благодарен. Я знаю, что щелчок по первому элементу не является хорошей идеей, и я обычно избегаю этого. Это, однако, несколько странный случай, и на самом деле это должно сработать, хотя я знаю, что могу в конечном итоге кусать свой язык. В любом случае, я очень ценю, что вы нашли время ответить. В итоге он завершил мою тестовую работу и научил меня нескольким вещам на этом пути. Я парень-питон и довольно новичок в JS и обещаю – user2233949

+0

Добро пожаловать. Вы должны принять ответ, если он помог вам вместо ответа в новом ответе, хотя =) – hankduan

+0

Я не знал, что мы можем связать элемент - спасибо – mrwaim

Смежные вопросы