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()是指只匹配stringforms的element text。 -
dot (".")表示法是DOM中的当前节点。 这将成为Nodetypes的对象,而使用XPath函数text()来获取元素的文本只会获得文本到第一个内部元素 。 如果要查找的文本位于内部元素之后,则必须使用当前节点来searchstring,而不是XPathtext()函数。
举一个例子:
<a href="something.html"> <img src="filename.gif"> link </a>
在这里,如果你想通过文本链接finda元素的锚,你需要使用dot (".") 。 因为如果你使用//a[contains(.,'link')]它会finda元素,但是如果你使用//a[contains(text(),'link')] , text()函数看起来不是find它。
希望它会帮助你.. 🙂