我正在使用Selenium web驱动程序3.0,并希望从打开的两个对话框中单击活动对话框中的“确定”按钮(一个在后台,第二个在前台)。如何从html下面的父div中单击前景对话框确定按钮?我尝试使用nth-child和nth-of-type但是click总是找到第一个在后台显示的对话框,而web驱动程序无法单击OK按钮。
当我检查we.isDisplayed()然后它也找到第一个OK按钮,我想要we.isDisplayed()的方法用于第二个对话框OK按钮。
<div id="z_shell" class="DwtShell">
<div id="Dialog1" class="DwtDialog">
<td id="ErrorDialog_button1_title" class="ZWidgetTitle">OK</td>
<td id="ErrorDialog_button2_title" class="ZWidgetTitle">Cancel</td>
</div>
<div id="Dialog2" class="DwtDialog">
<td id="ErrorDialog_button2_title" class="ZWidgetTitle">OK</td>
</div>
</div>
注意:Dialog div id可以是任何内容,但类名是固定的:DwtDialog。
试过的代码:
WebDriver webDriver;
WebElement we = webDriver.findElement(By.cssSelector("div[class='DwtDialog']:nth-child(2) td[id$='_button2_title']:contains('OK')"));
visible = we.click();
// Click fails here
尝试定位器:
By.cssSelector("div[class='DwtDialog']:nth-child(2) td[id$='_button2_title']:contains('OK')")
By.xpath("//div[@class='DwtDialog'][2]//td[@id='ErrorDialog_button2_title' and contains(text(), 'OK')]")
By.xpath("//div[@id='z_shell']//div[@class='DwtDialog'][2]//td[@id='ErrorDialog_button2_title' and contains(text(), 'OK')]")
如何单击可见的对话框的确定按钮?大多数情况下,此对话框稍后加载。我的意思是nth-child(2)
和第三个对话nth-child(3)
作为暗示。
编辑:我错过了关于id变化的评论......试试#2。我认为这样的事情应该有效但我没有页面就无法测试。基本上我们抓住对话框td.ZWidgetTitle
上的所有按钮div.DwtDialog
。如果它可见并包含“确定”,请单击它。
List<WebElement> dialogButtons = driver.findElements(By.cssSelector("div.DwtDialog > td.ZWidgetTitle"));
for (WebElement dialogButton : dialogButtons)
{
if (dialogButton.isDisplayed() && dialogButton.getText().equals("OK"))
{
dialogButton.click();
break;
}
}
编辑2:
获得更多信息后,这是另一种方法。很难弄清楚这些东西是否可以在没有访问网站的情况下工作,但如果它不起作用,这将有希望指向正确的方向。这将获得错误对话框上的所有OK按钮。问题是,哪一个是可点击的?我们可以吃掉当另一个元素接收到点击时抛出的异常,直到找到一个不抛出的元素......这是正确的。我做了一些本地测试,这段代码似乎对我有用。
List<WebElement> dialogButtons = driver.findElements(By.xpath("//td[starts-with(@id, 'ErrorDialog_button') and text()='OK']"));
System.out.println(dialogButtons.size());
System.out.println(dialogButtons.size());
for (WebElement dialogButton : dialogButtons)
{
try
{
dialogButton.click();
}
catch (WebDriverException e)
{
// do nothing
}
}