我的问题是关于在XPath中使用dot和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()的优点和缺点是什么
发布于 2017-01-26 05:55:43
.和text()之间存在差异,但由于输入文档的原因,这种差异可能不会显现出来。
如果您的输入文档看起来像(给出您的XPath表达式,您可以想象到的最简单的文档)
示例1
<html>
<a>Ask Question</a>
</html>那么//a[text()="Ask Question"]和//a[.="Ask Question"]返回的结果确实是完全相同的。但是考虑一个不同的输入文档,它看起来像
示例2
<html>
<a>Ask Question<other/>
</a>
</html>其中,a元素还有一个紧跟在"Ask where“后面的子元素other。对于第二个输入文档,//a[text()="Ask Question"]仍然返回a元素,而//a[.="Ask Question"]不返回任何内容!
这是因为这两个谓词( [和]之间的所有内容)的含义是不同的。[text()="Ask Question"]的实际含义是:如果元素的任何文本节点都包含文本"Ask Question“,则返回true。另一方面,[.="Ask Question"]表示:如果元素的字符串值与"Ask other“相同,则返回true。
在XPath模型中,如果其他元素干扰文本,则可以将XML元素中的文本划分为多个文本节点,如上面的Example 2所示。在这里,other元素位于"Ask There“和换行符之间,换行符也算作文本内容。
为了使示例更清晰,请考虑将其作为输入文档:
示例3
<a>Ask Question<other/>more text</a>在这里,a元素实际上包含两个文本节点"Ask direct“和"more text",因为这两个节点都是a的直接子节点。您可以通过在此文档上运行//a/text()来测试这一点,该文档将返回(以----分隔的各个结果):
Ask Question
-----------------------
more text因此,在这种情况下,text()将返回一组单独的节点,而谓词中的.将计算为所有文本节点的字符串连接。同样,您可以使用将成功返回a元素的路径表达式//a[.='Ask Questionmore text']来测试此声明。
最后,请记住,某些XPath函数只能接受一个字符串作为输入。正如LarsH在评论中指出的那样,如果这样的XPath函数(例如contains())被赋予一系列节点,它将只处理第一个节点,而忽略其余节点。
发布于 2016-07-07 16:38:28
dot (".")和text()之间有很大的不同:
dot (".") in XPath被称为“上下文项表达式”表达式,因为它引用上下文项。这可以与节点(如element、attribute或text node)或原子值(如string、number或boolean)匹配。而text()表示只匹配string形式的element text。dot (".")表示法是DOM中的当前节点。这将是一个Node类型的对象,而使用XPath函数text()来获取元素的文本只会获取第一个内部元素的文本。如果您要查找的文本位于内部元素之后,则必须使用当前节点来搜索字符串,而不是使用XPath text()函数。举个例子:
<a href="something.html">
<img src="filename.gif">
link
</a>在这里,如果您希望使用文本a链接查找锚点元素,则需要使用dot (".")。因为如果您使用//a[contains(.,'link')],它会找到锚a元素,但是如果您使用//a[contains(text(),'link')],text()函数似乎找不到它。
希望它能帮助你..:)
发布于 2019-07-30 08:55:57
enter image description here XPath文本()函数定位文本节点内的元素,而点(.)定位文本节点内部或外部的元素。在图像描述屏幕截图中,XPath text()函数将仅在DOM Example 2中定位成功。它不会在DOM Example 1中找到成功,因为它位于标记之间。
此外,在DOM Example 3中,text()函数不会成功,因为成功与元素没有直接关系。下面是一个视频演示,解释了文本()和点(.) https://youtu.be/oi2Q7-0ZIBg之间的区别
https://stackoverflow.com/questions/38240763
复制相似问题