web-dev-qa-db-ja.com

Rails 3でCapybaraを使用して、選択ボックスから日付を選択する方法は?

RSpecとCapybaraを使用してRails 3プロジェクトでコントローラーの仕様を作成していますが、選択ボックスから現在の日付を選択したいと思います。試してみました。

select Date.today, :from => 'Date of birth'

しかし、仕様が失敗し、エラーが発生します:

失敗/エラー:Select Date.today、:from => '生年月日' NoMethodError:未定義のメソッド `to_xpath'for Mon、18 Jul 2011:Date

それを修正する方法は?

P.S.ビューファイルでは、simple_form_forタグを使用し、選択ボックスはコードによって生成されます。

f.input :date_of_birth
23

Htmlの選択メニューにあるとおり、正確な値を指定する必要があります。したがって、選択に「2011/01/01」のような値がある場合は、次のように記述する必要があります。

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

日付オブジェクトを渡すため、コードは失敗します。

22
solnic

同じ問題がありました。私はたくさんグーグルでそれをこのように解決しました:

  1. 日付選択マクロを/ spec/request_macros.rbに書き込みました。月は翻訳に依存するため、select_by_idメソッドが必要です。

    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. それらを私の/ spec/spec_helper.rbに追加しました

    config.include RequestMacros, :type => :request
    

spec/requestsの統合テストで使用できます

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

http://jasonneylon.wordpress.com/2011/02/16/selecting-from-a-dropdown-generically-with-capybara/https:// Gist。 github.com/558786 :)

25
Markus Hartmair

markus Hartmairの優れたソリューションのおかげで、読みやすさが向上したため、セレクターとしてラベルを使用することを好みます。したがって、彼のヘルパーモジュールの私のバージョンは次のとおりです。

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

このように呼んでください:

select_date "2012,Jan,1", :from => "From date"
9
Les Nightingill

私は、rspecとcapybaraが日付と時刻の選択メソッドを使用してテストするためのクリーンなソリューションを見つけました。ここでは、HTMLで日時選択または日付選択を使用します。これはRails 4、RSpec3.1およびCapybara2.4.4で機能します。

HTMLフォームで次のように言います。

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

dateTime Select Viewヘルパーは、id="modelname_start_date_1i"などのIDを持つ5つの選択フィールドを作成します。ここで、IDには1i、2i、3i、4i、5iが追加されます。デフォルトでは、年、月、日、時、分。フィールドの順序を変更する場合は、必ず以下の機能ヘルパーを変更してください。

1)日付と時刻のヘルパー用の機能ヘルパーを作成します

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 

その日は、ゼロが埋め込まれた数値(つまり、04)を持つ%-dの代わりに、埋め込まれていない数値(つまり、4)を与える%dを使用することに注意してください。チェック strftimeを使用した日付形式

2)次に、日付と時刻のヘルパーメソッドをspec/support/helpers.rbに含めて、任意のスペックファイルで使用できるようにする必要があります。

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

3)Specファイルで、ヘルパーを呼び出すことができます。例えば:

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

マーカスの答えのわずかな適応:

def select_date(date, options = {})  
  raise ArgumentError, 'from is a required option' if options[:from].blank?
  field = options[:from].to_s
  select date.year.to_s,               :from => "#{field}_1i"
  select Date::MONTHNAMES[date.month], :from => "#{field}_2i"
  select date.day.to_s,                :from => "#{field}_3i"
end
7
Kris

それを指摘してくれたDylanに感謝しますが、誰かがキュウリのバージョンを探している場合は、これを使用できます:

select_date("Date of birth", :with => "1/1/2011")

詳細については、 select_date を参照してください。

2
Jaryl

私の特定の状況では、accepts_nested_attributes_for機能を使用してページに複数の日付選択フィールドを追加する可能性があります。つまり、フィールドのidまたはname全体がどうなるかわかりません。

これは、他の誰かがこれをグーグルするのに役立つ場合に備えて、私が思いついた解決策です:

コンテナdivの日付選択フィールドをクラスでラップしています:

<div class='date-of-birth-container'>
  <%= f.date_select :date_of_birth %>
</div>

それから私の機能仕様では:

within '.date-of-birth-container' do
  find("option[value='1']", text: 'January').select_option
  find("option[value='1']", text: '1').select_option
  find("option[value='1955']").select_option
end

これが私が書いたヘルパーメソッドです:

def select_date_within_css_selector(date, css_selector)
  month_name = Date::MONTHNAMES.fetch(date.month)
  within css_selector do
    find("option[value='#{date.month}']", text: month_name).select_option
    find("option[value='#{date.day}']", text: date.day.to_s).select_option
    find("option[value='#{date.year}']").select_option
  end
end

次に、ヘルパーを使用します。

select_date_within_css_selector(Date.new(1955, 1, 1), '.date-of-birth-container')
1
Elliot Larson

次のFormtasticコードが与えられると、Railsデフォルトの日付セレクター:

= f.input :born_on, end_year: Time.now.year, start_year: 60.years.ago.year

仕様では、日付を個々の選択タグへの個別の呼び出しに分割します。

select '1956', from: 'person_born_on_1i'
select 'July', from: 'person_born_on_2i'
select '9', from: 'person_born_on_3i'

このコードがHTMLをそれほど認識しているのは好きではありませんが、現時点ではgemのバージョンで機能します。

宝石:

  • カピバラ2.1.0
  • Formtastic 2.2.1
  • Rails 3.2.13
  • RSpec 2.13.0
1
scarver2

Date_fieldを使用して、以下が機能しました。

fill_in "Date", with: DateTime.now.strftime('%m/%d/%Y')
0
npostolovski

Rails 4の場合、誰かがRails 3に制限されることなくこの質問に到達した場合。

  select '2020',  from: 'field_name_{}_1i'
  select 'January',  from: 'field_name_{}_2i'
  select '1', from: 'field_name_{}_3i'

もちろん、これをヘルパーに抽出して動的にすることもできます。

0