从Capybara 1.1.2中的最后一个匹配选择菜单中选择

时间:2013-01-09 21:27:49

标签: capybara hobo

我正在使用input_many标记处理Hobo应用,以处理表单上的多对多关系。这会在页面上放置+和 - 按钮,+会添加一个新的select标记,用于在关系的另一侧选择模型。这意味着可以有任意数量的select菜单具有非常相似的特征,仅由数组索引区分,如下所示:

<select class="input belongs_to data_set_graph" name="graph_pane[data_set_graphs][0][data_set_id]">
[...options...]
</select>
<select class="input belongs_to data_set_graph" name="graph_pane[data_set_graphs][1][data_set_id]">
[...options...]
</select>

N.B。 GraphPanes和DataSet的连接是多态的(有很多种GraphPanes),因此实际的CSS类名称根据窗格的类型而有所不同 - 可以是data_set_a_graph_pane_data_setdata_set_b_graph_pane_data_set

我们一直在使用Capybara 1.1.2进行测试。只要我们只将一个DataSet与GraphPane相关联,我们就可以使用这样的步骤定义来选择它们:

included_defs.each do |data_set_name|
  click_button "+"
  select_node = find(:css, '.input-many-item select') # There may be more than one of these?
  select_node.find(:xpath, XPath::HTML.option(data_set_name), :message => "cannot select option with text '#{data_set_name}'").select_option
end

但是,现在我们需要将两个DataSet与GraphPane相关联,find(:css, '.input-many-item select')失败,因为有两个匹配的节点。

在我看来,如果我可以随时选择最后一个,这将有效,但我无法弄清楚如何用Capybara的选择器做到这一点。 (我认为问题的一部分是我不清楚,在我发现的大多数例子中,他们是指的是1.x DSL还是2.x系列。)

欢迎优雅地对此进行整理的想法。

1 个答案:

答案 0 :(得分:3)

答案是使用Capybara中的“全部”发现者:

included_defs.each do |data_set_name|
  click_button "+"
  select_node = all(:css, '.input-many-item select').last # There may be more than one of these
  select_node.find(:xpath, XPath::HTML.option(data_set_name), :message => "cannot select option with text '#{data_set_name}'").select_option
end

allfind类似,但它会返回一个匹配节点数组,因此我可以使用.last并始终获取最后一个节点。