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 を使用しています。1 つの 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
ただし、ここでは 2 つの DataSet を GraphPane に関連付ける必要があり、find(:css, '.input-many-item select')
一致するノードが 2 つあるため失敗します。
常に最後のものを選択できればうまくいくように思えますが、カピバラのセレクターでこれを行う方法がわかりません。(問題の一部は、私が見つけたほとんどの例で、それらが 1.x DSL を参照しているのか、2.x シリーズを参照しているのかがはっきりしないことだと思います。)
これをエレガントに整理するためのアイデアは大歓迎です。