Capybara(2.1.0)を使用してドロップダウンメニューから項目を選択しようとしています。
番号で選択したい(2番目、3番目などのオプションを選択することを意味する)。
私はあらゆる種類のものを試して狂気のようにグーグルでしたが、運はありません。
値を使用して選択できました:
find("option[value='4c430d62-f1ba-474f-8e8a-4452c55ea0a8']").click
しかし、私はその方法を使用したくありませんb/c値は変化するものであり、それは私のテストを脆弱にします。
ドロップダウンのHTMLは次のとおりです。
<td class="value">
<select name="organizationSelect" id="organizationSelect" class="required">
<option value="NULL">Choose...</option>
<option value="4c430d62-f1ba-474f-8e8a-4452c55ea0a8"> Institution1</option>
<option value="e1a4efa7-352d-410a-957e-35c8a3b92944"> Institution / test</option>
</select>
</td>
私もこれを試しました:
option = find(:xpath, "//*[@id='organizationSelect']/option[2]").text
select(option, :from => organizationSelect)
ただし、次のエラーが発生します。
Ambiguous match, found 2 elements matching option "Institution" (Capybara::Ambiguous)
だから、ドロップダウンから(カピバラを使用して)最初、2番目、3番目などのオプションを選択するにはどうすればよいですか?
select
メソッドのソース を見ると、from
キーを渡すときに何が行われるかが本質的にわかります。
find(:select, from, options).find(:option, value, options).select_option
つまり、興味のある<select>
を見つけ、その中から<option>
を見つけ、select_option
ノードで<option>
を呼び出します。
あなたはすでに最初の2つのことをほとんど完了しました、私はそれらを再配置したいと思います。次に、最後にselect_option
メソッドを追加します。
find('#organizationSelect').find(:xpath, 'option[2]').select_option
何らかの理由でそれは私のために機能しませんでした。だから私は何か他のものを使わなければなりませんでした。
select "option_name_here", :from => "organizationSelect"
私のために働いた。
別のオプションは、このようなメソッドを追加することです
def select_option(css_selector, value)
find(:css, css_selector).find(:option, value).select_option
end
残念ながら、最も人気のある答えは私には完全に機能しませんでした。ステートメントの最後に.select_option
を追加する必要がありました
select("option_name_here", from: "organizationSelect").select_option
select_option
なしでは、選択は実行されませんでした
パイルにさらに別の答えを追加するには(明らかに設定に応じて非常に多くの方法があるため)-リテラルoption
要素を選択してクリックすることでそれを行いました
find(".some-selector-for-dropdown option[value='1234']").select_option
あまりきれいではありませんが、動作します:/
2017年にcapybara 2.7を使用した場合、どの回答も機能しませんでした。 「ArgumentError:引数の数が間違っています(2が与えられ、2が期待されます)」
しかし、これは:
find('#organizationSelect').all(:css, 'option').find { |o| o.value == 'option_name_here' }.select_option
直接的な答えではありませんが、次のことができます(サーバーが許可する場合)。
1)組織のモデルを作成します。 extra:HTMLを追加するのが簡単になります。
2)モデルのファクトリー(FactoryGirl)を作成します。
3)ファクトリーでリスト(create_list)を作成します。
4)リストから組織を「選択」(サンプル):
# Random select
option = Organization.all.sample
# Select the FIRST(0) by id
option = Organization.all[0]
# Select the SECOND(1) after some restriction
option = Organization.where(some_attr: some_value)[2]
option = Organization.where("some_attr OP some_value")[2] #OP is "=", "<", ">", so on...
ここに私が見つけた最も簡潔な方法があります(capybara 3.3.0とクロムドライバーを使用):
all('#id-of-select option')[1].select_option
2番目のオプションを選択します。必要に応じてインデックスを増やします。