我有这个xpath://*[@id="someId::button"]
按下它会显示一个值的下拉列表。
现在,我知道列表中的所有元素都有这样的id:
//*[@id="someId--popup::popupItemINDEX"]
,其中INDEX是从1到任意数量的数字。
我也知道必须点击的价值。
一个问题是:由于我将始终知道生成下拉列表的按钮的ID,我是否可以使用可重复使用的方法获取下拉列表中的所有元素? (我需要与多个下拉列表进行交互)
我想到的方式是: 获取初始ID的根,如:
//*[@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。
我想知道这是否有效,如果有更简单的方法,我会提供初步信息。
编辑:我建议的方式有效,但为了更简单的解决方案,应该看到接受的答案
答案 0 :(得分:12)
根据经验,如果可能,尝试通过一个查询选择更多元素。逐个搜索许多元素会变得非常慢。
如果我理解你的需求,那么这样做的好方法就是使用
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”的元素。然后,您可以遍历列表并查找所需的元素。
您是否知道可以通过findElement()
致电WebElement
来搜索它的孩子?
- driver.findElement(By.id("someId")).findElements(By.className("clickable"))
如果不查看基础HTML,我想我无法提供最好的方法,但我脑子里有一些。
答案 1 :(得分:3)
您是否尝试过使用JavascriptExecutor?
如果您愿意编写一些JavaScript,那么这将比在java中简单明了(我认为)
您需要做的就是通过DOM子树进行一些JavaScript抓取,并返回符合条件的DOM元素列表。然后,WebDriver会愉快地将其编组为java世界中的List<WebElement>
。
答案 2 :(得分:1)
此处使用的更安全方法是
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){}
}
请让我知道上面的基础是否有效。