Selenium:如何使用精确文本匹配来定位节点

Abh*_*arg 17 selenium xpath

我想使用文本在网页上找到一个元素.
我知道有一个方法名称包含这样做,例如:

tr[contains(.,'hello')]/td
Run Code Online (Sandbox Code Playgroud)

但问题是如果我有两个元素名称hello和hello1那么这个函数不能正常工作.

是否有任何其他方法,如包含精确的字符串匹配定位元素?

Den*_*fel 27

tr[.//text()='hello']/td
Run Code Online (Sandbox Code Playgroud)

这将选择所有tr元素的所有td子元素,其中包含一个完全具有'hello' 的子元素.这样的XPath对我来说仍然很奇怪.

我相信这更有意义:

tr/td[./text()='hello']
Run Code Online (Sandbox Code Playgroud)

因为它只选择包含文本的td.

这有帮助吗?


Ros*_*son 6

这一切都取决于你的HTML实际包含的内容,但你的tr[contains(.,'hello')]/tdXPath选择器意味着" 第一行中包含字符串'hello'的第一个单元格 "(或更准确地说," TR元素中的第一个TD元素)在其中的任何地方包含字符串'hello' ",因为Selenium不知道所涉及的元素到底是做什么的.这就是为什么当有包含"hello"和"hello1"的行时,它会得到错误的结果 - 两者都包含"hello".

选择器tr[. ='hello']/td会更准确,但它有点不寻常(因为HTML TR元素不应该包含文本 - 文本应该在TR中的TH或TD元素中),并且它可能不起作用(因为任何其他单元格中的文本都会破坏比较). 您可能想要 tr[td[.='hello']]/td,这意味着" TR元素中包含的第一个TD元素包含一个TD元素,该元素具有字符串'hello',因为它是完整的文本 ".


Aur*_*osa 1

好吧,你的问题是你正在 tr 中搜索文本(无论如何这是不正确的),这会导致函数出现问题contains,无法接受文本列表。尝试改用此位置路径。它应该检索你想要的东西。

//tr/td[contains(./text(),"hello")]
Run Code Online (Sandbox Code Playgroud)

此位置路径将检索一组节点,您必须在这些节点上迭代才能获取文本。您可以尝试附加

/text()
Run Code Online (Sandbox Code Playgroud)

但这会导致(至少在我的测试中)结果是一个字符串,它是所有匹配字符串的串联。