Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Capybara中获取父节点?_Ruby On Rails_Ruby_Cucumber_Bdd_Capybara - Fatal编程技术网

Ruby on rails 如何在Capybara中获取父节点?

Ruby on rails 如何在Capybara中获取父节点?,ruby-on-rails,ruby,cucumber,bdd,capybara,Ruby On Rails,Ruby,Cucumber,Bdd,Capybara,我正在使用许多jQuery插件,这些插件通常创建没有id或其他标识属性的DOM元素,在Capybara中获取它们的唯一方法(例如单击)是首先获取它们的邻居(其祖先的另一个子)。但是我没有找到任何地方,水豚是否支持这样的东西,例如: find('#some_button').parent.fill_in "Name:", :with => name ?水豚和CSS没有办法做到这一点。不过,我在过去使用过XPath来实现这一目标,它确实有一种获取父元素的方法,并且得到了Capybara的支持

我正在使用许多jQuery插件,这些插件通常创建没有id或其他标识属性的DOM元素,在Capybara中获取它们的唯一方法(例如单击)是首先获取它们的邻居(其祖先的另一个子)。但是我没有找到任何地方,水豚是否支持这样的东西,例如:

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

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

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

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

find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name
find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever')

Capybara 2.0更新
find(:xpath,./…)
很可能会导致
不明确匹配
错误。在这种情况下,请先使用
(:xpath,“./..”)

我使用的是另一种方法,首先使用此父元素中的文本查找父元素:

find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name
find(“,text:”您的#some_按钮中的文本”)。在“Name:”中填入:Name

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

我发现以下方法确实有效:

find(:xpath, '..')
水豚已经更新,以支持这一点

在这里


存在父方法;)

如果您在试图找到任何父节点(如在祖先节点中)时偶然发现了这个问题(如@vrish88对@Pascal Lindelauf答案的评论所暗示的):


我需要找到一个带有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
警告:谨慎使用此选项,可能会在测试中花费大量时间,因此请确保祖先仅在几跳之外。

此答案与如何操作兄弟元素有关,我相信原始问题所指的就是兄弟元素。

你的问题假设有一个小的调整。如果动态生成的字段如下所示且没有id:

<div>
  <input></input>
  <button>Test</button>
</div>
如果动态生成的输入确实附带了一个id元素(注意这些元素,尽管在angular中,它们通常不会根据添加和删除元素而改变),则会是这样的:

find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name
find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever')

希望能有所帮助。

正如@Tyler Rick Capybara在评论中提到的,这些天有很多方法[

如果你告诉我,水豚是否会生成带有{display:hidden}的点击元素,这对我来说也是非常有用的,是否有一种方法可以在某个范围内找到元素,其中display!=hidden?这是一个单独的问题,但取决于您使用的驱动程序。webrat会很高兴地找到隐藏的东西,但selenium不会那么高兴地单击您看不到的项目。感谢您的想法--我从来没有想到过!我做el.parent是为了一个好主意我用find(:css)找到了td元素,但由于某种原因我不明白,el.parent返回了#.el.find(:xpath,“./…”)另一方面,返回#,这正是我所需要的。递归查找某个父节点的另一种方法是使用xpath的祖先或自选择器。检查它,您不需要
/…
来查找父节点-只需
就足够了,而且这也从来都不含糊。ty!我知道这个注释对当事人来说有点晚,但我同意在阅读了编辑和Eamon的评论之后,我将其归结为以下内容:el.first(:xpath,“…”)当我进行类似的xpath查找时,我收到一个Nokogiri错误,表示表达式无效。我在表达式中的开方括号前面添加了一个星号来修复表达式:
find(:xpath,/*[@id=“some_button”]/…)
这只为我返回顶级文档。不确定这是驱动程序问题还是什么。阅读文档,这可能意味着“框架”父级,而不是元素父级?加速:将第二个中断替换为
如果祖先[:class]中断(“”)。拆分(“”)。包含?(css\u类)
@hakunin我很好奇你看到了多大的加速?显著?现在无法测试,但是css似乎需要一秒钟,而匹配类似乎是立即的。水豚现在有了一个
祖先(选择器)
内置方法。请看,这是一个很好的选项。将ui操作范围限定到包含某些特定文本的页面部分是我的一个常见用例。在我看来,您似乎正在响应/完成以前的回答(“这是什么”不起作用?”)。如果它是一个完整且独立的答案会更好。因此我建议您编辑它。;-)可以确认。对于最新的Capybara 2.14.4,这是获取父节点的正确方法。