webentwicklung-frage-antwort-db.com.de

Wie wählt man mit Capybara in Rails 3 ein Datum aus einem Auswahlfeld aus?

Ich schreibe eine Spezifikation für einen Controller in einem Rails 3-Projekt mit RSpec und Capybara und möchte das aktuelle Datum aus einem Auswahlfeld auswählen. Ich habe es versucht:

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

aber die spezifikation schlägt fehl und ich bekomme fehler:

Fehler/Fehler: Wählen Sie Datum.Heute: von => 'Geburtsdatum' NoMethodError: undefinierte Methode `to_xpath 'für Mo, 18 Jul 2011: Datum

Wie man es repariert?

P.S. In der Ansichtsdatei verwende ich das Tag simple_form_for und das Auswahlfeld wird durch folgenden Code generiert:

f.input :date_of_birth
22

Sie müssen den genauen Wert wie im Auswahlmenü in HTML angeben. Wenn Ihre Auswahl also Werte wie "2011/01/01" enthält, müssen Sie Folgendes schreiben:

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

Ihr Code schlägt fehl, weil Sie ein Datumsobjekt übergeben.

21
solnic

Hatte das selbe Problem. Ich habe viel gegoogelt und es so gelöst:

  1. Schrieb Date Select-Makros nach /spec/request_macros.rb Die Methode select_by_id ist für mich notwendig, da der Monat von der Übersetzung abhängig ist

    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. Fügte sie meinem /spec/spec_helper.rb hinzu

    config.include RequestMacros, :type => :request
    

Jetzt kann ich in meinen Integrationstests in spec/orders verwenden

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

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

24
Markus Hartmair

dank Markus Hartmair für eine hervorragende Lösung bevorzuge ich aufgrund der besseren Lesbarkeit die Verwendung von Etiketten als Selektoren. Meine Version seines Hilfsmoduls ist also:

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

nenne es so:

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

Eine kleine Anpassung von Markus 'Antwort:

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

Ich habe eine saubere Lösung für rspec und capybara gefunden, um mithilfe von Methoden zur Auswahl von Datum und Uhrzeit zu testen, wobei Sie in Ihrem HTML eine Datums-/Uhrzeitauswahl oder eine Datumsauswahl verwenden. Dies funktioniert mit Rails 4, RSpec 3.1 und Capybara 2.4.4.

Angenommen, Sie haben in Ihrem HTML-Formular Folgendes:

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

der DateTime Select View-Helfer erstellt 5 Auswahlfelder mit IDs wie id="modelname_start_date_1i", wobei der ID 1i, 2i, 3i, 4i, 5i angehängt wird. Standardmäßig Jahr, Monat, Tag, Stunde, Minute. Wenn Sie die Reihenfolge der Felder ändern, stellen Sie sicher, dass Sie den Feature-Helfer unten ändern.

1) Erstellen Sie einen Feature-Helper für Datums- und Uhrzeithilfen

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 

Beachten Sie, dass für den Tag, an dem ich %-d verwende, ein nicht aufgefüllter numerischer Wert (d. H. 4) anstelle von %d mit einem null aufgefüllten numerischen Wert (d. H. 04) angezeigt wird. Überprüfen Sie die Datumsformate mit strftime

2) Anschließend müssen Sie Ihre Datums- und Uhrzeithilfemethoden in spec/support/helpers.rb einfügen, damit Sie sie in jeder Spezifikationsdatei verwenden können.

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

3) In Ihrer Spec-Datei können Sie Ihren Helfer anrufen. Zum Beispiel:

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

Vielen Dank an Dylan für den Hinweis, aber falls jemand nach der Gurkenversion sucht, können Sie diese verwenden:

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

Weitere Informationen finden Sie unter Datum auswählen .

2
Jaryl

In meiner speziellen Situation füge ich der Seite mit der Funktion accepts_nested_attributes_for möglicherweise mehrere Datumsauswahlfelder hinzu. Dies bedeutet, dass ich nicht sicher bin, wie die vollständige id oder name der Felder aussehen wird.

Hier ist die Lösung, die ich mir ausgedacht habe, für den Fall, dass sie jemand anderem hilft, dies zu googeln:

Ich verpacke das Datumsauswahlfeld in ein Container-Div mit einer Klasse:

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

Dann in meiner Feature-Spezifikation:

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

Hier ist eine Hilfsmethode, die ich dafür geschrieben habe:

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

Dann mit dem Helfer:

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

Mit dem folgenden Formtastic-Code erhält Rails die Standard-Datumsauswahl:

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

Teilen Sie das Datum in Ihrer Spezifikation in separate Aufrufe für jedes einzelne Select-Tag auf:

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

Ich mag es nicht, dass dieser Code den HTML-Code so gut kennt, aber er funktioniert derzeit mit den Versionen von Gems.

Edelsteine:

  • Capybara 2.1.0
  • Formtastic 2.2.1
  • Schienen 3.2.13
  • RSpec 2.13.0
1
scarver2

Folgendes funktionierte für mich mit einem date_field:

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

Für Rails 4 , falls jemand auf diese Frage kommt, ohne auf Rails 3 beschränkt zu sein.

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

Sie können dies natürlich zu einem Helfer extrahieren und dynamisieren.

0