如何选择使用ng-repeat实现的下拉元素

时间:2017-12-20 10:43:29

标签: html drop-down-menu protractor

my dropdown menu我在量角器自动化中选择下拉项目时遇到困难。这些下拉项似乎是从数据库中挑选出来的。我是使用量角器的angularjs应用程序自动化的新手。虽然我有自动类似的下拉项目选择,这个如果给我一个艰难的时间。拼命寻求社区的帮助。

下面是HTML / Angular材料代码:

<md-select style="margin: 0px;" ng-model="vm.companyProfile.rgst_address.state" ng-change="vm.getCities(vm.companyProfile.rgst_address.state)" required="" class="ng-pristine ng-empty ng-invalid ng-invalid-required ng-touched" tabindex="0" aria-disabled="false" role="listbox" aria-expanded="false" aria-multiselectable="false" id="select_39" aria-required="true" aria-invalid="true" aria-label="State">
  <md-select-value class="md-select-value md-select-placeholder" id="select_value_label_19">
    <span>State</span>
    <span class="md-select-icon" aria-hidden="true"></span>
  </md-select-value>
  <div class="md-select-menu-container" aria-hidden="true" role="presentation" id="select_container_40">
    <md-select-menu role="presentation" class="_md">
      <md-content class="_md"><!-- ngRepeat: state in vm.states | orderBy : 'state' -->
        <md-option ng-value="state._id" ng-repeat="state in vm.states | orderBy : 'state'" tabindex="0" class="ng-scope md-ink-ripple" role="option" aria-selected="false" id="select_option_171" aria-checked="true" value="58c7ffd5449b7f21ec914700" style="">
          <div class="md-text ng-binding">Andaman and Nicobar Islands</div>
        </md-option><!-- end ngRepeat: state in vm.states | orderBy : 'state' --> 
        <md-option ng-value="state._id" ng-repeat="state in vm.states | orderBy : 'state'" tabindex="0" class="ng-scope md-ink-ripple" role="option" aria-selected="false" id="select_option_172" aria-checked="true" value="58c7ffd5449b7f21ec914701" style="">
          <div class="md-text ng-binding">Andhra Pradesh</div>
        </md-option><!-- end ngRepeat: state in vm.states | orderBy : 'state' -->

        //etc...

      </md-content>
    </md-select-menu>
  </div>
</md-select>

以下是我尝试使用量角器进行编码的方法:

browser.findElement(by.model('vm.companyProfile.rgst_address.state')).click();
    browser.driver.sleep(5000);
    browser.findElements(by.repeater('state in vm.states')).then(function (item1) {
        item1[2].click();
        });

3 个答案:

答案 0 :(得分:0)

我认为您的情况不需要by.repeater,因为您不想对所有列出的元素执行某些操作,并且您没有返回的复杂对象(仅列表值) )。因此,您可能只想从生成的列表中选择一个特定元素(并且您不需要所有重复值的完整集合)。

因此,为了向我选择您的选项,听起来您可以使用选择器cssContainingText()。 (注意:如果您总是想要选择第三个值,或者如果您想要计算值的数量,那么by.repeater是合适的。{/ p>

至于您的错误:element not visible表示您的下拉菜单选项可能尚未打开(因此您要选择的选项不可见)。

因此,您可能需要首先点击下拉字段才能打开下拉选项(就像您真实用户一样)

所有这一切都是这样的:

//open dropdown selection
element(by.model('vm.companyProfile.rgst_address.state')).click();
//select dropdown value
element(by.cssContainingText('md-option[ng-value="state._id"] div', 'optionYouWantToSelect').click();

//as bonus the use with by.repeater - always select 2nd value
element(by.repeater('state in vm.states').row(1)).click();

答案 1 :(得分:0)

您也可以使用单行命令

元素(by.xpath('* // [@ id =“select_39”] // md-option [contains(text(),“Andaman and Nicobar Islands”)]'));

注意:每次更改div时,xpath都会有所不同。但由于id保持不变,我认为这将是稳定的。

答案 2 :(得分:0)

import { element, by } from 'protractor';

var dropdown = element(by.model('vm.companyProfile.rgst_address.state'));
var dropdownItems = element.all(by.repeater("state in vm.states | orderBy : 'state'"));

dropdown.click().then(() => {
    dropdownItems.get(1).click();
});