我正在使用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_set
或data_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系列。)
欢迎优雅地对此进行整理的想法。
答案 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
all
与find
类似,但它会返回一个匹配节点数组,因此我可以使用.last
并始终获取最后一个节点。