<br/> 之后文本的 XPath

XPath for text after <br/>

希望通过此块获得 $2.00 的 XPath:

<td class="undefined" colspan="6">
   <table class="history-bill-payments" cellspacing="0" cellpadding="0" border="0" align="center" width="99%">
<thead>
<tbody>
   <tr>
      <td valign="top">04/19/2016</td>
      <td valign="top" style="text-align:right; height:">
         .00
         <br/>
         .00
      </td>

这些我都试过了但是没用

$I->CanSeeElement("//table[contains(tbody/tr[2]/td/table/tbody/tr/td[2]/following-sibling::br)]"); 
$I->CanSeeElement("//table[contains(tbody/tr[2]/td/table/tbody/tr/td[2]/preceding-sibling::br/text(),'.00')]"); 
$I->CanSeeElement("//table[contains(tbody/tr[2]/td/table/tbody/tr/td[2]/following-sibling::br/text(),'.00')]");

在 Firefox 中使用 firepath 我得到了这个 XPath

html/body/div[4]/div[2]/div/div/div/div/table/tbody/tr[2]/td/table/tbody/tr/td[2]

我能够获得 $3.00 的 xpath

$I->CanSeeElement("//table[contains(tbody/tr[2]/td/table/tbody/tr/td[2]/text(),'.00')]");

td 有一定内容

从您的试验来看,您似乎可以从字面上键入 .00,因此您可以使用此 XPath 2.0 表达式来获取以 .00 结尾的 td :

//td[ends-with(normalize-space(), '.00')]

请注意,浏览器通常不支持 XPath 2.0,因此如果 运行 在浏览器中使用此 XPath 1.0 表达式并且您可以接受 .00 出现在 [=13= 中的任何位置]:

//td[contains(.,'.00')]

br

之后的文本

如果您不想逐字指定 .00,则必须声明其他一些不变约束。例如,此 XPath 将 return 包含在以 .00:

开头的 td 中的 br 之后的字符串
normalize-space(//td[starts-with(normalize-space(),'.00')]/br/following::text())

另见

  • XPath contains() works differently in XPath v1.0 vs v2.0+
  • How to use XPath contains() here?

在 XPath 1.0 中,给定一个节点集,contains() 只会计算集合中的第一个节点。这就是为什么您的初始 XPath 成功找到包含 '.00' 的文本节点,而不是包含 '.00'.

的文本节点的原因

接近您的 $3.00xpath 工作方式的 XPath 表达式如下:

//table[tbody/tr[2]/td/table/tbody/tr/td[2]/text()[contains(.,'.00')]]

上面的 XPath 通过在单个文本节点上应用 contains() 而不是一次传递多个文本节点来工作。

如果需要,只需添加 table id 或任何其他特定定位器。

xpath=//table//tr/td[2]/text()[2]