我正在使用Selenium Webdriver并致力于在Chrome上自动化AngularJS Web App。在我点击应用程序的下拉列表之前,它一直很顺利。 每当我尝试从中选择一个值时,我的测试就会一直崩溃。我一直在研究这个问题,我只看到了两个解决方案(我已经尝试了但都没有工作)
Select
对象。这不起作用,因为html标记不是<select>
,而是<md-select>
,这样就无法通过测试。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>
我想要选择的值的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>
下拉列表的xpath为//*[@id="select_0Q9"]
下拉值的xpath为//*[@id="select_option_0QD"]
答案 0 :(得分: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);
请随意根据您的方便在上面的代码中找到元素。
按照我的说法,下拉列表的xpath应如下所示: -
//md-option[@id='select_option_0QD']
我想要点击的第一个div的xpath是: -
//md-option[@id='select_option_0QD']/div[1]
如果您想要第二个值,请将[1]更改为[2]。
在另一个方面,您还可以将所有元素存储在列表中(如您所知,您可以使用select)并根据需要或全部点击它们。
为此您需要使用xpath,如: -
//md-option[@id='select_option_0QD']/div
现在将其实现为代码: -
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);
}
希望它会对你有所帮助:)。
答案 1 :(得分:1)
由于您收到NoSuchElementException
例外,我认为问题在于Selenium无法识别该元素。尝试以下任何wait
方法,然后尝试单击该元素。
明确等待(最受欢迎)
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementID")));
或
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementID")));
隐含等待
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
睡眠:(除非绝对必要,否则尽量避免这种情况)
Thread.sleep(1000);
编辑:添加了使用findElements
方法检查元素存在的代码。
在使用这些wait
方法之前,您还可以使用findElements
方法检查元素是否存在。
List<WebElement> element = driver.findElements(By.id("elementId"));
if (element.size() == 0) {
System.out.println("Element not found");
} else{
System.out.println("Element found");
}
答案 2 :(得分:1)
我终于解决了这个问题!
我得到了Selenium IDE并记录了一个会话,我选择下拉菜单并选择我的值。然后我将该文件导出为java测试用例,并且能够读取选择值的行,它们是;
driver.findElement(By.cssSelector("#select_08D > #select_label_005 > span.md-select-icon")).click();
driver.findElement(By.id("select_option_08H")).click();
首先,他们都不使用xpath
来查找元素,使用cssSelector
找到下拉菜单本身,id
找到值。
我只是再次交叉引用,id
的值为select_option_08H
,但在查看Google控制台时,我看到id
的值为select_option_189
}