java - Selenium 网络驱动程序 : finding all elements with similar id

标签 java xpath selenium webdriver

我有这个 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/

相关文章:

java - 我需要 super.super.method() -> 可能的设计缺陷?

Java链表查找和删除方法

sql - 将嵌套 xml 解析为非规范化表

java - TestNG 运行完成后,Intellij 会自动关闭打开的浏览器

java - 处理 JMS 消息时线程 hibernate

java - 如何在eclipselink中访问多个租户?

python - 在 python 中评估 Xpath2.0

python - Selenium xpath all (//*) 不采用每个 css 元素

python - 在Docker Selenium Python中使用代理不起作用

python - 如何从 "Health"元素中提取文本