如何获得水豚的父节点?
我正在使用许多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, '..')
水豚已经更新,以支持这一点。
如果偶然发现了这个问题,试图找出如何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,所以确保祖先只是几跳。