Я работаю со многими плагинами jQuery, которые часто создают элементы DOM без идентификатора или других свойств идентификации, и единственный способ получить их в Capybara (например, для щелчка) - сначала получить их соседа (другого дочернего элемента его предка) . Но нигде не нашел, поддерживает ли Capybara например такие вещи:
find('#some_button').parent.fill_in "Name:", :with => name
?
Ответы:
Я действительно нашел ответ jamuraa полезным, но переход на полный xpath дал мне кошмар строки в моем случае, поэтому я с радостью использовал возможность объединить find в Capybara, что позволило мне смешивать выбор css и xpath. Тогда ваш пример будет выглядеть так:
find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name
Обновление Capybara 2.0 :
find(:xpath,".//..")
скорее всего, приведет кAmbiguous match
ошибке. В этом случае используйтеfirst(:xpath,".//..")
вместо этого.источник
.//..
искать родителя -..
достаточно, и это тоже никогда не будет двусмысленным.Это невозможно сделать с помощью capybara и CSS. Раньше я использовал XPath для достижения этой цели, у которого есть способ получить родительский элемент и который поддерживается Capybara:
find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name
источник
find(:xpath, '//*[@id="some_button"]/..')
Я нашел следующее, что действительно работает:
find(:xpath, '..')
Capybara была обновлена для поддержки этого.
https://github.com/jnicklas/capybara/pull/505
источник
Если вы наткнулись на это, пытаясь выяснить, как найти любой родительский (как в предке ) узел (как указано в комментарии @ vrish88 к ответу @Pascal Lindelauf):
find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')
источник
Этот ответ относится к тому, как манипулировать элементом-братом, и я считаю, что исходный вопрос ссылается на
Гипотеза вашего вопроса работает с небольшой поправкой. Если динамически сгенерированное поле выглядит так и не имеет идентификатора:
<div> <input></input> <button>Test</button> </div>
Тогда ваш запрос будет таким:
find('button', text: 'Test').find(:xpath, "..").find('input').set('whatever')
Если к динамически сгенерированному вводу прилагается элемент id (будьте осторожны с ними, хотя, как и в angular, они обычно меняются в зависимости от добавления и удаления элементов), это будет примерно так:
find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever')
Надеюсь, это поможет.
источник
Я использую другой подход, сначала нахожу родительский элемент, используя текст внутри этого родительского элемента:
find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name
Может быть, это пригодится в похожей ситуации.
источник
Мне нужно было найти предка с классом css, хотя было неизвестно, есть ли у целевого предка один или несколько классов css, поэтому я не видел способа сделать детерминированный запрос xpath. Вместо этого я работал над этим:
def find_ancestor_with_class(field, cssClass) ancestor = field loop do ancestor = ancestor.find(:xpath, '..') break if ancestor.nil? break if ancestor.has_css? cssClass end ancestor end
Предупреждение: используйте это экономно, это может стоить вам много времени на тесты, поэтому убедитесь, что предок находится всего в нескольких шагах от вас.
источник
break if ancestor[:class].split(" ").include?(css_class)
.ancestor(selector)
метод. См. Github.com/teamcapybara/capybara/commit/ ...Вот
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent
Присутствует родительский метод;)
источник