如何获得水豚的父节点?

我正在使用许多jQuery插件,这些插件经常创build没有id或其他标识属性的DOM元素,并且只有在水豚(例如点击)中获得它们的唯一方法是先让邻居(它的祖先的另一个孩子) 。 但是我没有find任何地方,水豚支持这样的事情,例如:

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

我真的发现jamuraa的答案很有帮助,但是在完整的xpath中给了我一个恶作剧的例子,所以我很高兴地使用了在水豚中连接find的能力,允许我混合使用css和xpathselect。 你的例子将如下所示:

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

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

没有办法与水豚和CSS做到这一点。 我过去使用过XPath来完成这个目标,但是有一种获得父元素的方式,并且由Capybara支持:

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

这不是为我工作,与错误:

 Ambiguous match, found 2 elements matching xpath ".//.." 

我发现以下工作:

 find(:xpath, '..') 

水豚已经更新,以支持这一点。

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

如果偶然发现了这个问题,试图找出如何find任何父节点(就像在祖先节点中一样)(正如@Pr @ r @ Lindelauf的回答@ vrish88的评论所暗示的那样):

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

这个答案是关于如何操作一个兄弟元素,这是我相信原来的问题暗指

你的问题假设只需稍作调整即可。 如果dynamic生成的字段看起来像这样,并没有一个id:

 <div> <input></input> <button>Test</button> </div> 

您的查询将是:

 find('button', text: 'Test').find(:xpath, "..").find('input').set('whatever') 

如果dynamic生成的input确实附加了一个id元素(小心这些虽然在angular度,他们是不会改变的基础上添加和删除元素),这将是这样的:

 find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever') 

希望有所帮助。

我正在使用不同的方法,首先使用此父元素中的文本find父元素:

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

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

我需要find一个具有css类的祖先,尽pipe如果目标祖先有一个或多个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 

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