Как получить родительский узел в капибара?
Я работаю со многими плагинами jQuery, которые часто создают элементы DOM без идентификатора или других идентификационных свойств, и единственный способ получить их в Capybara (например, для щелчка) - это сначала получить своего соседа (другого ребенка своего предка). Но я нигде не нашел, поддерживает ли капибара такие вещи, например:
find('#some_button').parent.fill_in "Name:", :with => name
?
8 ответов:
Я действительно нашел ответ jamuraa полезным, но переход на полный xpath дал мне кошмар строки в моем случае, поэтому я с радостью использовал возможность конкатенации find в Capybara, что позволило мне смешать выбор css и xpath. Ваш пример будет выглядеть так:
find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => nameобновление Capybara 2.0:
find(:xpath,".//..")скорее всего, приведет кAmbiguous matchошибка. В этом случае используйте .
нет способа сделать это с помощью capybara и CSS. Я использовал XPath в прошлом для достижения этой цели, хотя, который имеет способ получить родительский элемент и поддерживается Capybara:
find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name
Если вы наткнулись на это, пытаясь выяснить, как найти любого родителя (как в предка) узел (как намекнул в комментарии @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 (будьте осторожны с ними, хотя как в угловые, они имеют обыкновение меняться на основе добавления и удаления элементов) это было бы что-то вроде этого:
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предупреждение: используйте это экономно, это может стоить вам много времени на тесты, поэтому убедитесь, что предок находится всего в нескольких прыжках отсюда.
здесь
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent
присутствует родительский метод;)
Comments