Get select value of dropdown for capybara testing

前端 未结 6 1997
说谎
说谎 2020-12-24 10:33

I have to write tests for a web site. I am trying to get the selected value of a dropdown box. So far i can get the contents of the dropdown by doing

find_f         


        
相关标签:
6条回答
  • 2020-12-24 10:50

    If you want to find the current selected text, without assuming what it might be so that you can just compare it to an expectation, the following works even if the selection was made by JS (so that there is no 'option[selected]').

    First I find the value of the select, then I find the text of the option with that value:

      def selected(selector)
        value = find(selector).value
        text = find(selector).find("option[value='#{value}']").text
      end
    
    0 讨论(0)
  • 2020-12-24 10:52

    If you only need to assert if a field is selected with a given option, the straightforward answer is

    #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
    

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

    But the title of your question is "Get select value for dropdown". And I've run into a similar problem where I would like not only to assert the selection, but also retrieve the text and value of the selected field. I've found no straight way on API. The easiest way I've found was: #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
    

    This gives me a more comprehensive error message when the assertion fails.

    If there's multiple selections you can use #select in place of #find, as in #all("option").select &:selected?. It will return an Array.

    This answer doesn't rely on the 'option[selected]' trick as the previous ones, so it works even if the selection is done by Javascript (which was the reason why the previous answers didn't work for me at all).

    Tested on:

    capybara (2.2.1)
    capybara-webkit (1.1.0)
    cucumber (1.3.14)
    cucumber-rails (1.4.0)
    
    0 讨论(0)
  • 2020-12-24 11:02

    There's a have_select matcher if you use Capybara with Rspec:

    expect(page).to have_select('my-select', selected: 'Option 2')
    
    0 讨论(0)
  • 2020-12-24 11:04

    Very simple way to get value of selected option is:

    find("#restrictions__rating_movies").value
    

    This will return selected select option value.

    0 讨论(0)
  • 2020-12-24 11:08
    find_field('restrictions__rating_movies').find('option[selected]').text
    
    0 讨论(0)
  • 2020-12-24 11:13

    Would something like this work?

    within("//select[@id='restrictions__rating_movies']") do
      find_field("//option[@selected='selected']").text
    end
    
    0 讨论(0)
提交回复
热议问题