2

使用 xpath//ul//li[contains(text(),"outer")]在外层 ul 中查找 li 不起作用

<ul>
  <li>
   <span> not unique text, </span>
   <span> not unique text, </span>
   outer ul li 1
   <ul >
     <li> inner ul li 1 </li>
     <li> inner ul li 2 </li>   
   </ul>
  </li>
  <li>
   <span> not unique text, </span>
   <span> not unique text, </span>
   outer ul li 2
   <ul >
     <li> inner ul li 1 </li>
     <li> inner ul li 2 </li>   
   </ul>
  </li>
</ul>

知道如何在外部 ul 中找到具有特定文本的 li 吗?

谢谢

4

4 回答 4

13

这对你有用//ul//li[contains(.,"outer")]

于 2013-07-01T13:52:21.533 回答
2

用 Saxon 运行它,原始的 XPath 表达式给出:

XPTY0004:不允许将多个项目的序列作为 contains() 的第一个参数(“”,“”,...)

现在,我猜 Selenium 可能使用的是 XPath 1.0 而不是 XPath 2.0,并且在 1.0 中, contains() 函数具有“第一项语义”——它将其参数转换为字符串,如果参数是包含超过一个节点,只考虑第一个节点。第一个文本节点可能是空格。

如果要测试某个子文本节点是否包含“outer”,请使用

//ul//li[text()[contains(.,"outer")]]

切换到 XPath 2.0 的另一个原因...

于 2013-07-01T17:17:09.753 回答
1

我希望您只喜欢考虑作为li. 因此你使用是正确的text()(如果你使用contains(.,"outer")它会考虑文本形式的任何 li 的孩子)。

因此试试这个:

//ul/li[text()[contains(.,'outer')]] 
于 2013-07-01T14:49:52.743 回答
0

对于上述问题 -

该解决方案将起作用

//ul//li[contains(.,"outer")]

“。” 选择当前节点

于 2017-04-18T13:25:26.633 回答