基于文本或属性中的字符串的硒查找元素

2022-09-03 09:42:05

我试图让Selenium根据可以包含在元素文本或任何属性中的字符串找到一个元素,我想知道是否有一些通配符可以实现来捕获所有这些,而不必使用多条件OR逻辑。我现在使用的是...

driver.findElement(By.xpath("//*[contains(@title,'foobar') or contains(.,'foobar')]"));

我想知道是否有一种方法可以使用通配符而不是特定属性(@title),该属性也像OR条件的第二部分那样封装元素文本。


答案 1

这将提供包含文本的所有元素foobar

driver.findElement(By.xpath("//*[text()[contains(.,'foobar')]]"));

如果你想要完全匹配,

driver.findElement(By.xpath("//*[text() = 'foobar']"));

或者你可以在Selenium中使用JQuery执行Javascript。

这将返回所有包含文本的Web元素,从父级到最后一个子级,因此我正在使用jquery选择器来获取包含此文本的内部节点,但是如果您有多个包含相同文本的节点,这可能并不总是准确的。:last

(WebElement)((JavascriptExecutor)driver).executeScript("return $(\":contains('foobar'):last\").get(0);");

如果您希望与上述内容完全匹配,则需要对结果运行过滤器,

(WebElement)((JavascriptExecutor)driver).executeScript("return $(\":contains('foobar')\").filter(function() {" +
    "return $(this).text().trim() === 'foobar'}).get(0);");

jQuery返回一个元素数组,如果页面上只有一个包含该特定文本的Web元素,您将获得一个包含该元素的数组。我正在做的是获取数组的第一个元素并将其转换为.get(0)WebElement

希望这有帮助。


答案 2

这将返回带有文本的元素foobar

driver.findElement(By.xpath("//*[text()='foobar']"))

推荐