Xpath с несколькими условиями потомков - PullRequest
2 голосов
/ 20 марта 2020

У меня есть HTML файл, который выглядит следующим образом:

<div id="products">
   <div class="product">
      <span class="productheader">Product 1</span>
      <input type="checkbox" />
   </div>
   <div class="product">
      <span class="productheader">Product 2</span>
      <div class="selected_value and_other value plus one value">
         <input type="checkbox" checked="checked" />
      </div>
   </div>
   <div class="product">
      <span class="productheader">Product 3</span>
      <span class="hidden">
         <div class="selected_value and_other value">
            <input type="checkbox" checked="checked" />
         </div>
      </span>
   </div>
</div>

Я хотел бы иметь значение из header где:

  • вход «проверен» -> класс div от потомка содержит «selected_value»
  • , но не скрыт -> выбранный не является частью диапазона с классом «hidden»

так, только второе productheader значение (Product 2) должно быть результатом.

Как должен выглядеть правильный xpath?

Пробовал много вещи, но ничего не работает. Наиболее точно:

//div[contains(@class, 'product')]//*[descendant::div[contains(@class ,"selected_value")]]

Проблема в том, что это не означает, что он не может быть скрыт!

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Для завершения ответа @ supputuri, больше (5) опций XPath (от самого короткого до самого длинного):

//input[@checked][not(ancestor::span)]/preceding::span[1]/text()
//div[@class="product"][.//@checked and not(span[@class="hidden"])]/*[1]/text()
//input[@checked][not(ancestor::span)]/ancestor::div[@class="product"]/*[1]/text()
//input[@checked][not(ancestor::span)]/ancestor::div[@class="product"]/*[1]/text()
//span[@class="productheader"][following::input[1][@checked][not(ancestor::span)]]/text()
1 голос
/ 20 марта 2020

Вы можете сделать это различными способами, как показано ниже. Вариант 1:

//div[starts-with(@class,'selected_value')][not(parent::span[@class='hidden'])]/preceding-sibling::span/text()

Вариант 2: простейший

//div[starts-with(@class,'selected_value')]/preceding-sibling::span/text()

Вариант 3: Если вы хотите использовать класс span, следуйте этому.

//div[starts-with(@class,'selected_value')]/preceding-sibling::span[@class='productheader']/text()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...