我正在使用许多jQuery插件,这些插件通常会创建没有id或其他标识属性的DOM元素,而在Capybara中获取它们的唯一方法(例如单击)-首先获取其邻居(其祖先的另一个孩子) 。但是我什么都没找到,水豚支持这样的事情,例如:
find('#some_button').parent.fill_in "Name:", :with => name
?
我正在使用许多jQuery插件,这些插件通常会创建没有id或其他标识属性的DOM元素,而在Capybara中获取它们的唯一方法(例如单击)-首先获取其邻居(其祖先的另一个孩子) 。但是我什么都没找到,水豚支持这样的事情,例如:
find('#some_button').parent.fill_in "Name:", :with => name
?
Answers:
我确实发现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,".//..")
改用。
.//..
找到父项,就..
足够了,也永远不会模棱两可。
这个答案是关于如何操纵同级元素的,这是我认为原始问题所暗示的
您的问题假设需要进行一些细微调整。如果动态生成的字段如下所示,并且没有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')
希望能有所帮助。
我需要找到一个具有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
警告:请谨慎使用此功能,这可能会花费您大量时间进行测试,因此请确保距离祖先只有几步之遥。
break if ancestor[:class].split(" ").include?(css_class)
。
ancestor(selector)
内置的方法见。github.com/teamcapybara/capybara/commit/...