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()之间有很大的区别: –

  • XPathdot (".")被称为“上下文项expression式”,因为它引用了上下文项。 这可以与节点(如elementattributetext node )或primefaces值(如stringnumberbooleanstring 。 而text()是指只匹配stringforms的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它。

希望它会帮助你.. 🙂