Selenium webdriver:查找具有相似id的所有元素

Cos*_*inO 11 java selenium xpath webdriver

我有这个xpath: //*[@id="someId::button"]

按下它会显示值的下拉列表.

现在,我知道列表中的所有元素都有这样的id:

//*[@id="someId--popup::popupItemINDEX"]
Run Code Online (Sandbox Code Playgroud)

,其中INDEX是从1到任意数量的数字.

我也知道我必须点击的价值.

一个问题是:因为我将始终知道生成下拉列表的按钮的ID,我可以使用可重用的方法获取下拉列表中的所有元素吗?(我需要与多个下拉列表进行交互)

我想到的方式是:获取初始ID的根,如:

//*[@id="someId 
Run Code Online (Sandbox Code Playgroud)

然后加上其余的:--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){}
 }
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的是webdriver api和java.

我想知道这是否有效,如果有更简单的方法,我可以获得初步信息.

编辑:我建议的方式有效,但为了更容易的解决方案,应该看到接受的答案

Pet*_*ček 12

根据经验,如果可能,尝试通过一个查询选择更多元素.逐个搜索许多元素将变得非常缓慢.

如果我很了解您的需求,那么这样做的好方法就是使用

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

有关XPath的更多信息,请参阅规范.如果你可以跳过废话,这是一个非常好的阅读!

找到并单击一个文本等于您所需值的元素,其ID包含"someId - popup :: popupItem".

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

它找到了所有在其ID中包含"someId - popup :: popupItem"的元素.然后,您可以遍历列表并查找所需的元素.

你知道你可以叫findElement()WebElement搜索只是它的孩子吗?-driver.findElement(By.id("someId")).findElements(By.className("clickable"))

如果不深入了解底层HTML,我想我无法提供最好的方法,但我有一些想法.