How to select date from a select box using Capybara in Rails 3?

后端 未结 11 1476
梦如初夏
梦如初夏 2020-12-05 10:27

I\'m writing a spec for a controller in Rails 3 project using RSpec and Capybara, and I want to select current date from a select box. I tried:

select Date.t         


        
相关标签:
11条回答
  • 2020-12-05 11:10

    The following worked for me, using a date_field:

    fill_in "Date", with: DateTime.now.strftime('%m/%d/%Y')
    
    0 讨论(0)
  • 2020-12-05 11:12

    You need to specify the exact value as it's in the select menu in html. So if your select has values like "2011/01/01" then you need to write:

    select '2011/01/01', :from => 'Date of birth'
    

    Your code fails because you pass a date object.

    0 讨论(0)
  • 2020-12-05 11:12

    Had the same problem. I googled at lot and solved it this way:

    1. Wrote date select macros into /spec/request_macros.rb The select_by_id method is necessary for me, because the month is dependent on the translation

      module RequestMacros
        def select_by_id(id, options = {})
          field = options[:from]
          option_xpath = "//*[@id='#{field}']/option[#{id}]"
          option_text = find(:xpath, option_xpath).text
          select option_text, :from => field
        end
      
        def select_date(date, options = {})
          field = options[:from]
          select date.year.to_s,   :from => "#{field}_1i"
          select_by_id date.month, :from => "#{field}_2i"
          select date.day.to_s,    :from => "#{field}_3i"  
        end
      end
      
    2. Added them to my /spec/spec_helper.rb

      config.include RequestMacros, :type => :request
      

    Now in my integration tests in spec/requests i can use

    select_date attr[:birthday], :from => "user_birthday"
    

    Thanks to http://jasonneylon.wordpress.com/2011/02/16/selecting-from-a-dropdown-generically-with-capybara/ and https://gist.github.com/558786 :)

    0 讨论(0)
  • 2020-12-05 11:12

    I found a clean solution for rspec and capybara to test using date and time select methods, where in your HTML you use a datetime select or date select. This works with Rails 4, RSpec 3.1 and Capybara 2.4.4.

    Say in your HTML form you have the following:

    <%= f.datetime_select(:start_date, {default: DateTime.now, prompt: {day: 'Choose day', month: "Choose month", year: "Choose year"}}, {class: "date-select"}) %>
    

    the DateTime Select View helper will create 5 select fields with ids such as id="modelname_start_date_1i", where the id the is appended with 1i, 2i, 3i, 4i, 5i. By default Year, Month, Day, Hour, Minute. If you change the order of the fields, make sure to change the feature helper below.

    1) Create a Feature Helper for dates and times helpers

    spec/support/helpers/date_time_select_helpers.rb

    module Features
      module DateTimeSelectHelpers
    
        def select_date_and_time(date, options = {})
          field = options[:from]
          select date.strftime('%Y'),  :from => "#{field}_1i" #year
          select date.strftime('%B'),  :from => "#{field}_2i" #month
          select date.strftime('%-d'), :from => "#{field}_3i" #day 
          select date.strftime('%H'),  :from => "#{field}_4i" #hour
          select date.strftime('%M'),  :from => "#{field}_5i" #minute
        end
    
        def select_date(date, options = {})
          field = options[:from]
          select date.strftime('%Y'),  :from => "#{field}_1i" #year
          select date.strftime('%B'),  :from => "#{field}_2i" #month
          select date.strftime('%-d'), :from => "#{field}_3i" #day 
        end
      end
    end 
    

    Note that for the day I use %-d that gives you a non-padded numeric value (i.e. 4) instead of %d that has a zero-padded numeric value (i.e. 04). Check the date formats with strftime

    2) You then need to include your date and time helpers methods in spec/support/helpers.rb so you can use them in any spec file.

    require 'support/helpers/date_time_select_helpers'
    RSpec.configure do |config|
      config.include Features::DateTimeSelectHelpers, type: :feature
    end
    

    3) In your Spec file you can call your helper. For example:

    feature 'New Post' do
      scenario 'Add a post' do
        visit new_post_path
        fill_in "post[name]", with: "My post"
        select_date_and_time(2.days.from_now, from:"post_start_date")
        click_button "Submit"
        expect(page).to have_content "Your post was successfully saved"
      end
    end
    
    0 讨论(0)
  • 2020-12-05 11:16

    with credit to Markus Hartmair for an excellent solution, I prefer to use labels as selectors because of improved readability. So my version of his helper module is:

    module SelectDateHelper
      def select_date(date, options = {})
        field = options[:from]
        base_id = find(:xpath, ".//label[contains(.,'#{field}')]")[:for]
        year, month, day = date.split(',')
        select year,  :from => "#{base_id}_1i"
        select month, :from => "#{base_id}_2i"
        select day,   :from => "#{base_id}_3i"
      end
    end
    

    call it like this:

    select_date "2012,Jan,1", :from => "From date"
    
    0 讨论(0)
提交回复
热议问题