XPath:点和文本之间的区别()

时间:2016-07-07 08:26:05

标签: selenium xpath

我的问题是关于在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()有什么好处和缺点?

3 个答案:

答案 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; ,因为它引用了上下文项目。这可以与节点(例如elementattributetext node)或原子值(例如stringnumber匹配,或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

之间的区别