web-dev-qa-db-ja.com

Capybaraを使用してドロップダウンでオプションを選択する方法

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">&nbsp;Institution1</option>
     <option value="e1a4efa7-352d-410a-957e-35c8a3b92944">&nbsp;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番目などのオプションを選択するにはどうすればよいですか?

114
Farooq

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
122
carols10cents

何らかの理由でそれは私のために機能しませんでした。だから私は何か他のものを使わなければなりませんでした。

select "option_name_here", :from => "organizationSelect"

私のために働いた。

158
RVM

別のオプションは、このようなメソッドを追加することです

  def select_option(css_selector, value)
    find(:css, css_selector).find(:option, value).select_option
  end
5
montrealmike

残念ながら、最も人気のある答えは私には完全に機能しませんでした。ステートメントの最後に.select_optionを追加する必要がありました

select("option_name_here", from: "organizationSelect").select_option

select_optionなしでは、選択は実行されませんでした

3
Sam D

パイルにさらに別の答えを追加するには(明らかに設定に応じて非常に多くの方法があるため)-リテラルoption要素を選択してクリックすることでそれを行いました

find(".some-selector-for-dropdown option[value='1234']").select_option

あまりきれいではありませんが、動作します:/

2
user2490003

2017年にcapybara 2.7を使用した場合、どの回答も機能しませんでした。 「ArgumentError:引数の数が間違っています(2が与えられ、2が期待されます)」

しかし、これは:

find('#organizationSelect').all(:css, 'option').find { |o| o.value == 'option_name_here' }.select_option
2
bjelli

直接的な答えではありませんが、次のことができます(サーバーが許可する場合)。

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... 
1

ここに私が見つけた最も簡潔な方法があります(capybara 3.3.0とクロムドライバーを使用):

all('#id-of-select option')[1].select_option

2番目のオプションを選択します。必要に応じてインデックスを増やします。

0
pduey