使用 Selenium Webdriver 从 <md-select> 标签中选择一个值

Dan*_*Dan 5 java selenium xpath angularjs selenium-webdriver

我正在使用 Selenium Webdriver 并致力于在 Chrome 上自动化 AngularJS Web 应用程序。在我点击应用程序上的下拉列表之前,它进行得很顺利。每次我尝试从中选择一个值时,我的测试都会崩溃。我一直在做我的研究,我只看到了 2 个解决方案(我已经尝试过但都不起作用)

  1. 使用Select对象。这不起作用,因为 html 标签不是<select>,它的<md-select>并且这没有通过测试。
  2. 然后我尝试点击下拉元素并点击值 -driver.findElement(By.xpath("xpath to dropdown list")).click();driver.findElement(By.xpath("xpath do dropdown value")).click();

对于示例 2,我还尝试将其创建为WebElement变量并click()单独调用,但这也不起作用。

关于如何解决这个问题的任何想法?

更新

下拉列表的 HTML

<div ng-switch-when="dropdown" class="ng-scope">
    <zf-form-dropdown>
        <div class="dropdown">
            <div layout="row">
                <div flex="50" class="quote-label">
                    <p ng-bind-html="::label" class="ng-binding">Title</p>
                </div>
                <div ng-show="false" flex="10" class="tooltip-icon ng-hide" ng-click="showToolTip(field.get('toolTip'))" role="button" tabindex="0" aria-hidden="true"><img src="img/item-question@2x.png"></div>

                <md-select flex="" ng-disabled="quote.isRated() || !input.enabled" ng-change="onDropdownChange()" ng-model="input.value" class="ng-valid md-default-theme ng-touched ng-dirty" role="combobox" id="select_0Q9" aria-haspopup="true" aria-expanded="false" aria-labelledby="select_label_0I1" tabindex="0" aria-disabled="false" aria-invalid="false" aria-owns="select_menu_0Q8"><md-select-label class="md-select-label md-placeholder" id="select_label_0I1"><span></span><span class="md-select-icon" aria-hidden="true"></span></md-select-label></md-select>
            </div>
        </div>
    </zf-form-dropdown>
</div>
Run Code Online (Sandbox Code Playgroud)

我要选择的值的 HTML

<md-option ng-value="::item.val" ng-selected="item.checked" ng-repeat="item in getOpts()" tabindex="0" class="ng-scope" role="option" aria-selected="false" id="select_option_0QD" value="MR">
    <div class="md-text ng-binding">Mr</div>
    <div class="md-ripple-container"></div>
</md-option>
Run Code Online (Sandbox Code Playgroud)

下拉列表//*[@id="select_0Q9"] 的 xpath 是下拉值的 xpath 是//*[@id="select_option_0QD"]

Shu*_*ain 2

如果您确定您的 Xpath 没问题,那么您也可以使用 javascriptexecutor 单击,如下所示尝试一下:-

WebElement element= driver.findElement(By.xpath("//md-option[@id='select_option_0QD']/div[1]"));

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);
Run Code Online (Sandbox Code Playgroud)

请根据您的方便随意在上面的代码中找到该元素。

根据我的说法,你的下拉菜单的 xpath 应该如下所示:-

//md-option[@id='select_option_0QD']
Run Code Online (Sandbox Code Playgroud)

我想单击的第一个 div 的 xpath 是:-

//md-option[@id='select_option_0QD']/div[1]
Run Code Online (Sandbox Code Playgroud)

如果您想要第二个值,请将 [1] 更改为 [2]。

另一方面,您还可以将所有元素存储在列表中(正如您所知,您不能使用选择),然后根据您的需要或全部单击它们。

为此,您需要使用 xpath,例如:-

//md-option[@id='select_option_0QD']/div
Run Code Online (Sandbox Code Playgroud)

现在将其实现为代码:-

List<WebElement> allelemts = driver.findElements(By.xpath("//md-option[@id='select_option_0QD']/div"));
  for(WebElement ele: allelemts){

    driver.findElement(By.xpath("//md-option[@id='select_option_0QD']")).click();

    JavascriptExecutor executor = (JavascriptExecutor) driver;
    executor.executeScript("arguments[0].click();", ele);

  }
Run Code Online (Sandbox Code Playgroud)

希望它能帮助你:)