2016-07-14 4 views
3

Я хочу, чтобы выбрать поверочного элемент следующие только ведущих стран или только в других странахКак фильтровать элементы на основе XPATH?

<div> 
    <div> 
    <span class="hb">Top Countries</span> 
    </div> 
    <span>Australia</span> 
    <span>Guinea-Bissau</span> 
    <div> 
    <span class="hb">Other</span> 
    </div> 
    <span>Austria</span> 
    <span>Mauritania</span> 
    <span>Mauritius</span> 
    <span>Nauru</span> 
    <span>Palau</span> 
    <span>Saudi Arabia</span> 
</div> 

Я попытался с //*[text()='Top Countries']/../following-sibling::span and not(//*[text()='Other']/../following-sibling::span)

Если я пытаюсь как XPATH по отдельности они работают, но в сочетании, они не работают.

Я хочу выбрать только лучшие страны и их включить в список: ['Australia', 'Guinea-Bissau'] и отфильтровать другие страны.

Если я использую //*[text()='Top Countries']/../following-sibling::span, все страны выбираются. то есть. ['Australia', 'Guinea-Bissau', 'Spain', 'Switzerland', 'UK', 'USA', 'Austria','Mauritania', 'Mauritius','Nauru','Palau','Saudi Arabia']

С //*[text()='Other']/../following-sibling::span пункта выбран в ['Austria','Mauritania', 'Mauritius','Nauru','Palau','Saudi Arabia']

список генерируется динамически, так что я не могу выбрать их на основе текста/название страны.

+0

уточните, что вы пытаетесь сделать? Если каждый xpath работает отдельно, и вы только хотите получить тот или другой, то просто используйте отдельные xpaths. –

+0

@BreaksSoftware добавлено уточнение – pr4bh4sh

ответ

2

Это:

//span[preceding-sibling::div[1]/descendant::text()='Top Countries'] 

Этот выбор:

Element='<span>Australia</span>' 
Element='<span>Guinea-Bissau</span>' 


Очевидно, что для выбора только другие страны:

//span[preceding-sibling::div[1]/descendant::text()='Other'] 


Смотрите замечательный online xpath tester.

+0

Спасибо за быстрый ответ, '' '// span [text() = 'Top Countries'] /../ next-sibling :: span''' выбирает все элементы, которые я хочу выбрать только [ Австралия ',' Гвинея-Бисау '] – pr4bh4sh

+0

@ pr4bh4sh: Я вижу, обновил запрос. – Jan

+1

Спасибо @Jan. Маленькое объяснение, почему я выбрал этот ответ или решил получить элементы таким образом. Список очень динамичный, случаи здесь, либо верхний, либо другой будут присутствовать, оба будут присутствовать, и не будут присутствовать. Если я не пойду с локаторами Яна, я в конечном итоге вложу, если еще и манипуляции с списками. С этими локаторами всего две проверки и отсутствие манипуляции списком вообще. – pr4bh4sh

0

Помогает ли это? Предполагая, что всегда есть две страны под Лучшие страны.

//span[text() = 'Top Countries']/../following-sibling::span[1] 
//span[text() = 'Top Countries']/../following-sibling::span[2] 
0

Вы можете создать два списка, один со всеми элементами и один с нежелательными элементами

List<WebElement> all = driver.findElements(By.xpath("//*[text()='Top Countries']/../following-sibling::span")); 
List<WebElement> other = driver.findElements(By.xpath("//*[text()='Other']/../following-sibling::span")); 

И чем ИЗВЛЕКИТЕ other странам

all.removeAll(other); 

all теперь будет содержать только " Top Countries "