我有这个 xpath://*[@id="someId::button"]
按下它会显示一个值的下拉列表。
现在,我知道列表中的所有元素都有一个这样的 id :
//*[@id="someId--popup::popupItemINDEX"]
,其中 INDEX 是从 1 到任何选项数的数字。
我也知道我必须点击的值。
一个问题是:因为我总是知道生成下拉菜单的按钮的 ID,我能否使用 可重用 方法获取下拉菜单中的所有元素? (我需要与多个下拉菜单进行交互)
我的想法是: 获取初始 ID 的根,如:
//*[@id="someId
然后添加其余部分:--popup::popupItem
。我还需要添加索引,我想我可以像这样使用一个 try block (以便在我给出比预期更大的索引时通过异常):
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。
根据我掌握的初步信息,我想知道这是否可行,以及是否有更简单的方法。
编辑:我建议的方式有效,但为了更简单的解决方案,应该看到接受的答案
最佳答案
根据经验,如果可能,请尝试通过一次查询选择更多元素。逐个搜索许多元素会变得非常慢。
如果我很好地理解您的需求,一个好的方法是使用
driver.findElement(By.id("someId::button")).click();
driver.findElement(By.xpath("//*[contains(@id, 'someId--popup::popupItem') " +
"and text()='" + myDesiredValue + "']"))
.click();
有关 XPath 的更多信息,请参阅 the spec .如果您可以跳过废话,那么这本读物非常好!
这会找到并单击一个文本等于您想要的值的元素,该元素的 ID 中包含“someId--popup::popupItem”。
List<WebElement> list = driver.findElements(By.xpath("//*[contains(@id, 'someId--popup::popupItem')]"));
它只查找 ID 中包含“someId--popup::popupItem”的所有元素。然后您可以遍历列表并查找所需的元素。
您知道您可以在 WebElement
上调用 findElement()
来搜索它的子项吗?
- driver.findElement(By.id("someId")).findElements(By.className("clickable"))
如果不了解底层 HTML,我想我无法提供最佳方法,但我脑子里有一些。
关于java - Selenium 网络驱动程序 : finding all elements with similar id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10698157/