65

Webサイトのテストを作成する必要があります。ドロップダウンボックスの選択された値を取得しようとしています。これまでのところ、ドロップダウンの内容を取得するには、

find_field('restrictions__rating_movies').text

戻り値-映画を許可しないGPGM R13 R15 R16 R18RRP16すべての映画を許可する

選択したオブジェクトの値を取得できます。

find_field('restrictions__rating_movies').value

戻り値-1000

ドロップダウンボックスから選択したアイテムのテキストを取得しようとしているので、これはあまり役に立ちません。

<select class="" id="restrictions__rating_movies" name="restrictions[][rating_movies]">            
<option value="0">Don't Allow Movies</option>
<option value="100">G</option>
<option value="200">PG</option>
<option value="300">M</option>
<option value="325">R13</option>
<option value="350">R15</option>
<option value="375">R16</option>
<option value="400">R18</option>
<option value="500">R</option>
<option value="600">RP16</option>
<option value="1000" selected="selected">Allow All Movies</option></select>

この場合、「すべての映画を許可」という値を取得する必要があります。上記の2つの例のさまざまな組み合わせを試しました。

4

7 に答える 7

163

have_selectRspecでCapybaraを使用する場合は、マッチャーがあります。

expect(page).to have_select(
  'my-select',         # locator
  selected: 'Option 2' # option
) 
パラメーター:

Locator(String)(デフォルト:nil)—選択ボックスのラベル、名前、またはIDオプション(ハッシュ)using :selected(String、Array)—選択する必要のあるオプション

于 2013-09-04T20:15:47.673 に答える
43
find_field('restrictions__rating_movies').find('option[selected]').text
于 2012-07-16T14:59:18.783 に答える
13

選択したオプションの値を取得する非常に簡単な方法は次のとおりです。

find("#restrictions__rating_movies").value

これにより、選択した選択オプション値が返されます。

于 2014-08-26T16:00:18.117 に答える
4

特定のオプションでフィールドが選択されている場合にのみアサートする必要がある場合、簡単な答えは次のとおりです。

#Find a select box by (label) name or id and assert the given text is selected
When /^select box "([^"]*)" is selected with "([^"]*)"$/ do |dropdown, selected_text|    
  assert page.has_select?(dropdown, selected: selected_text)
end

ソース: http: //rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_select%3F-instance_method

ただし、質問のタイトルは「ドロップダウンの選択値を取得」です。また、選択をアサートするだけでなく、選択したフィールドのテキストと値を取得したいという同様の問題が発生しました。APIをまっすぐに見つける方法は見つかりませんでした。私が見つけた最も簡単な方法は次のとおりです。#all("option").find &:selected?

When /^ select box "([^"]*)" is selected with "([^"]*)"$/ do |dropdown, selected_text|
  sb = find_field(dropdown)
  sb_selected = sb.all("option").find &:selected?
  msg = "Selected: #{sb_selected.text.inspect} - value:#{sb_selected.value.inspect}"
  assert page.has_select?(dropdown, selected: selected_text), msg
end

これにより、アサーションが失敗したときに、より包括的なエラーメッセージが表示されます。

複数の選択肢がある場合は、のように#findの代わりに#selectを使用できます#all("option").select &:selected?。配列を返します。

この回答は、前の回答のように「option [selected]」トリックに依存していないため、選択がJavascriptによって行われた場合でも機能します(これが、以前の回答がまったく機能しなかった理由です)。

テスト済み:

capybara (2.2.1)
capybara-webkit (1.1.0)
cucumber (1.3.14)
cucumber-rails (1.4.0)
于 2014-06-28T15:58:25.747 に答える
2

現在選択されているテキストを、期待値と比較できるように想定せずに検索したい場合は、JSが選択した場合でも、次のように機能します(「option[selected]」がないため)。 )。

最初にselectの値を見つけ、次にその値を持つオプションのテキストを見つけます。

  def selected(selector)
    value = find(selector).value
    text = find(selector).find("option[value='#{value}']").text
  end
于 2018-01-31T16:44:09.867 に答える
0

要素を指定してテキストを返す簡単な関数を作成しますselect(ドロップダウン)。

def get_dropdown_selected_item_text(dropdown)
  value = dropdown.value
  return dropdown.all(:css, "option").select {|opt| opt.value == value} .first.text
end
于 2021-04-15T23:10:11.307 に答える
-1

このようなものは機能しますか?

within("//select[@id='restrictions__rating_movies']") do
  find_field("//option[@selected='selected']").text
end
于 2012-07-16T09:25:35.563 に答える