【问题标题】:Selecting WebElements with dynamically generated ids by xpath Selenium java通过xpath Selenium java选择具有动态生成的ID的WebElements
【发布时间】:2014-10-05 19:08:09
【问题描述】:

我需要在下拉窗口中选择一个元素。每次我在我正在测试的网站中打开下拉窗口时,网站都会为该下拉窗口随机生成一个 id。下拉窗口的先前实例可见(使用 Firebug)但不可选择。有一个静态路径,但它仅在我使用 ChromeDriver 测试时有效,而不是在我使用 FirefoxDriver 时有效。按类名定位动态生成的元素(下拉窗口的每个实例都具有相同的类)在我第一次尝试时有效,但之后每次使用 ChromeDriver 和 FirefoxDriver 时都会出错。我认为它可能正在尝试定位第一个实例,而不是可选择的实例。

这是我的动态代码:

driver.findElement(By.xpath("//div[@class='really long name for drop down menu']/ul/li[2]")).click();

这是我的静态代码:

driver.findElement(By.xpath("//option[normalize-space(.)='Text']")).click();

这是动态 HTML:

<html class="FakeName1" style="">
    <body style="margin: 0px; background-color: rgb(219, 230, 244);">
        <form id="Form1" action="MenuSelector.aspx?Ihopethisstuffisnotimportant" method="post">
        <div id="Menu1384921" class="really long name for drop down menu" style="overflow-y: auto; width: 438px; height: 320px; position: absolute; visibility: hidden; left: 165px; top: 88px; display: none;">
        <div id="Menu1092875" class="really long name for drop down menu" style="overflow-y: auto; width: 438px; height: 320px; position: absolute; visibility: visible; left: 165px; top: 88px;">
            <ul>
                <li unselectable="on"></li>
                <li unselectable="on">Text</li>
            </ul>
        </div>
    </body>
</html>

这是静态 HTML:

<div id="ThingList" style="width:100%;">
    <table id="Table1" style="margin: 0px; padding: 0px; width: 100%; border-spacing: 4px;">
        <tbody>
            <tr>
                <td align="right" style="width: 20%; font-size: 9pt;">Select a Thing: </td>
                <td>
                    <select id="bThings" class="bInput" style="width: 436px;" onchange="javascript:setTimeout('__doPostBack(\'bThings\',\'\')', 0)" name="bThings">
                        <option value=""></option>
                        <option value="2">Text</option>
                    </select>
                </td>
            </tr>
        </tbody>
    </table>
</div>

【问题讨论】:

  • 以下内容:“每次我在我正在测试的站点中打开下拉窗口时,网站都会为该下拉窗口随机生成一个 id。下拉窗口的先前实例是可见的(使用 Firebug)但是不可选择。”听起来很可怕。这听起来像是一个非常糟糕的应用程序错误,也可能导致性能问题。每次单击某个对象时都创建一个对象的新实例而不删除旧的实例是非常糟糕的。您是否能够解决此问题,还是按原样执行?
  • 这是一个非常麻烦的实现,是的,我现在坚持使用它。当您关闭 iframe 时,它​​会删除旧实例。显而易见的解决方案是在需要使用下拉菜单的每个测试之间关闭 iframe。不幸的是(非常不幸),该 iframe 中的所有下拉列表都具有相同的类名,因此当我使用动态版本的 xpath 时,任何需要多个下拉列表的测试都会失败。是的,我也坚持这一点。

标签: java selenium xpath selenium-chromedriver selenium-firefoxdriver


【解决方案1】:

试试这个方法:

获取所有元素。

java.util.List<WebElement> elements = driver.findElements(By.xpath("//div[@class='really long name for drop down menu']/ul/li[2]"));
elements[elements.count - 1].click();

这应该点击该特定类的最后一个元素。

【讨论】:

  • 谢谢!我无法使用 IWebElements,但我将 driver.findElements 转换为有效的 ArrayList。
  • 此代码用于 c#。对于java,您可以使用 List = driver.findElements(By); // 记得导入 java.util
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2022-01-14
  • 2013-02-10
相关资源
最近更新 更多