我正在使用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>
注意 GraphPanes 和 DataSets 的连接是多态的(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 系列。)
欢迎提出优雅地解决这个问题的想法。