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){}
}
Пожалуйста, дайте мне знать, что вышеупомянутый фунт работает или нет.