通过xpath Selenium java选择具有动态生成ID的WebElements

通过xpath Selenium java选择具有动态生成ID的WebElements,java,selenium,xpath,selenium-chromedriver,selenium-firefoxdriver,Java,Selenium,Xpath,Selenium Chromedriver,Selenium Firefoxdriver,我需要在下拉窗口中选择一个元素。每次我打开我正在测试的网站的下拉窗口时,网站都会随机为该下拉窗口生成一个id。使用Firebug可以看到以前的下拉窗口实例,但不可选择。有一个静态路径,但它只在我使用ChromeDriver测试它时有效,而在我使用FirefoxDriver时无效。按类名定位动态生成的元素下拉窗口的每个实例在我第一次尝试时都使用相同的类,但在使用ChromeDriver和FirefoxDriver之后每次都会出错。我认为它可能试图定位第一个实例,但不是可选择的实例 以下是我的动态代

我需要在下拉窗口中选择一个元素。每次我打开我正在测试的网站的下拉窗口时,网站都会随机为该下拉窗口生成一个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>
尝试以下方法:

获取所有元素

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();

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

如下:每次我打开我正在测试的站点中的下拉窗口时,该站点都会随机为该下拉窗口生成一个id。使用Firebug可以看到以前的下拉窗口实例,但不可选择。听起来很糟糕。这听起来像是一个非常糟糕的应用程序错误,可能会导致性能问题。创建一个对象的新实例而不在每次单击某个对象时删除旧实例,这显然是不好的。您是否能够修复此问题,或者您是否仍坚持按原样执行?这是一个非常麻烦的执行,是的,我现在仍坚持执行。关闭iframe时,它会删除旧实例。显而易见的解决方案是在需要使用下拉列表的每个测试之间关闭iframe。不幸的是,非常不幸的是,该iframe中的所有下拉列表都具有相同的类名,因此当我使用xpath的动态版本时,任何需要多个下拉列表的测试都会失败。是的,我也受不了了。谢谢!我不能使用IWebElements,但我将driver.findElements强制转换为一个有效的ArrayList。对于java,可以使用List=driver.findElementsBy;//记住导入java.util