Как искать «следующие» элементы, пока мы не достигнем элемента в selenium?

#java #selenium #selenium-webdriver

#java #selenium #selenium-webdriver

Вопрос:

Например,

У нас есть следующий HTML :

 <li class="gcui-menu-item tsc-dr-tree-item">1</li>
<li class="gcui-menu-item tsc-dr-tree-subitem">1-1</li>
<li class="gcui-menu-item tsc-dr-tree-subitem">1-2</li>
<li class="gcui-menu-item tsc-dr-tree-item">2</li>
<li class="gcui-menu-item tsc-dr-tree-subitem">2-1</li>
  

ПРИМЕЧАНИЕ: Текст, содержащийся в li s, на самом деле не присутствует на странице, они присутствуют в виде меток, помогающих объяснить проблему.

Здесь я хотел бы получить подпункты ‘1-1’ и ‘1-2’, только под первым элементом дерева ‘1’.

Если я ищу:

 //li[contains(@class, 'tree-item')]//following::li[contains(@class, 'subitem')]
  

Я также получаю подпункт под вторым элементом дерева, ‘2-1’, поскольку в этой структуре нет дочерних элементов элемента, кроме братьев и сестер.

Итак, есть ли какой-либо способ, которым мы можем действовать, following:: li пока не достигнем li элемента? Может быть, following::li до следующего li , содержащего «элемент дерева» в своем классе?

Комментарии:

1. Я не понимаю, что именно вы пытаетесь сделать, и, пожалуйста, разместите здесь html вместо фотографии.

2. Я изменил формулировку вашего вопроса, основываясь на том, что, как мне кажется, вы задаете. Пожалуйста, отредактируйте это и исправьте все, что я сделал неправильно.

3. @JeffC Большое спасибо за редактирование моего вопроса, он идеален. Теперь у меня есть идея о том, как я могу объяснить лучше, я улучшу свои вопросы в следующий раз.

Ответ №1:

Вот xpath, который соответствует обоим элементам подпункта li в первом пункте меню.

 //li[contains(@class,'tree-item')][1]/following-sibling::li[contains(@class,'tree-subitem') and count(preceding-sibling::li[contains(@class,'tree-item')])=1]
  

Ниже приведен вывод в консоли chrome.
введите описание изображения здесь

Комментарии:

1. Если вы хотите получить подпункты для 2-го пункта меню, то просто замените позицию 1 на 2 в обоих местах. К вашему сведению

2. Это не возвращает никаких элементов

3. Я понял, в чем проблема… menu-subitem должно быть tree-subitem … но он по-прежнему не возвращает нужные элементы. Он возвращает только первый элемент, а не все (2) подпункты.

4. возможно, вы ночью обновили последнюю ссылку на класс до ‘tree-item’. Я обновил xpath, основываясь на обновленном сообщении, теперь он должен синхронизироваться с именем класса в соответствии с сообщением.

5. Прохладный. Пожалуйста, примите мой ответ. Я думаю, что сообщение было обновлено после моего первоначального ответа, вот почему я должен отредактировать сообщение с новыми именами классов :-).