使用节点选择祖父母来选择其中一个后代

时间:2011-04-12 22:46:33

标签: xpath selenium

我有一棵类似的树:

         tr
        _|_
       td  td
      _|    |_
     div     div
     _|       |_ 
 input       "foobar"

我使用:

选择节点“foobar”
//*[normalize-space(text())='foobar']

但我无法选择曾祖父母tr,并选择了曾祖父input。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

  

我选择了节点“foobar”   使用:

//*[normalize-space(text())='foobar'] 
     

但我无法选择伟大的   祖父母和选择伟大的盛大   孩子“foobar”与它。

我想你要从顶部元素tr开始选择其字符串值(标准化后)为“foobar”的元素。

这是一个从顶层elemet tr“启动”并选择所需元素的XPath表达式:

/tr//*[normalize-space()='foobar']

如果您需要选择文本节点本身(而不是其元素父节点):

/tr//text()[normalize-space()='foobar']

如果您想避免对//缩写进行昂贵且缓慢的评估(因为您知道文档结构),请使用以下表达式:

/tr/td/div[normalize-space()='foobar']

甚至:

/tr/td[2]/div

<强>更新

现在,OP改变了他的问题,并希望从input中选择div元素,该元素具有规范化的字符串值'foobar'。

这是一个XPath表达式,正好选择

../..//input

../../td[1]/div/input

请注意:如果这些表达式没有选择任何节点,则很可能该文档具有默认命名空间 - 搜索XPath默认命名空间 - 有很多很好的答案这个问题 - 在SO和互联网上。

答案 1 :(得分:0)

在空格规范化后,此XPath表达式选择元素 后代文本节点等于“foobar”:

//*[.//text()[normalize-space()='foobar']]