我的问题是关于在text()
中使用点和XPath
的具体细节。例如,以下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()
有什么好处和缺点?
答案 0 :(得分:55)
.
和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
元素还有一个子元素other
紧跟在&#34; Ask Question&#34;之后。鉴于此第二个输入文档,//a[text()="Ask Question"]
仍会返回a
元素,而//a[.="Ask Question"]
则不会返回任何内容!
这是因为两个谓词([
和]
之间的所有内容)的含义不同。 [text()="Ask Question"]
实际上意味着:如果元素的任何文本节点包含文本&#34; Ask Question&#34;则返回true。另一方面,[.="Ask Question"]
表示:如果元素的字符串值与&#34相同,则返回true;问问题&#34;。
在XPath模型中,如果其他元素干扰文本,则XML元素内的文本可以划分为多个文本节点,如上面的示例2 。在那里,other
元素介于&#34; Ask Question&#34;和换行符也算作文本内容。
为了做一个更清晰的例子,请考虑作为输入文件:
示例3
<a>Ask Question<other/>more text</a>
这里,a
元素实际上包含两个文本节点,&#34; Ask Question&#34;和&#34;更多文字&#34;,因为两者都是a
的直接子女。您可以通过在此文档上运行//a/text()
来对此进行测试,该文档将返回(单个结果由----
分隔):
Ask Question
-----------------------
more text
因此,在这种情况下,text()
返回一组单独的节点,而谓词中的.
评估所有文本节点的字符串连接。同样,您可以使用路径表达式//a[.='Ask Questionmore text']
来测试此声明,该表达式将成功返回a
元素。
最后,请记住,某些XPath函数只能将一个字符串作为输入。正如LarsH在评论中指出的那样,如果这样的XPath函数(例如contains()
)被赋予一系列节点,它将只处理第一个节点并静默忽略其余节点。 / p>
答案 1 :(得分:11)
dot (".")
和text()
之间存在很大差异: -
dot (".")
中的XPath
称为&#34;上下文项目表达式&#34; ,因为它引用了上下文项目。这可以与节点(例如element
,attribute
或text node
)或原子值(例如string
,number
匹配,或boolean
)。虽然text()
仅指element text
形式的string
,但
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()
函数似乎找不到它。
希望它会对你有所帮助.. :)
答案 2 :(得分:-1)
enter image description here XPath text()函数在文本节点中定位元素,而点(。)在文本节点内部或外部定位元素。在图像描述屏幕快照中,XPath text()函数仅在以下位置定位Success: DOM示例2 。由于它位于标记之间,因此在 DOM示例1 中不会成功。
另外,在 DOM示例3 中,text()函数不会找到成功,因为成功与element没有直接关系。这是一个视频演示,解释了text()和点(。)https://youtu.be/oi2Q7-0ZIBg
之间的区别