通过 XPath 仅选择叶 SPAN 元素

Posted

技术标签:

【中文标题】通过 XPath 仅选择叶 SPAN 元素【英文标题】:Select only leaf SPAN elements via XPath 【发布时间】:2016-02-07 18:22:43 【问题描述】:

我在 Windows 7 上使用 Java 和 Selenium 和 testng。 我的 html 代码如下所示(这只是一部分):

<TR>
  <TH>
    <SPAN>Some Text 1</SPAN>
  </TH>
  <TH>
    <SPAN>
      <A id="someid" href="http://someurl">
        <SPAN> Some Text 2</SPAN>
      </A>
    </SPAN>
  </TH>
 </TR>

换句话说,“Some Text 1”和“Some Text 2”处于不同的跨度级别。我试图想出一个 XPath 来找到它们。我不能使用*//TR//SPAN*,因为那样会在“Some Text 2”上方获得额外的SPAN。我无法查找带有文本的SPAN,因为我找到的一些没有文本。我相信我可以假设的是,我正在寻找的 SPAN 将始终是 TH 下的最低级别 SPAN

那么有没有我可以使用的 XPath?我想我可以做一些动态递归循环而不是使用@FindBy 来找到一个跨度并继续搜索它下面的跨度,直到我找到一片叶子,但这听起来有点棘手。

【问题讨论】:

【参考方案1】:

这个 XPath

//SPAN[not(*)]

将选择所有没有子元素的SPAN 元素,因此它会选择

<SPAN>Some Text 1</SPAN>
<SPAN>Some Text 2</SPAN>

但不是包含文本 2 SPANSPAN,根据要求。

如果您想将选中的 SPAN 元素限制为仅位于 TH 元素下的叶“SPAN”元素:

//TH//SPAN[not(*)]

【讨论】:

【参考方案2】:

根据您的问题,您希望找到SPAN 元素

位于TH 元素下方 不要在它们下面包含另一个 SPAN 元素

你可以试试这个 xpath:

String xpath = "//TH//SPAN[not(.//SPAN)]"

【讨论】:

【参考方案3】:

我不做 xpath,但我可以提供一些 css 帮助。

$$("th span:last-of-type")

这将识别(所有)“th”的最后一个子跨度。

【讨论】:

谢谢。我休息了几天,所以我现在才看到这个。我会试试的。

以上是关于通过 XPath 仅选择叶 SPAN 元素的主要内容,如果未能解决你的问题,请参考以下文章

xpath定位方法

selenium通过文本内容定位元素(div,td,span等)

Xpath:选择除具有特定属性的元素之外的所有元素

JavaScript仅选择外部元素的内部html,不包括内部元素

Web自动化测试:xpath元素定位深入讲解

有没有想过css定位与xpath的区别