2017-01-10 3 views
1

Предположим, мы имеем <div class='whatever'> и где-то глубоко внутри есть элемент <div class='inside-whatever'>Селен + водосвинка: найти селектор в любом месте в пределах элемента

Что мне нужно способ доступа, что особенно внутри-независимо -Div с помощью Капибары и/или Селена.

Проблема, есть еще <div class='inside-whatever'> на странице не внутри <div class='whatever'>, так

within(:xpath,'//div[@class="whatever"]') do 
    find(:xpath,'//div[@class="inside-whatever"]) 
end 

возвращает ошибку в основном говорят, что существует несколько внутри-независимо дивы на этой странице.

Что работает, чтобы построить из XPath независимо как

'//div[@class="whatever"]/div/div[3]/div/div[5]'

, но это чистое безумие.

Итак, есть ли лучший способ поиска селектора в любом месте внутри любого элемента без указания прямого пути?

+1

Есть вы пытались просто слить их обоих? '// ДИВ [@ класс = "все"] // ДИВ [@ класс = "внутри-то, что"]'. Вы также можете apend '[1]', чтобы получить только 1-й узел, если capybara требует одного результата. – Granitosaurus

+0

Теперь, сэр, это '// div [@ class =" whatever "] // div [@ class =" inside-whatever "]' действительно действительно работает. Пожалуйста, не стесняйтесь публиковать это как решение. –

ответ

1

Вы можете объединить ваши XPaths так:

//div[@class="whatever"]//div[@class="inside-whatever"] 
+0

Это побеждает всю цель 'in' –

2

Реальная проблема здесь в том, что вы попали в ловушку XPath //

find(:xpath,'//div[@class="inside-whatever"]) 

поиски по всему миру, а не из контекстного узла , Вместо этого вы должны привыкнуть к начиная ваши XPaths с .//, который будет искать из текущего узла контекста

within(:xpath,'.//div[@class="whatever"]') do 
    find(:xpath,'.//div[@class="inside-whatever"]) 
end 

и делать то, что вы ожидаете. Об этом говорится в Capybara README - https://github.com/teamcapybara/capybara#beware-the-xpath--trap

Примечание: CSS селекторы не имеют эту проблему и для большинства элементов людей читают выбрав уборщик, поэтому Капибара по умолчанию в: CSS селектор

within('div.whatever') do 
    find('div.inside-whatever") 
end