1

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 シリーズを参照しているのかがはっきりしないことだと思います。)

これをエレガントに整理するためのアイデアは大歓迎です。

4

1 に答える 1

3

答えは、カピバラで「すべて」ファインダーを使用していることが判明しました。

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、常に最後のノードを使用して取得できます。

于 2013-01-10T15:02:23.290 に答える