web-dev-qa-db-ja.com

カピバラテストのドロップダウンの選択値を取得

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

find_field('restrictions__rating_movies').text

戻り値-映画を許可しないG PG M R13 R15 R16 R18 R RP16すべての映画を許可する

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

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>

この場合、「Allow All Movies」という値を取得する必要があることが示されています。上記の2つの例のさまざまな組み合わせを試しました。

56
Brandon
find_field('restrictions__rating_movies').find('option[selected]').text
40
Brandon

あります - have_select RspecでCapybaraを使用する場合のマッチャー:

expect(page).to have_select('my-select', selected: 'Option 2')
152
gylaz

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

find("#restrictions__rating_movies").value

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

13
Vijay Chouhan

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

_#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
_

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

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

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

テスト済み:

_capybara (2.2.1)
capybara-webkit (1.1.0)
cucumber (1.3.14)
cucumber-Rails (1.4.0)
_
3
Abinoam Jr.

予想と比較できるように、現在の選択されたテキストを検索したい場合は、それが何であるかを仮定せずに、JSによって選択された場合でも次のように動作します( 'option [selected]'がないように) )。

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

  def selected(selector)
    value = find(selector).value
    text = find(selector).find("option[value='#{value}']").text
  end
2
Adam Ehven