2015-05-11 6 views
1

Я пытаюсь найти методы поиска в Капибаре и не испытываю большой удачи. Я бы ожидал, что вторая находка будет искать текст только в результатах первого поиска. Однако второй поиск ищет весь документ.Цепные находки в Капибаре?

element = page_foo.find('.bar') 
element.find('div', :text => "name") 

=> All divs with the text "name" on the page. 

Раствор с помощью XPath описан здесь:

capybara - Find with xPath is leaving the within scope

Однако, я не слишком хорошо знаком с XPath и надеюсь найти способ работать вокруг него.

Дополнительная информация:

HTML:

<div data-id="tabMeListProducts"> 
    <div class=" title">My BMW 5-SERIES GRAN TURISMO.</div> 
</div> 

<div data-id="tabMeListPosts"> 
    <div class="name">My BMW 5-SERIES GRAN TURISMO.</div> 
</div> 

RSpec:

element = page_foo.find('[data-id="tabMeListProducts"]') 
    =>#<Capybara::Element tag="div"> 
element.find('div', :text => "My BMW 5-SERIES GRAN TURISMO.") 
    =>Capybara::Ambiguous: Ambiguous match, found 2 elements matching css "div" with text "My BMW 5-SERIES GRAN TURISMO." 

Как видно из приведенного выше примера охват второго ФАЙНД является вся страница, и не содержится в элемент, пройденный начальной находкой.

Я бы ожидал, что поиск будет искать только в div, содержащемся в переменной «element».

+0

Не могли бы вы объяснить: что вы пытаетесь сделать с вашей находкой? Некоторые примеры данных, и какими должны быть результаты, которые вы ожидаете, и каковы результаты, которые вы получаете вместо этого? –

+0

Также: вы считали использование «внутри»? например 'in find ('. bar') {find ('div',: text =>" name ")}' –

+0

Привет, Тарын, я ценю, что вы пытаетесь помочь. Вопрос был обновлен на основе ваших отзывов. – lcharbon

ответ

1

Я согласен с @Taryn, вам нужно использовать в syntex. i.e

within(".bar")do 
    find('div', :text => "name") 
end 
+0

То, как настроено мое тестирование, передается переменная «элемент», содержащая элемент для поиска в качестве параметра и должна выполнять поиск с использованием этой переменной. Можно ли сделать что-нибудь подобное. 'in (element) do find ('div',: text =>" name ") end' – lcharbon

+0

Зачем вам это нужно, когда выше работает? –

3

Я помню вложенные находки, работающие в прошлых версиях Огурца или Капибары. Однако все меняется с каждой версией. Несмотря на это, ваш пример легче обрабатывать с помощью вложенных выражений CSS вместо того, чтобы полагаться на несколько находок.

Например:

page_foo.find('[data-id="tabMeListProducts"] .title') или

page_foo.find('[data-id="tabMeListProducts"] div', :text => "My BMW 5-SERIES GRAN TURISMO.")

Если имеется несколько вхождений, я хотел бы использовать all вместо find и запустить свой собственный Ruby, логику проверки на коллекции.

Кроме того, within обычно работает в качестве альтернативы (не нужно называть find с ним в качестве одного ответа упоминалось, вы можете добавить CSS непосредственно рядом с ним):

within '[data-id="tabMeListProducts"]' do element.find('div', :text => "My BMW 5-SERIES GRAN TURISMO.") end

Наконец, если вы настаиваете на используя вложенные вызовы поиска, попробуйте сделать их на одной и той же строке Ruby, как указано в документации Capybara: page.find('#foo').find('.bar') Возможно, она ленива, но активируется в конце строки Ruby (через метапрограммирование проверяет номер строки).

Если все остальное терпит неудачу, открыть вопрос GitHub: http://www.rubydoc.info/github/jnicklas/capybara/Capybara/Node/Finders#find-instance_method

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

Удачи вам! Я понимаю, что это может быть неприятной проблемой, но я уверен, что у вас это получилось!

Смежные вопросы