如何在Capybara中获取父节点?

时间:2011-02-01 11:18:09

标签: ruby-on-rails ruby cucumber bdd capybara

我正在使用许多jQuery插件,这些插件经常创建没有id或其他标识属性的DOM元素,而在Capybara中获取它们的唯一方法(例如点击) - 是为了得到他们的邻居(它的另一个孩子)祖先)首先。但我没有找到任何地方,例如Capybara支持这样的事情:

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

9 个答案:

答案 0 :(得分:104)

我真的觉得jamuraa的答案很有帮助,但是在我的情况下,使用完整的xpath给了我一个字符串的噩梦,所以我很高兴地利用了在Capybara中连接find的能力,允许我混合css和xpath选择。您的示例将如下所示:

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

Capybara 2.0更新find(:xpath,".//..")很可能会导致Ambiguous match错误。在这种情况下,请改用first(:xpath,".//..")

答案 1 :(得分:38)

用capybara和CSS无法做到这一点。我过去曾使用XPath来实现这个目标,它确实有一种获取父元素的方法,并且得到了Capybara的支持:

find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name

答案 2 :(得分:28)

我发现以下内容确实有效:

find(:xpath, '..')

Capybara已经更新以支持这一点。

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

答案 3 :(得分:9)

如果你偶然发现了这个试图弄清楚如何找到任何父节点(如祖先)节点(正如@vrish88对@Pascal Lindelauf的回答所暗示的那样):

find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')

答案 4 :(得分:4)

我使用不同的方法,首先使用此父元素中的文本查找父元素:

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

也许这在类似的情况下很有用。

答案 5 :(得分:4)

这个答案涉及如何操纵兄弟元素,这是我认为原始问题暗指

您的问题假设适用于小调整。如果动态生成的字段看起来像这样,并且没有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')

希望有所帮助。

答案 6 :(得分:2)

我需要找到一个带有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

警告:谨慎使用,这可能会花费你很多时间在测试中,所以要确保祖先只是几跳。

答案 7 :(得分:1)

正如@Tyler Rick Capybara 在评论中提到的,这些天有方法[ ancestor(selector) and sibling(selector)

答案 8 :(得分:-5)