Selenium webdriver:查找具有相似ID的所有元素
Posted
技术标签:
【中文标题】Selenium webdriver:查找具有相似ID的所有元素【英文标题】:Selenium webdriver: finding all elements with similar id 【发布时间】:2012-05-28 17:10:09 【问题描述】:我有这个 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。
我想知道这是否可行,以及是否有更简单的方法可以做到这一点,鉴于我拥有的初始信息。
编辑:我建议的方式可行,但为了更简单的解决方案,应该看到接受的答案
【问题讨论】:
【参考方案1】:根据经验,如果可能,请尝试通过一个查询选择更多元素。逐个搜索许多元素会变得非常缓慢。
如果我能很好地理解您的需求,那么一个好方法就是使用
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,我想我无法提供最好的方法,但我有一些想法。
【讨论】:
试图查找所有元素是行不通的,因为列表是临时生成的,除了 id 部分,所有其他属性始终具有不同的值,即使值相同。我首先需要按下下拉按钮才能访问/查看元素。感谢您对寻找元素的孩子的意见! 我还是看不出问题所在。点击下拉按钮,然后找到所有显示的元素?//*[contains(@id, 'someId--popup::popupItem') and text()='myDesiredValue']
选择 ID 包含“someId--popup::popupItem”且文本值等于您想要的值的一个元素。 ...当然是在单击下拉按钮之后。
(另外,我编辑了答案,因为 ElementNotVisibleException
部分并不是真正需要的,直到现在我才意识到)
如果我只使用 text() 部分,它可以找到该项目。所以这是迄今为止最简单的方法。此外,我已经设法以两种方式实现它(我最初想做的一种,很混乱,并且使用你的输入)。谢谢您的帮助!我必须接受你的回答,因为它提供了解决方案等等。【参考方案2】:
您是否尝试过使用javascriptExecutor?
如果你愿意写一点 JavaScript,那么这将比在 java 中简单(我认为)
您需要做的就是通过 DOM 子树爬取一些 JavaScript,并返回符合您的条件的 DOM 元素列表。然后,WebDriver 将在 Java 世界中愉快地将其编组为 List<WebElement>
。
【讨论】:
此时,该项目严重依赖许多其他辅助类/方法。【参考方案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)
请让我知道上述基金是否有效。
【讨论】:
在我看来你不理解这个问题。以上是关于Selenium webdriver:查找具有相似ID的所有元素的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 selenium webdriver 查找动态元素?
如何使用Selenium WebDriver查找错误的链接?
如何在 selenium 2 WebDriver 中查找当前使用的窗口是最大化还是最小化?