当我们使用E2E测试在下拉量角器中包含多个包含相同文本的选项时,如何选择任何特定选项

时间:2015-03-11 11:22:38

标签: angularjs jasmine protractor

我试图从下拉列表中选择一个“印度”选项,用于使用量角器的角度e2e测试。

以下是选择选项的代码段:

<select id="countryCode" class="form-control nux-select input-md ng-touched ng-dirty ng-valid-parse ng-valid ng-valid-required" required="" data-ng-model="selectedCountry" data-ng-options="c.country for c in country" name="countryCode">
<option class="" selected="" value="">-- select --</option>
<option value="0">Afghanistan</option>
<option value="1">Albania</option>
.
.
.
<option value="29">Brazil</option>
<option value="30">British Indian Ocean Territory</option>
.
.
.
<option value="98">India</option>
<option value="99">Indonesia</option>

我试过了:

element(by.cssContainingText('option', 'India')).click();

但是,在选择此选项而不是“印度”之前,“英属印度洋领地”选项即将推出。

所以我尝试如下,它的工作原理:

element(by.xpath('//select[@id="countryCode"]/option[98]')).click();

但是因为我很难编码并且可能会在下拉列表中添加新值,任何人都可以建议我采用不同的方式来实现它。

2 个答案:

答案 0 :(得分:2)

其他selenium语言绑定具有select->option HTML构造,抽象方便的Select类暴露了不同的方便方法,例如(python):

select = Select(driver.find_element_by_id('countryCode'))
select.select_by_visible_text('India')

在量角器中,没有内置的东西,但正如Select -> option abstraction主题中@dmitankin友好提出的那样,你可以构建一个并重用,非常透明:

var mySelect = new SelectWrapper(by.id('countryCode'));
mySelect.selectByText('India');

仅供参考,selectByText()这里基于xpath表达式检查选项的文本:

SelectWrapper.prototype.selectByText = function(text) {
    return this.webElement.all(by.xpath('option[.="' + text + '"]')).click();   
};

答案 1 :(得分:0)

element.all(by.cssContainingText('option', 'India')).then(function(items) {
  expect(items.length).toBe(2);
  expect(items[0].getText()).toBe('British Indian Ocean Territory');
  expect(items[1].getText()).toBe('India');
});

我不确定这是最好的解决方案,但它应该有效。如果你要添加包含'India'的新值,它将不会稳定,但它看起来不太真实。