如何在 selenium findElements() 方法中为任何选择器使用 OR 条件?

Posted

技术标签:

【中文标题】如何在 selenium findElements() 方法中为任何选择器使用 OR 条件?【英文标题】:How to use OR Condition in selenium findElements() method for any selector? 【发布时间】:2011-07-18 17:54:29 【问题描述】:

我想获取所有类名为“act”或“dact”的 WebElement 信息

我正在使用下面的代码行来获取“act”的所有类信息。谁能帮我在类名中使用 OR 条件?

List<WebElement> nL2 = driver.findElements(By.className("act"));

类似的东西;这样我就不必为每个类写两行了。

//this is not working

List<WebElement> nL2 = driver.findElements(By.className("act | dact"));

谢谢!

【问题讨论】:

这不是 XPath。这是 XPath //WebElement[@class[contains(concat(' ',.,' '),' act ') or contains(concat(' ',.,' '),' dact ')]] @Alejandro,我的错。修改了我的问题。实际上我想使用任何选择器在fineElements() 方法中使用OR 条件。 【参考方案1】:

我知道这个问题很老了,但可能最简单的方法是使用 CSS 选择器,例如

driver.findElements(By.cssSelector(".act, .dact"));

您应该更喜欢 CSS 选择器而不是 XPath,因为浏览器支持更好,而且它们的性能更高(而且我认为它们更容易学习/理解)。 CSS 选择器可以做任何事情 By.className() 可以做的还有很多。它们非常强大且非常有用。

一些 CSS 选择器参考可帮助您入门。

W3C CSS Selector Reference

Sauce Labs CSS Selector Tips

【讨论】:

这是迄今为止最优秀的解决方案。【参考方案2】:

你能把这两个列表结合起来吗?

List<WebElement> act = driver.findElements(By.className("act"));
List<WebElement> dact = driver.findElements(By.className("dact"));
List<WebElement> all = new ArrayList<WebElement>();
all.addAll(act);
all.addAll(dact);

或者,您可以按照@Alejandro 的建议使用 xpath 定位器

List<WebElement> all = driver.findElements(By.xpath("//*[@class='act' or @class='dact']"));

【讨论】:

谢谢戴夫,我不想这样做。 我们也可以使用By.className("X or Y");还是这个OR条件只适用于XPath? className 采用单个类名。 有没有其他像 XPath 这样接受多个的方法?? +1 用于条件 xpath。在我的例子中,这是进行一般测试的最佳方式,因为我们的网站有多个版本的同一页面/按钮,它们执行相同的操作。

以上是关于如何在 selenium findElements() 方法中为任何选择器使用 OR 条件?的主要内容,如果未能解决你的问题,请参考以下文章

在 Selenium 中的许多 findElement(s)/By 函数中,您啥时候会使用其中一个?

Java+Selenium——findElements举例

selenium IDE 如何定位页面变动元素

selenium 如何缩小范围后在定位元素比如缩小到某一个div,在定位

Selenium FindElement 阻塞,直到文件上传完成

Selenium WebDriver findElement(By.xpath())不适合我