【问题标题】:Selenium web driver fails to click to foreground dialog's OK button and finds background dialog's OK buttonSelenium Web 驱动程序无法单击前台对话框的确定​​按钮并找到后台对话框的确定​​按钮
【发布时间】: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


【解决方案1】:

编辑: 我错过了有关 id 更改的评论...尝试 #2。我认为这样的事情应该可以工作,但没有页面我无法测试它。基本上我们在对话框div.DwtDialog 上抓取所有按钮td.ZWidgetTitle。如果它可见并包含“确定”,请单击它。

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:

获得更多信息后,这是另一种方法。很难弄清楚这些东西是否可以在没有访问该站点的情况下工作,但如果它不起作用,这将有望为您指明正确的方向。这将获得错误对话框上的所有确定按钮。问题是,哪一个是可点击的?当另一个元素接收到点击时,我们可以吃掉抛出的异常,直到我们找到一个不抛出的异常......这是正确的。我做了一些本地测试,这段代码似乎对我有用。

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
    }
}

【讨论】:

  • 似乎 div id 的变化如问题注释中所述,如果将使用类,则有可能在需要单击第二个 div 的第一个按钮作为位置时抛出错误在页面中。
  • @lauda 是的,我一开始错过了那个笔记......我刚刚更新了我的答案。
  • 谢谢杰夫,你的回答绝对有帮助,但它给了我 0 个元素。我认为css需要修复。我试过 div.DwtDialog > td#ErrorDialog_button2_title 但这也不起作用。我们有什么遗漏的吗?
  • 您发布的 HTML 是否与原始页面完全相同?您可以链接页面或在 pastebin.com 上发布 HTML 或其他内容吗?
  • 更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 2021-12-29
  • 2022-01-24
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多