Выбор элемента в выпадающем меню в protractor

#protractor

#транспортир

Вопрос:

У меня есть выпадающее меню на моей странице. Моя цель для тестирования protractor — щелкнуть один из параметров этого выпадающего меню и попросить protractor проверить результаты:

 <ul class="dropdown">
  <li class="nav-header">portfolio</li>
  <li class="divider"></li>
  <li class="dropdown-submenu"> ... </li>


   <li ng-repeat="p in user.portfolios">
    <!-- this is the option we will click for our testing -->
    <a href ng-click="displayPortfolio(p)>Portfolio 1  </a>
   </li>

   <li ng-repeat="p in user.portfolios">
    <a href ng-click="displayPortfolio(p)>Portfolio 2  </a>
   </li>  

   <li ng-repeat="p in user.portfolios">
    <a href ng-click="displayPortfolio(p)>Portfolio 3  </a>
   </li>  


</ul>
  

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

 it('should display relevant portfolio when clicked',function(){

    ptor.ignoreSynchronization = true;  
    element.all(by.xpath("//a[@ng-click='displayPortfolio(p)'])).then(function(list){
      list[0].click();
      expect(... some assertion here);

    });
    ptor.ignoreSynchronization = false;  
}
  

На всякий случай, если вам интересно, ptor.ignoreSynchronization включена, потому что моя веб-страница постоянно опрашивает серверную часть на предмет некоторых обновлений.

Транспортир выдает следующую ошибку при запуске теста:

 ElementNotVisisbleError: element not visible
  

Я не совсем понимаю, о чем эта ошибка. Элемент, безусловно, виден, поскольку, когда я просматриваю исходный код страницы, я вижу его в структуре DOM.

Любезный совет

Ответ №1:

Я обработал тот же случай, установив значение напрямую. найдите элемент и задайте значение с помощью «SendKeys».

Попробуйте то же самое для вашего сценария.

Ответ №2:

Вы пробовали использовать repeater locator?

 it('should display relevant portfolio when clicked',function(){
    var elements = element.all(by.repeater('p in user.portfolios'));
    elements.get(0).click().then(function(){
        expect(... some assertion here);
    });
}