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&lt;WebElement&gt;

【讨论】:

此时,该项目严重依赖许多其他辅助类/方法。【参考方案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 Webdriver 在子元素中查找元素

如何在 selenium 2 WebDriver 中查找当前使用的窗口是最大化还是最小化?

Selenium WebDriver C#通过href路径查找元素

如何在 java 中使用 selenium webdriver 查找特定的表元素?