我目前正在努力寻找正确的xpath表达式,以选择其父/兄弟元素包含特定文本的输入元素。
在下面的示例中,我想选择"输入" element在同一tr
行中,存在具有特定文本的td
元素。
我的示例路径 - 返回无匹配
//input[contains(../../../td/text(),"15-935-331")]
源代码
<tr>
<td><a href="xxx" target="_blank">xxxx, yyyyy</a></td>
<td>Mr</td>
<td></td>
<td> 15-935-331</td>
<form id="betreuerModel" action="xxxx" method="POST">
<td class="tRight">
<input value="Bearbeiten" id="bearbeiten" name="bearbeiten" class="submit" title="Bearbeiten" type="submit"/>
</td>
</form>
</tr>
<tr>
// .. next row with same structure
</tr>
答案 0 :(得分:3)
作为Keith发布的解决方案的替代方案,您可以使用以下XPath表达式:
//tr[td[contains(., "15-935-331")]]/form//input
这使得它更加独立于HTML的实际结构。它选择包含tr
包含给定文字的td
,并从tr
中选择input
元素位于form
元素下方的任何位置。
答案 1 :(得分:2)
contains
函数在给定节点集时,仅在该节点集中的第一个节点上运行。在您的情况下,它是<td><a href="xxx" target="_blank">xxxx, yyyyy</a></td>
。
您可以改为重构表达式,以便谓词在所有要检查的节点上运行,contains
函数对单个项目进行操作:
//input[../../../td/text()[contains(., "15-935-331")]]
这将获得任何input
元素,其中父母的父母的父母包含td
元素,其中文本节点包含文本15-935-331
。
指定此方法的一种更简单的方法是使用ancestor::tr[1]/td
代替../../../td
。
//input[ancestor::tr[1]/td/text()[contains(.,"15-935-331")]]
这将获得祖先层次结构中的第一个tr
,并对其进行操作。