Странное поведение xPath - выбор ВСЕХ элементов, даже если установлено [1] - PullRequest
1 голос
/ 10 августа 2009

сегодня я наткнулся на очень интересный случай (по крайней мере, для меня). Я возился с Selenium и xPath и пытался получить некоторые элементы, но получил странное поведение:

<div class="resultcontainer">
   <div class="info">
     <div class="title">
        <a>
           some text
        </a>
     </div>
   </div>
</div>

<div class="resultcontainer">
   <div class="info">
     <div class="title">
        <a>
           some other text
        </a>
     </div>
   </div>
</div>

<div class="resultcontainer">
   <div class="info">
     <div class="title">
        <a>
           some even unrelated text
        </a>
     </div>
   </div>
</div>

Это мои данные. Когда я запускаю следующий запрос xPath:

//div[@class="title"][1]/a

В результате я получаю ALL вместо только первого. Но если я сделаю запрос:

//div[@class="resultcontainer"][1]/div[@class="info"]/div[@class="title"]/a

Я получаю только первое, а не все.

Есть ли какая-то божественная причина этого?

С уважением, BISKO

1 Ответ

2 голосов
/ 10 августа 2009

Я думаю, что вы хотите

(//div[@class="title"])[1]/a

Это:

//div[@class="title"][1]/a

выбирает все (<a> элементы, которые являются потомками) <div> элементов, которые имеют @class из 'title', которые являются первыми дочерними элементами их родителей (в этом контексте). Это означает: он выбирает всех из них.

Рабочий XPath выбирает все элементы <div>, которые имеют @class из 'title', и из них он выбирает первый.

Предикаты (выражения в квадратных скобках []) применяются к каждому элементу, который соответствует предыдущему шагу расположения (т. Е. "//div") индивидуально . Чтобы применить предикат к отфильтрованному набору узлов, необходимо очистить группировку в скобках.

Следовательно, это:

//div[1][@class="title"]/a

выберет все элементы <div>, возьмет первый и затем отфильтрует его, проверив значение @class. Также не то, что вы хотите. ; -)

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