Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium XPath:点和文本()之间的差异_Selenium_Xpath - Fatal编程技术网

Selenium XPath:点和文本()之间的差异

Selenium XPath:点和文本()之间的差异,selenium,xpath,Selenium,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"]') 那么有什么区别呢?使用和文本()的优点和缺点是什么?点(“.”和文本()之间有很大的

我的问题是关于在
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"]')

那么有什么区别呢?使用
文本()
的优点和缺点是什么?

点(“.”
文本()
之间有很大的区别:-

  • XPath
    中的
    点(“.”
    称为“上下文项表达式”,因为它引用上下文项。这可以与节点(例如
    元素
    属性
    ,或
    文本节点
    )或原子值(例如
    字符串
    数字
    ,或
    布尔值
    )匹配。而
    text()
    仅指
    元素文本
    形式的匹配

  • 点(“.”
    符号是DOM中的当前节点。当使用
    XPath
    函数text()获取元素的文本时,这将是一个Node类型的对象,只获取第一个内部元素的文本。如果要查找的文本位于内部元素之后,则必须使用当前节点来搜索字符串,而不是
    XPath
    text()函数

例如:

<a href="something.html">
  <img src="filename.gif">
  link
</a>

在这里,如果您想使用textlink查找锚定
元素,则需要使用
点(“.”
)。因为如果使用
//a[contains(,'link')]
它会找到锚
a
元素,但是如果使用
//a[contains(text(),'link')]
函数似乎找不到它


希望它能帮助您:)

text()
之间存在差异,但由于您的输入文档,这种差异可能不会显现出来

如果您的输入文档看起来像(给定XPath表达式可以想象的最简单的文档)

示例1

<html>
  <a>Ask Question</a>
</html>
其中
a
元素还有一个子元素
other
,紧跟在“提问”之后。给定第二个输入文档,
//a[text()=“Ask Question”]
仍然返回
a
元素,而
//a[.=“Ask Question”]
不返回任何内容


这是因为这两个谓词(介于
[
]
之间的所有谓词)的含义不同
[text()=“Ask Question”]
实际上意味着:如果元素的任何文本节点恰好包含文本“Ask Question”,则返回true。另一方面,
[.=“Ask Question”]
表示:如果元素的字符串值与“Ask Question”相同,则返回true

在XPath模型中,如果其他元素干扰文本,XML元素中的文本可以划分为多个文本节点,如上面的示例2所示。在这里,
other
元素位于“提问”和换行符之间,换行符也算作文本内容

为了做出一个更清楚的例子,考虑作为一个输入文件:

示例3

<a>Ask Question<other/>more text</a>
因此,在这种情况下,
text()
返回一组单独的节点,而谓词中的
的计算结果是所有文本节点的字符串串联。同样,您可以使用路径表达式
//a[.='Ask Questionmore text']
测试此声明,该表达式将成功返回
a
元素


最后,请记住,某些XPath函数只能接受一个字符串作为输入。正如LarsH在评论中指出的那样,如果这样一个XPath函数(例如
contains()
)被赋予一个节点序列,它将只处理第一个节点,而默默地忽略其余的节点。

XPath text()函数定位文本节点内的元素,而dot(.)定位文本节点内或外的元素。在图像描述屏幕截图中,XPath text()函数将只定位DOM示例2中的Success。它在DOM示例1中找不到成功,因为它位于标记之间


此外,text()函数在DOM示例3中找不到成功,因为成功与元素没有直接关系。这里有一个视频演示,解释了text()和dot(.)之间的区别。

我很确定我可以将锚点与
//a[contains(text(),'link')]
以及
//a[normalize space(text())='link')]
匹配,谢谢你的支持answer@Andersson:你说得很对,但只有当
link
位于
a
的第一个文本节点子节点时,这种方法才有效。在Saurabh的示例中,在
元素之前可能有一个只包含空格的文本节点,在这种情况下,注释中的XPath表达式将与锚点不匹配。原因是
contains()
normalize-space()
函数获取节点集中第一个节点的字符串值,这是它们的第一个参数。@SaurabhGaur:你有一些好的观点,但
text()
只选择第一个内部元素之前的文本不是真的
text()
选择所有文本节点(除非指定不同的轴,否则它们是上下文节点的子节点)。但是,如果您将
text()
选择的节点集传递给
contains()
,则通过获取节点集中第一个节点的字符串值,该节点集将转换为字符串。()正如@LarsH正确指出的那样,这个答案的某些部分仍然是错误的,应该加以修正。答案中最重要的误解是,
text()
只选择第一个文本节点,这是完全不真实的。(-1)这个答案有误导性。阅读LarsH和Mathias的评论,了解如何或更好地看到和/或更好地理解微妙之处
<a>Ask Question<other/>more text</a>
Ask Question
-----------------------
more text