首页 > 解决方案 > 如何正确使用 `XPath` 定位器,例如`parent`、`child`、following-sibling`?

问题描述

我有一些形式:

<div class="form_item--2c8WB">
    <label>
        <span class="label--2VxxL required--2nkmI">
            "Text"
            ::after
        </span> 
        <br> 
        <input type="password" name="newPasswordRepeat" autocomplete="new-password" 
               aria-invalid="true" aria-required="true" 
               aria-errormessage="vee_Text2">
    </label> 
    <div class="errors--qVgtm">
        <div>Text3</div>
    </div>
</div>

我需要找到Text3文本元素的路径,但正是通过input部分:

我的方式:

//input[@name='newPasswordRepeat']/../../div/div

路径是有效的,但是还有很长的路要走,我想用这个follow-sibling命令。但我不能那样做

例如,我正在尝试使用parent::路径:

//input[@name='newPasswordRepeat']/parent::
//input[@name='newPasswordRepeat']::parent::
//input[@name='newPasswordRepeat']::parent
//input[@name='newPasswordRepeat']/parent
//input[@name='newPasswordRepeat']/::parent

此订单中没有人不工作,只有

//input[@name='newPasswordRepeat']/..

我也不能使用following-sibling,但在这种情况下,另一种方式 ( .., .) 不存在。

标签: htmlxpath

解决方案


它总是axis::node_test(比较我解释各种 XPath 术语的这个答案)。

例如

  • parent::div如果它是 a则选择父节点<div>(即节点测试)。
  • ancestor::div选择所有 (!) 为 s 的祖先节点<div>
  • following-sibling::div选择所有 (!) 以下是<div>s 的兄弟姐妹。

大多数情况下,不能保证只选择一个节点。因此,还有一些[predicate]缩小选择范围以防止误报的方法是明智的——例如,我们可以验证@class属性。

//input[@name='newPasswordRepeat']/parent::label/following-sibling::div[starts-with(@class, 'errors')]/div

如果我们不关心父元素是什么类型的元素,当然parent::label可以缩短为。..


推荐阅读