Выбор WebElements с динамически генерируемыми идентификаторами с помощью xpath Selenium java

Мне нужно выбрать элемент в раскрывающемся окне. Каждый раз, когда я открываю раскрывающееся окно на тестируемом сайте, веб-сайт случайным образом генерирует идентификатор для этого раскрывающегося окна. Предыдущие экземпляры выпадающего окна видны (с помощью 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>

person jani    schedule 12.08.2014    source источник
comment
следующее: каждый раз, когда я открываю раскрывающееся окно на тестируемом сайте, веб-сайт случайным образом генерирует идентификатор для этого раскрывающегося окна. Предыдущие экземпляры выпадающего окна видны (с помощью Firebug), но не могут быть выбраны. звучит ужасно. Это звучит как очень серьезная ошибка приложения, которая также может вызвать проблемы с производительностью. Создавать новый экземпляр объекта, не удаляя старый каждый раз, когда что-то щелкают, просто плохо. Вы можете исправить это или вы застряли с реализацией как есть?   -  person mutt    schedule 12.08.2014
comment
Это очень хлопотная реализация, и да, я пока с ней застрял. Он удаляет старые экземпляры, когда вы закрываете iframe. Очевидным решением было бы закрывать iframe между каждым тестом, требующим использования раскрывающегося списка. К сожалению (ОЧЕНЬ К сожалению), все раскрывающиеся списки в этом iframe имеют одно и то же имя класса, поэтому любой тест, требующий более одного раскрывающегося списка, завершается неудачно, когда я использую динамическую версию xpath. Да, я тоже застрял с этим.   -  person jani    schedule 12.08.2014


Ответы (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();

Это должно щелкнуть последний элемент с этим конкретным классом.

person mutt    schedule 12.08.2014
comment
Спасибо! Я не мог использовать IWebElements, но я привел driver.findElements к ArrayList, который сработал. - person jani; 13.08.2014
comment
Этот код для С#. для java вы можете использовать List‹WebElement› = driver.findElements(By); // Не забудьте импортировать java.util - person Nguyen Vu Hoang; 13.08.2014