Selenium - 使用 CSS 定位器查找精确的文本匹配

软件测试 css 选择器
2022-01-13 12:28:48

根据A way to match on text using CSS locators,我们应该能够"^$"使用 CSS locators 找到精确的文本匹配。

但是有:

<div class="item"><div class="text">Trouble</div> 

以下两个(没有 xpath 和 css "^$")可以找到该元素:

css=div.item > div.text:contains("Trouble")
//div[@class='item']/div[@class='text' and text() ="Trouble"]

然而,这个(带"^$")不能:css=div.item > div.text:contains("^Trouble$")

我错过了什么吗?

2个回答

从排版的角度来看,以下三种情况是绝对相等的:

<div>123</div>

<div>
123</div>

<div>
123
</div>

而从 DOM 的角度来看,是有区别的。第一个的内部文本div是“123”,第二个是“\n123”,第三个是“\n123\n”(\n代表换行符转义序列)。我不知道其中哪一个是你的,但无论哪种情况,你都应该尝试处理所有这些。

您使用的正则表达式只适用于第一个,而它不会同时匹配第二个和第三个。解决方案是处理字符串开头和结尾的空格。

考虑使用^\s*Trouble\s*$代替^Trouble$, 来处理这些情况:

css=div.item > div.text:contains("^\s*Trouble\s*$")

基本上你不能在纯 CSS 中。如果您不相信我,请查看以下规格:

http://www.w3.org/TR/selectors/

但是,您可以使用sizzle

不幸的是,Selenium 没有By.sizzle定位器类,但是如果浏览器不支持 CSS3(只是为了让事情变得复杂),它在某些情况下会退回到嘶嘶声,因此有时嘶嘶声命令可能会在某些浏览器中起作用。

对于定位器中的精确文本匹配,您最简单的选择是切换到 XPath:

//div[contains(@class, 'item']/div[.='Trouble']