循环将选择下拉列表中的所有元素

时间:2016-08-01 20:09:02

标签: javascript html angularjs protractor

我进去为每个下拉列表创建了id标签。我尝试创建一个循环来选择下拉列表中的每个制造商,而不必编写300多行代码,因为在某些下拉列表中有很多选项。我试过了,无法找到方法。例如,第二个下拉菜单是" source_manufacturer"。

这是我试过的:

var expected = ['COMFORT-AIRE', 'Daewoo', 'GE'];
var els = element.all(by.id('source_manufacturer'));
for (var i = 0; i < expected.length; ++i) {
expect(els.get(i).getText()).toEqual(expected[i]);
}

这是html代码:

<select id="source_manufacturer" ng-class="{'btn btn-default' :   !$root.isMobile.iOS()}" class="form-control ng-valid btn btn-default ng-not-empty ng-touched ng-dirty ng-valid-parse" ng-model="manufacturer" ng-options="m.name for m in manufacturers">

`<option selected="selected" value="object:439" label="COMFORT-AIRE">COMFORT-AIRE</option>  
....
<option value="object:443" label="Whirlpool">Whirlpool</option></select>`

这是错误消息:失败:索引越界。试图访问index:1处的元素,但只有1个元素匹配定位器By(css选择器,* [id =&#34; source_manufacturer&#34;])。我想测试是否可以选择每一个并且它实际上是否会发生变化。

预期显示列表中的每个元素而不是单个元素。

这就是我点击列表中每个元素的方法:

    element(by.id('source_manufacturer')).click().
    element(by.cssContainingText('option', 'GE')).click();

1 个答案:

答案 0 :(得分:0)

首先,您应该确保您确实拥有多个selectsource_manufacturer个元素的元素。然后,您应该使用each()而不是常规for循环。而且,我会在建议here

的select-option结构上使用优雅的抽象
var expected = ['COMFORT-AIRE', 'Daewoo', 'GE']
var selects = element.all(by.id('source_manufacturer'));
selects.each(function (select, index) {
    var selectWrapper = SelectWrapper(select);
    selectWrapper.selectByPartialText(expected[index]);

    expect(selectWrapper.getSelectedOptions().first().getText()).toEqual(expected[index]);
});