2016-01-03 1 views
3

Я пытаюсь использовать протранскатор by.repeater, чтобы найти все элементы, перечисленные в коллекции. Здесь используется перечисление (key, value) in expression для директивы ngRepeat и UI Bootstrap accordion directive.protractor by.repeater и visibilityOf только возврат первого элемента в коллекции

HTML, является:

<accordion id="automobile-types" close-others="true"> 
    <accordion-group heading="{{ autoType }}" 
    ng-repeat="(autoType, details) in automobiles"> 
    <div>Color of automobile:</div> 
     <ul> 
     <li ng-repeat="color in details.color"> 
      {{ color }} 
     </li> 
     </ul> 
    </accordion-group> 
</accordion> 

Где

automobiles = { 
'Car': {'color': 'black', 'name': 'Knight Rider' }, 
'Truck': {'color': 'green', 'name': 'Biggins'} 
} 

Используя protractor example in the angular docs for ngRepeat, вот мой транспортир код:

var EC = protractor.ExpectedConditions; 
var cars = element.all(by.repeater('(autoType, details) in automobiles')); 

it('should have two automobiles listed', function() { 
    var visibleList = EC.visibilityOf(cars); 
    browser.wait(visibleList, 5000); 
    expect(cars.count()).toEqual(2); 
}); 

Возвращает этот провал:

Failed: Cannot call method 'bind' of undefined 

Если я удалю .all, тест продолжится, так как он найдет только первый элемент в ng-repeat. Эти тесты проходят:

var car = element(by.repeater('(autoType, details) in automobiles')); 
expect(car.getText()).toEqual('Car'); 

var accordion = element(element(by.id('automobile-types'))); 
expect(accordion.getText()).toEqual('Car\nTruck'); 

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

Любой совет о том, как вернуть блок html для каждого автомобиля, будет оценен по достоинству.

ответ

1

Прежде всего, вы должны позвонить в element.all() внутри it(). И в конце строки есть недостающая запятая, в которой вы определяете cars. Стационарное исполнение:

it('should have two automobiles listed', function() { 
    var cars = element.all(by.repeater('(autoType, details) in automobiles')); 
    expect(cars.count()).toEqual(2); 
}); 

Если это все еще не работает, попробуйте использовать by.exactRepeater():

var cars = element.all(by.exactRepeater('(autoType, details) in automobiles')); 

Или переключиться на альтернативные техники местоположения:

var cars = $$('[ng-repeat="(autoType, details) in automobiles"]'); 

Здесь $$ ярлык для element.all(by.css()).

+0

Спасибо alecxe за помощь и за предложения синтаксиса. Я внедрил ваше предложение об использовании '$$', я не думал об этом, но я все еще сталкивался с тем же отказом. Проблема, с которой я сталкиваюсь, заключается в том, что селектор элементов не будет возвращать '.all' списка. Он возвращает только первый элемент в коллекции повторений, сохраняя при этом каждый элемент в HTML. Я думал, что это был конфликт с производным аккордеона бутстрапа или синтаксисом «ключ, пара» для ngRepeat, но я не мог найти информацию об одной из этих двух вещей. – JessG

+0

@JessG да, хорошая точка, я думаю, что видел эту ошибку несколько раз раньше и, я подозреваю, это своего рода общая ошибка. Давайте отлаживаем его. Не могли бы вы разместить свой конфиг, полный тест и трассировку?Спасибо, мы это разрешим. – alecxe

+0

@JessG Возможно, попробуйте открыть '' '' '' перед тем, как получить весь элемент внутри. . '' '$ ('# Автомобильно-типа') нажмите кнопку(); browser.waitForAngular(); '' 'then' '' $$ ('[ng-repeat = "(autoType, details) в автомобилях"]'); '' '--- Я получил точно такой же вывод ошибки там, Я помню, что я сделал какое-то подобное условие, чтобы убедиться, что Protractor '' 'element.all()' '' не запускается, прежде чем JS выполнит все выполняемые задачи. –

1

Похоже, что сбой около Cannot call method 'bind' of undefined был в ответ на Expected Condition visibiltyOf, а не на by.repeater, как первоначально предполагалось.

Похоже, что метод visibiltyOf принимает только элемент, в то время как список элементов передается. Эти тесты прошли сейчас:

var EC = protractor.ExpectedConditions; 
var cars = element.all(by.repeater('(autoType, details) in automobiles')); 
var carTypes = element(by.id('automobile-types)); 

it('should have two automobiles listed', function() { 
    var visibleList = EC.visibilityOf(carTypes); 
    browser.wait(visibleList, 5000); 
    expect(cars.count()).toEqual(2); 
}); 

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

  • Нет связанных вопросов^_^