Как правильно использовать локаторы `XPath`, такие как` parent`, `child`, follow-sibling`? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть форма:

<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, но в этом случае другого способа (.., .) не существует.

  • Как правильно использовать XPath локаторы такиекак parent, child, следующий брат или сестра?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Вместо того, чтобы выбирать цель и переходить к родителю, в первую очередь рассмотрите возможность использования предиката для родителя:

//label[input/@name='newPasswordRepeat']/following-sibling::*[1]/div

выберет дочернего элемента div элемента, следующего сразу за ним.label, который содержит целевой элемент input.Ось parent:: не требуется.

0 голосов
/ 27 сентября 2019

Это всегда axis::node_test (сравните этот ответ, где я объясняю различные термины XPath ).

Например,

  • parent::div выбирает родительский узел, если это <div> (это проверка узла).
  • ancestor::div выбирает все (!) Узлы-предки, которые <div> с.
  • following-sibling::div выбирает всех (!) следующих братьев и сестер, которые являются <div> с.

В большинстве случаев нет гарантии, что выбран только один узел.Поэтому разумно также иметь некоторый [predicate], который сужает выбор, чтобы предотвратить ложные срабатывания - например, мы могли бы проверить атрибут @class.

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

Конечно, parent::label можно сократитьдо .., если нам все равно, какой элемент является родителем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...