Я пытаюсь использовать протранскатор 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 для каждого автомобиля, будет оценен по достоинству.
Спасибо alecxe за помощь и за предложения синтаксиса. Я внедрил ваше предложение об использовании '$$', я не думал об этом, но я все еще сталкивался с тем же отказом. Проблема, с которой я сталкиваюсь, заключается в том, что селектор элементов не будет возвращать '.all' списка. Он возвращает только первый элемент в коллекции повторений, сохраняя при этом каждый элемент в HTML. Я думал, что это был конфликт с производным аккордеона бутстрапа или синтаксисом «ключ, пара» для ngRepeat, но я не мог найти информацию об одной из этих двух вещей. – JessG
@JessG да, хорошая точка, я думаю, что видел эту ошибку несколько раз раньше и, я подозреваю, это своего рода общая ошибка. Давайте отлаживаем его. Не могли бы вы разместить свой конфиг, полный тест и трассировку?Спасибо, мы это разрешим. – alecxe
@JessG Возможно, попробуйте открыть '' '' '' перед тем, как получить весь элемент внутри. . '' '$ ('# Автомобильно-типа') нажмите кнопку(); browser.waitForAngular(); '' 'then' '' $$ ('[ng-repeat = "(autoType, details) в автомобилях"]'); '' '--- Я получил точно такой же вывод ошибки там, Я помню, что я сделал какое-то подобное условие, чтобы убедиться, что Protractor '' 'element.all()' '' не запускается, прежде чем JS выполнит все выполняемые задачи. –