Как получить родительский узел в капибара?



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



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


?

603   8  

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

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

find(:xpath, '..')

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

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 (будьте осторожны с ними, хотя как в угловые, они имеют обыкновение меняться на основе добавления и удаления элементов) это было бы что-то вроде этого:

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

    Ничего не найдено.