我正在使用许多jQuery插件,这些插件经常创建没有id或其他标识属性的DOM元素,而在Capybara中获取它们的唯一方法(例如点击) - 是为了得到他们的邻居(它的另一个孩子)祖先)首先。但我没有找到任何地方,例如Capybara支持这样的事情:
find('#some_button').parent.fill_in "Name:", :with => name
答案 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)
答案 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)