Выберите несколько, но не все (например,//*) имена тегов с помощью XPath?

#html #css #xml #selenium #xpath

Вопрос:

Я запускаю автоматизацию на веб-странице, на которой много элементов в форме:

 <label ...>"label name"</label>
<div ...></div>
 

И мне нужно щелкнуть по <div> элементу. У меня есть функция, которая находит его с помощью xpath:

 driver.findElement(By.xpath("//label[contains(text(),'value')]/following-sibling::div"))
 

Однако некоторые элементы имеют несколько иную форму. Например, один из них имеет форму:

 <label ...>"label name"</label>
<br ...></br>
<input ...></input>
 

И мне нужно щелкнуть по <input> элементу. Я не могу просто использовать /following-sibling::* , потому <br> что элемент является следующим родным братом.

Я мог бы легко просто написать другую функцию, используя <input> , но я бы предпочел просто обновить и повторно использовать функцию, которая у меня уже есть (и мне любопытно). Есть ли способ указать, что элемент может иметь одно из нескольких имен тегов?

Может быть, что-то вроде: /following-sibling::[div or input]

Ответ №1:

Этот XPath,

 //label[.='l1']/following-sibling::*[self::div or self::input]
 

будет выбраны все div или input родственные элементы, следующие за label элементом со строковым значением l1 .