Selenium webdriver: поиск всех элементов с похожим идентификатором

У меня есть этот xpath: //*[@id="someId::button"]

При нажатии на него отображается выпадающий список значений.

Теперь я знаю, что все элементы в списке имеют такой идентификатор:

//*[@id="someId--popup::popupItemINDEX"]

где INDEX - это число от 1 до любого количества параметров.

Я также знаю значение, которое я должен щелкнуть.

Один вопрос будет: поскольку я всегда буду знать идентификатор кнопки, которая генерирует раскрывающийся список, могу ли я получить все элементы в раскрывающемся списке с помощью метода повторно использовать? (Мне нужно взаимодействовать с более чем одним выпадающим списком)

Как я думал об этом: получить корень исходного идентификатора, как в:

//*[@id="someId 

затем добавьте остальные: --popup::popupItem. Мне также нужно добавить индекс, и я подумал, что могу использовать блок try (чтобы получить хотя исключения, когда я даю более ожидаемый индекс):

 for(int index=1;index<someBiggerThanExpectedNumber;index++){
     try{
         WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]"));
         if(aux.getText().equals(myDesiredValue))
             aux.click();
     }catch(Exception e){}
 }

Обратите внимание, что я использую webdriver api и java.

Я хотел бы знать, будет ли это работать, и если есть более простой способ сделать это, учитывая исходную информацию, которую я имею.

EDIT: способ, которым я предлагал работать, но для более простого решения должен быть рассмотрен принятый ответ

Ответ 1

Как правило, попробуйте выбрать больше элементов по одному запросу, если это возможно. Поиск нескольких элементов один за другим будет серьезно замедляться.

Если я хорошо понимаю ваши потребности, хорошим способом сделать это будет использование

driver.findElement(By.id("someId::button")).click();
driver.findElement(By.xpath("//*[contains(@id, 'someId--popup::popupItem') " +
    "and text()='" + myDesiredValue + "']"))
    .click();

Для получения дополнительной информации о XPath см. спецификацию. На удивление очень хорошо читайте, если вы можете пропустить дерьмо!

Это находит и нажимает на элемент с текстом, равным желаемому значению, которое содержит "someId - popup:: popupItem" в его идентификаторе.

List<WebElement> list = driver.findElements(By.xpath("//*[contains(@id, 'someId--popup::popupItem')]"));

Это находит все только все элементы, содержащие "someId - popup:: popupItem" в их идентификаторе. Затем вы можете перемещаться по списку и искать нужный элемент.

Знаете ли вы, что можете вызвать findElement() на WebElement для поиска именно его детей?  - driver.findElement(By.id("someId")).findElements(By.className("clickable"))

Без взгляда на базовый HTML, я думаю, я не могу предложить лучший подход, но у меня есть некоторые в моей голове.

Ответ 2

Вы пытались использовать JavascriptExecutor?

Если вы хотите написать немного JavaScript, тогда это будет просто, чем в java (я думаю)

Все, что вам нужно сделать, это выполнить сканирование JavaScript через поддерево DOM и вернуть список элементов DOM, соответствующих вашим критериям. Затем WebDriver с радостью выделит это как List<WebElement> в Java-мире.

Ответ 3

Более безопасный метод для использования здесь

int size=driver.findElements(By.xpath("//*[@id='someId::button']")).size();

Start using Index Now

String builtString="//*[@id='someId::button'][";

for(int index=1;index<=size();index++)
{

try
{

   WebElement aux= driver.findElement(By.xpath(builtString+index+"\"]"));

   if(aux.getText().equals(myDesiredValue))
             aux.click();

}
catch(Exception e){}

}

Пожалуйста, дайте мне знать, что вышеупомянутый фунт работает или нет.