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

use*_*250 12 java selenium selenium-webdriver

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

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

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

LIN*_*NGS 22

这将给出包含文本的所有元素 foobar

driver.findElement(By.xpath("//*[text()[contains(.,'foobar')]]"));
Run Code Online (Sandbox Code Playgroud)

如果你想要完全匹配,

driver.findElement(By.xpath("//*[text() = 'foobar']"));
Run Code Online (Sandbox Code Playgroud)

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

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

(WebElement)((JavascriptExecutor)driver).executeScript("return $(\":contains('foobar'):last\").get(0);");
Run Code Online (Sandbox Code Playgroud)

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

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

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

希望这可以帮助.


小智 5

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

driver.findElement(By.xpath("//*[text()='foobar']"))
Run Code Online (Sandbox Code Playgroud)