【发布时间】:2016-09-25 12:14:31
【问题描述】:
我正在使用 Selenium Web 驱动程序 3.0,并希望从打开的两个对话框(一个在后台,第二个在前台)的活动对话框中单击“确定”按钮。如何从下面的 html 中单击父 div 中的前台对话框 OK 按钮?我尝试使用 nth-child 和 nth-of-type 但单击总是会在后台找到第一个对话框,并且 Web 驱动程序无法单击“确定”按钮。
当我检查 we.isDisplayed() 时,它也找到了第一个 OK 按钮,我想要 we.isDisplayed() 的第二个对话框 OK 按钮的方法。
HTML
<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>
注意:对话框 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) 作为提示。
【问题讨论】:
-
您可以尝试不同的策略 - 依赖对话框的标题或信息消息吗? (这部分HTML在截图上没有展开)
-
感谢评论,任何动态对话都可以来。只有类名是固定的,一个必须是活动的,其余的将在后台。
-
使用内部的 id,例如 tr 和/或内部 div 的 id。
-
这应该足够了,使用 css 像:div#divId[style*='block'] 并添加按钮标识符。对于一个完整的 css 选择器,我需要 html sn-p,复制/粘贴它在
块中的问题中,您可以删除/更改任何私人信息。 -
我看了一下,html太多了,看不到页面有点难,我会尝试更多。你需要做的是在任何一个可以使用的父项中找到一个唯一的属性,例如,如果这些是主要 div,您可以使用 div[role='role=dialog'] 之类的角色并从那里继续。
标签: java selenium xpath selenium-webdriver webdriver