XPath preceding-sibling不起作用

3
我正在尝试点击第一个按钮,以删除第二个按钮所对应的项目。
<tr>
  <td>
    <div class="btn-group">
       <button class="btn btn btn-danger" name="delete" type="button">
    </div>
  </td>
  <td>
     <span class="class"></span>
  </td>
  <td>
     <button class="btn" name="item" type="button">
  </td>
</tr>

XPath

//button[contains(.,'${ITEM}')]/preceding-sibling::button[@name='delete']
1个回答

2

假设您在示例HTML中没有显示按钮文本,因为两个按钮似乎都没有内容。

在这种情况下,preceding::button应该可以工作,而preceding-sibling则不起作用,因为这两个按钮不是兄弟节点。请注意末尾的[1],它是需要的以选择最接近的匹配项:

//button[contains(.,'${ITEM}')]/preceding::button[@name='delete'][1]

以下内容也应该可以运行,并且在我看来更加简洁明了:
```

以下代码也可以正常工作,而且更加简洁明了:

```
//tr[.//button[contains(., '${ITEM}')]]//button[@name  ='delete']

非常感谢!使用preceding::button对我没有起作用,因为它选择了页面上找到的第一个删除按钮,但第二个很好用。 - jquerynoob
啊,是的。如果你使用 preceding::,在末尾需要加上 [1]。我更新了我的答案以保证完整性。 - JLRishe
preceding::button[1] 选择的是第一个匹配项,还是最近的匹配项(即最后一个匹配项)? - jpaugh
@jpaugh 它选择最接近的一个。preceding...ancestor... 轴被称为“反向轴”:https://www.w3.org/TR/xpath/#predicates - JLRishe
谢谢你澄清了这个问题。我知道 preceding-sibling 的工作原理,这也是我问的原因。我会加入“closest”的编辑,因为这样更不会引起混淆,可以明确地指向文档顺序。 - jpaugh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接