Как получить родительский узел в Капибаре? - PullRequest
80 голосов
/ 01 февраля 2011

Я работаю со многими плагинами jQuery, которые часто создают элементы DOM без идентификатора или других свойств идентификации, и единственный способ получить их в Capybara (для щелчка, например) - это получить их соседа (другого потомка егопредок) первый.Но я нигде не нашел, поддерживает ли Capybara такие вещи, например:

find('#some_button').parent.fill_in "Name:", :with => name

?

Ответы [ 8 ]

105 голосов
/ 07 июля 2011

Я действительно нашел ответ Джамураа полезным, но переход на полный xpath дал мне кошмар строки в моем случае, поэтому я с радостью воспользовался возможностью объединить находки в Capybara, что позволило мне смешивать css и xpath selection. Ваш пример будет выглядеть так:

find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name

Обновление Capybara 2.0 : find(:xpath,".//.."), скорее всего, приведет к ошибке Ambiguous match. В этом случае используйте first(:xpath,".//..").

38 голосов
/ 01 февраля 2011

Нет способа сделать это с капибарой и CSS.Я использовал XPath в прошлом для достижения этой цели, который имеет способ получить родительский элемент и поддерживается Capybara:

find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name
29 голосов
/ 16 августа 2012

Я нашел следующее, что работает:

find(:xpath, '..')

Капибара была обновлена ​​для поддержки этого.

https://github.com/jnicklas/capybara/pull/505

9 голосов
/ 08 января 2014

Если вы наткнулись на эту попытку, пытаясь выяснить, как найти какой-либо родительский (как в предке ) узел (как намекает комментарий @ vrish88 к ответу @Pascal Lindelauf):

find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')
4 голосов
/ 08 марта 2016

Этот ответ относится к тому, как манипулировать элементом родного брата, на что, как я полагаю, исходный вопрос ссылается на

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

<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')

Надеюсь, это поможет.

4 голосов
/ 25 апреля 2012

Я использую другой подход, сначала находя родительский элемент, используя текст в этом родительском элементе:

find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name

Возможно, это полезно в подобной ситуации.

2 голосов
/ 07 ноября 2014

Мне нужно было найти предка с классом 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

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

0 голосов
/ 30 января 2013

Вот оно

http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent

Существует родительский метод;)

...