【问题标题】:While using Md-select ,How to drop down list in protractor?使用 Md-select 时,如何在量角器中下拉列表?
【发布时间】:2018-12-27 13:22:14
【问题描述】:

我正在尝试从下拉列表中选择一个选项,但找不到定位器,我尝试了很多不同的方法,但没有帮助。

<md-select ng-model="card.type" name="type" aria-label="Select card type" ng-change="$ctrl.onCardSelectionChange(card);$ctrl.onChange(true)" cmtr-no-multiple-bahn-cards="" required="" class="ng-pristine ng-empty ng-invalid ng-invalid-required ng-valid-cmtr-no-multiple-bahn-cards ng-touched" tabindex="0" aria-disabled="false" role="listbox" aria-expanded="false" aria-multiselectable="false" id="select_2162" aria-invalid="true" aria-required="true" aria-owns="select_container_2163" style=""><md-select-value class="md-select-value md-select-placeholder" id="select_value_label_2161"><span>Type</span><span class="md-select-icon" aria-hidden="true"></span></md-select-value></md-select>
<div class="md-select-menu-container md-active md-clickable" aria-hidden="false" role="presentation" id="select_container_2163" style="display: block; left: 52px; top: 137px; min-width: 295.797px; font-size: 16px;"><md-select-menu role="presentation" class="_md" style="transform-origin: 147.898px 8px 0px;"><md-content class="_md">
          <!----><md-option ng-repeat="loyaltyCard in ::$ctrl.loyaltyCards" ng-value="::loyaltyCard.value" tabindex="0" class="md-ink-ripple" role="option" aria-selected="false" id="select_option_2166" aria-checked="true" value="blue_biz"><div class="md-text">
            Blue Biz (AF/KL)
          </div></md-option><!----><md-option ng-repeat="loyaltyCard in ::$ctrl.loyaltyCards" ng-value="::loyaltyCard.value" tabindex="0" class="md-ink-ripple" role="option" aria-selected="false" id="select_option_2167" aria-checked="true" value="partner_plus_benefit_lh"><div class="md-text">
            Partner Plus Benefit (LH)
          </div></md-option><!----><md-option ng-repeat="loyaltyCard in ::$ctrl.loyaltyCards" ng-value="::loyaltyCard.value" tabindex="0" class="md-ink-ripple" role="option" aria-selected="false" id="select_option_2168" aria-checked="true" value="onbusiness_ba_aa_ib"><div class="md-text">
            OnBusiness (BA/AA/IB)
          </div></md-option><!----><md-option ng-repeat="loyaltyCard in ::$ctrl.loyaltyCards" ng-value="::loyaltyCard.value" tabindex="0" class="md-ink-ripple" role="option" aria-selected="false" id="select_option_2169" aria-checked="true" value="SK"><div class="md-text">
            SAS Credit (SK)
          </div></md-option><!----><md-option ng-repeat="loyaltyCard in ::$ctrl.loyaltyCards" ng-value="::loyaltyCard.value" tabindex="0" class="md-ink-ripple" role="option" aria-selected="false" id="select_option_2170" aria-checked="true" value="AY"><div class="md-text">
            Finnair Plus (AY)
          </div></md-option><!----><md-option ng-repeat="loyaltyCard in ::$ctrl.loyaltyCards" ng-value="::loyaltyCard.value" tabindex="0" class="md-ink-ripple" role="option" aria-selected="false" id="select_option_2171" aria-checked="true" value="DY"><div class="md-text">
            Norwegian Reward (DY)
          </div></md-option><!----><md-option ng-repeat="loyaltyCard in ::$ctrl.loyaltyCards" ng-value="::loyaltyCard.value" tabindex="0" class="md-ink-ripple" role="option" aria-selected="false" id="select_option_2172" aria-checked="true" value="D8"><div class="md-text">
            Norwegian Reward (D8)
          </div></md-option><!----><md-option ng-repeat="loyaltyCard in ::$ctrl.loyaltyCards" ng-value="::loyaltyCard.value" tabindex="0" class="md-ink-ripple" role="option" aria-selected="false" id="select_option_2173" aria-checked="true" value="EK"><div class="md-text">
            Skywards (EK)
          </div></md-option><!----><md-option ng-repeat="loyaltyCard in ::$ctrl.loyaltyCards" ng-value="::loyaltyCard.value" tabindex="0" class="md-ink-ripple" role="option" aria-selected="false" id="select_option_2174" aria-checked="true" value="TP"><div class="md-text">
            Air Portugal (TAP)
          </div></md-option><!---->
        </md-content></md-select-menu></div>
element( by.css('.md-select-menu-container md-option[value="blue_biz"]')).click();

【问题讨论】:

  • "...我尝试了很多不同的方法..."。给他们看

标签: javascript angularjs selenium protractor


【解决方案1】:

您可以尝试使用by.cssContainingText(),如下所示:

element(by.css('.md-select-menu-container md-select-menu md-content md-option')).element(by.cssContainingText('.md-text', 'Blue Biz (AF/KL)')).click();

此代码选择值为“Blue Biz (AF/KL)”的选项

如果上面的代码不起作用,请尝试以下代码:

function clickOption(searchText) {
    let wrapper = element(by.css('.md-select-menu-container'));
    let selectMenu = wrapper.element(by.css('md-select-menu'));
    let mdContent = selectMenu.element(by.css('md-content'));
    let options = mdContent.all(by.css('md-option'));
    return options.filter(el => {
      return el.element(by.css('.md-text')).getText().then(text => text.trim() === searchText);
    }).first().click();
  }

// ...
clickOption('Blue Biz (AF/KL)');

在这段代码中,所有的选择器都是分开和链接的。像这样,您可以确定实际上找不到哪个选择器。也许它已经是第一个了。除此之外,此函数实际上返回匹配的md-option 元素。也许是不可能click()底层的div

【讨论】:

  • 它没有找到元素,太奇怪了((
  • @nikhil 我更新了我的答案。我注意到选择器中缺少一些标签。这个选择器现在应该可以工作,否则我也会感到困惑。除此之外,第一个选择器在我之前的回答中是错误的。是 md-select-menu-container 而不是 .md-select-menu-container,我忘记了 . 的类名。
  • 我之前也尝试过,我的朋友 :),现在我摸不着头脑
  • clickOption(searchText: string) ,当前 javascript 中不支持的类型,出现错误 SyntaxError: Unexpected token : at createScript (vm.js:80:10) at Object.runInThisContext (vm.js:139 :10) 在 Module._compile (module.js:616:28) 在 Object.Module._extensions..js (module.js:663:10) 在 Module.load (module.js:565:32) 在 tryModuleLoad ( module.js:505:12) 在 Function.Module._load (module.js:497:3) 在 Module.require (module.js:596:17) 在 require (internal/module.js:11:18) 思考使用 xy 坐标点击元素,我不喜欢
  • 好吧,我再次为javascript调整了答案:)
【解决方案2】:

这个下拉菜单是使用 divs and spans 制作的,所以 select 类在这种情况下不起作用。

您必须使用列表存储下拉菜单中存在的每个元素,然后您可以通过所需的文本选择它。类似的东西:

 List<WebElement> allValues =   driver.findElements(By.cssSelector("div.md-text"));
     for(WebElement values : allValues) {
         if(values.getText().trim().contains("SAS Credit (SK)")) {
             values.click();
         }   
     }

【讨论】:

  • 这看起来不像是 JavaScript + Protractor 语法
  • @Andersson : 是的 andersson ,它不在 JS 中,虽然它在 JAVA 中。
  • 不幸的是,它根本不起作用,NoSuchElementError: No element found using locator: By(css selector, md-select-menu-container)
  • @nikhil:嗨! By(css selector, md-select-menu-container) 不是我提供的。您可以尝试使用我在问题中提供的 css 选择器。该代码在 java 中,我对 JS 不太确定。让我知道这是否有帮助。
【解决方案3】:

这将在下拉列表中选择文本“SAS Credit (SK)”,您可以根据您的 DOM 替换值:

element(by.id("select_container_2163")).element(by.css("[value='SK']")).click();

【讨论】:

    【解决方案4】:

    我终于可以点击下拉菜单了))

       var dropdown = element(by.model('card.type'));
          var dropdownItems = element.all(by.repeater("loyaltyCard in ::$ctrl.loyaltyCards"));
    
          dropdown.click().then(() => {
              dropdownItems.get(2).click();
          });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多