XPath:点与文本的区别()
我的问题是关于在XPath
中使用点和text()
细节。 例如,下面的find_element
行返回相同的元素:
driver.get('http://stackoverflow.com/') driver.find_element_by_xpath('//a[text()="Ask Question"]') driver.find_element_by_xpath('//a[.="Ask Question"]')
那有什么区别? 什么是使用的好处和缺点.
和text()
?
之间有区别.
和text()
,但是由于input文档的缘故,这种差异可能不会出现。
如果你的input文档看起来像(给你的XPathexpression式可以想象的最简单的文档)
例1
<html> <a>Ask Question</a> </html>
然后//a[text()="Ask Question"]
和//a[.="Ask Question"]
确实返回完全相同的结果。 但是考虑一下看起来不同的input文档
例2
<html> <a>Ask Question<other/> </a> </html>
其中a
元素在“Ask Question”之后还有一个子元素。 给定第二个input文档, //a[text()="Ask Question"]
仍然会返回a
元素,而//a[.="Ask Question"]
不会返回任何东西!
这是因为两个谓词( [
和]
之间的所有内容)的含义是不同的。 [text()="Ask Question"]
实际上是指:如果元素的任何文本节点都包含文本“Ask Question”,则返回true。 另一方面, [.="Ask Question"]
表示:如果元素的string值与“Ask Question”相同,则返回true。
在XPath模型中,如果其他元素干扰了文本,XML元素中的文本可以被分割成多个文本节点 ,如上例2所示。 在那里, other
元素在“提问”和换行符之间,也被视为文本内容。
为了更清晰的例子,考虑作为input文件:
例3
<a>Ask Question<other/>more text</a>
在这里, a
元素实际上包含两个文本节点,“Ask Question”和“more text”,因为两者都是a的直接子元素。 你可以通过在这个文件上运行//a/text()
来testing它,它将返回(单独的结果由----
分隔):
Ask Question ----------------------- more text
所以,在这种情况下, text()
返回一组单个节点,而.
在谓词中求值为所有文本节点的string连接。 再次,您可以使用pathexpression式来testing此声明//a[.='Ask Questionmore text']
,它将成功返回a
元素。
最后,请记住,一些XPath函数只能将一个string作为input。 正如LarsH在评论中指出的那样,如果这样一个XPath函数(例如contains()
)被赋予一个节点序列,那么它将只处理第一个节点,并默默地忽略其余的节点。
dot (".")
和text()
之间有很大的区别: –
-
XPath
的dot (".")
被称为“上下文项expression式”,因为它引用了上下文项。 这可以与节点(如element
,attribute
或text node
)或primefaces值(如string
,number
或boolean
)string
。 而text()
是指只匹配string
forms的element text
。 -
dot (".")
表示法是DOM中的当前节点。 这将成为Nodetypes的对象,而使用XPath
函数text()来获取元素的文本只会获得文本到第一个内部元素 。 如果要查找的文本位于内部元素之后,则必须使用当前节点来searchstring,而不是XPath
text()函数。
举一个例子:
<a href="something.html"> <img src="filename.gif"> link </a>
在这里,如果你想通过文本链接finda
元素的锚,你需要使用dot (".")
。 因为如果你使用//a[contains(.,'link')]
它会finda
元素,但是如果你使用//a[contains(text(),'link')]
, text()
函数看起来不是find它。
希望它会帮助你.. 🙂