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


125

カピバラ(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番目などのオプションを選択するにはどうすればよいですか?

回答:


129

あなたが見て取る場合の源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

1
キャロル、どうもありがとう!本当に助けに感謝します!:D
Farooq 2013年

2
将来これを研究する人のために、この参照を追加したいと思います:gist.github.com/zhengjia/428105
BKSpurgeon

3
正解です。Rails 5では、次の方法でも実行できることを追加したいと思いますselect('option_name', from: 'select_box')。値は、id、name、関連するラベル要素です。カピバラとDSLオプションの詳細については、こちらをご覧ください
Nesha Zoric

178

どういうわけか私にはうまくいきませんでした。だから私は何か他のものを使わなければなりませんでした。

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

私のために働いた。


1
奇妙なことに、この方法は少なくとも3つのオプションを取るように見えるので、私にはうまくいきません。あなたが提案したコードはカピバラガイドのサンプルコードと一致しますが。
Linus 14

1
そうformではありませんfrom。ここでの選択に関するドキュメントは
fontno

3
おそらく、from値が名前、ID、またはラベルテキストであることは注目に値します。つまり、「#organizationSelect」は正しくありませんが、「organizationSelect」は機能するはずです。
MZB 2015年

これはうまくいきませんでしたが、carols10centsの解決策はうまくいきました。これはあなたの答えを批判するものではありません。カピバラの最新バージョンでさえ、いくつかの通話は機能し、一部の通話は、直感によって複数のソリューションが有効に見えると思われる場合でも、本当に奇妙だと思います。私を狂わせている。これはFirefox(またはブラウザのカピバラが最終的に使用するもの)に関連していますか?
chaostheory 2015

これは、オプション名とオプション値が同じ場合にのみ機能すると思います。
pixelearth 2017年

8

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

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

役立つオプションfind("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
pixelearth

find(:css, "#search_field").find(:option, "Opp Last Name").select_option表示されたオプションテキストであるは私にとっては機能しましたが、オプションの値は機能しませんでした。
codenoob

4

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

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

なしではselect_option、選択は行われていませんでした


メソッドがブール値を返す.select_optionため、どうしてを呼び出すことができselectますか?
Rubyの

4

パイルにさらに別の答えを追加するには(設定によっては、実行方法が非常に多いため)-リテラルoption要素を選択してクリックしました

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

それはあまりきれいではありませんが、うまくいきます:/


2

2017年のカピバラ2.7では、どの回答も私にとってうまくいきませんでした。「ArgumentError:引数の数が正しくありません(2の場合、0が期待されます)」が表示されました

しかし、これはしました:

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

0

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

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

4
モデルを作成する必要がある場合、カピバラを使用しても意味がありません
user1735921

それはまったく答えではありません。カピバラについての質問です。
ロビン・ドーティ

0

これが私が見つけた最も簡潔な方法です(カピバラ3.3.0とクロムドライバーを使用):

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

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


0

カピバラでxpathでのみ検索を使用できます

find(:xpath, "//*[@id='organizationSelect']/option[2]").click

とメソッドクリック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.