2017-01-10 4 views
3

мой сценарий выглядит следующим образом: 1. открыта страница Логин 2. введите имя пользователя, 3. введите пароль, 4. Нажмите кнопку Войти, 5. Роль выбора модальное открывается список возможных ролей пользователя. 6. нажмите на 1-ю роль.транспортир тест не нажав кнопку мой/элемент

Мой тест выглядит так:

'use strict'; 

describe('Login page', function() { 

    beforeEach(function() { 
    browser.get('/#/login'); 
    }); 

    it('should login', function() { 

    var _user = element(by.model('loginForm.exchange.user')); 
    var _pass = element(by.model('loginForm.exchange.password')); 
    var loginButton = element(by.xpath('/html/body/snap-content/ui-view/div/section/content/div/div/div[2]/div/form/button')); 

    _user.sendKeys('myUsername'); 
    _pass.sendKeys('myPassword'); 

    loginButton.click(); 

    var _roleModal = by.className('modal-dialog'); 
    browser.driver.wait(function() { 
     return browser.driver.isElementPresent(_roleModal); 
    }, 5000) 
     .then(function() { 
     browser.driver.sleep(3000); 
     console.log('modal now opened.'); 

     var _elementInModal = by.css('[ng-click="cancel()"]'); 

     browser.driver.wait(function() { 
      return browser.driver.isElementPresent(_elementInModal); 
     }, 1000) 
      .then(function() { 
      browser.driver.sleep(2000); 

      console.log('element present.'); 

      // issue here being, I can't access the roles listed in modal, even though I've created a check if the button with cancel() exists in modal itself. 
      // using by.xpath('/html/body/div[5]/div/div/form/div/div/div/div/ul/li[1]') to fetch 1st role doesn't work either. 

      element.all(by.repeater('role in userRoles')).then(function (role) { 
       console.log('HUEY! ROLE!', role); 
       var titleElement = role[0].element(by.css('media-body')); 
       console.log(titleElement); 
      }); 
      }); 
     }); 

    }, 30000); 
}); 

Имейте в виду, когда речь идет о модальных, это бутстраповская модальный (https://angular-ui.github.io/bootstrap/).

шаблон Modal:

<div ng-switch-when="userRoles"> 
    <div class="card"> 
     <ul class="table-view" > 
      <li ng-repeat="role in userRoles" class="table-view-cell" ng-click="save(role)"> 
       <a class="navigate-right"> 
       <div class="media-body"> 
        {{role.LTEXT}} 
       </div> 
      </a> 
      </li> 
     </ul> 
    </div> 
    </div> 

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

+0

Есть ли ошибки? И только FYI, если вам нужен только первый элемент из этого метода .all, вы можете использовать функцию [.first()] (http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype .), а не индексировать его. – Gunderson

+1

Благодарим за комментирование. Я получаю ошибку таймаута после 31 секунд (как установлено в конце строки моего теста) – gregor

+0

@gregor отмечает, что вы, вероятно, имели селектор CSS .media-body' вместо 'media-body'. – alecxe

ответ

1

Я не знаю, почему это так, но через 10 часов я наконец нашел причину.

browser.ignoreSynchronization = true; 

Это означает, что я не жду каких-либо «угловых» вещей как транспортир FAQ состояний:

Если вам нужно перейти на страницу, которая не использует Угловое, вы можете выключения ждут Угловой установки browser.ignoreSynchronization = истина

Поскольку я до сих пор не могу понять, почему это так, потому что весь мой проект использует Угловым, почему это помогло мне решить эту проблему?

Это потому, что я пытался получить данные из модального, созданного бутстрапом, создающим модальный метод и вызываемый внутри контроллера? Возможно, однако нет никакой информации или подобной проблемы.

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

0

Вы не вызываете никаких действий на titleElement, поэтому Protractor не выполняет фактический поиск. Из ElementFinder documentation:

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

Ваш раз спецификации, потому что это не имеет никакого возврата действия (например expect() метод) и ваше console.log() заявление не имеет ничего распечатать. Вы могли бы сделать это вместо этого:

expect(titleElement.getText()).toBe('INSERT_EXPECTED_TEXT'); 
+0

Благодарим вас за ответ. Кажется логичным, но то, что не подходит, - console.log, который должен быть хотя бы напечатан с пустой строкой, объектом или чем-либо еще. Я никогда не добираюсь до внутреннего элемента .then(), он даже не находит элементы ретранслятором. – gregor