2013-04-17 11 views
8

Ho un form_tag che genera il seguente codice HTML:Come FILL_IN datepicker utilizzando Capybara, Rails, MINITEST spec

<form accept-charset="UTF-8" action="http://www.example.com/product_page" id="dates_form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div> 
    Min date: <input id="datepicker_mini" name="datepicker_mini" type="text" /> 
    Max date: <input id="datepicker_maxi" name="datepicker_maxi" type="text" /> 
</form> 

Quanto sopra è tutto il codice HTML generato. Ho rimosso qualsiasi partial e layout per provare a eseguire il debug di questo problema nel modo più semplice possibile.

I campi datapicker richiamano jquery UI datepicker.

Vorrei evitare javascript per il mio test e semplicemente inserire i campi data con date di testo. Ho provato fill_in "datepicker_mini", :with => "01/01/2010" ma, sebbene non provochi il fallimento del test, non compila il campo quando utilizzo il test save_and_open_page.

Aggiornamento: TEST CODICE

it "runs report" do 
    login_test_user 
    within("#dates_form") do 
    fill_in "datepicker_mini", :with => "01/01/2010" 
    fill_in "datepicker_maxi", :with => "01/01/2020" 
    end 
    save_and_open_page 
end 

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie.

+0

Puoi pubblicare il codice per il test? – declan

+0

Aggiunto codice test. Per favore fatemi sapere se avete bisogno di ulteriori informazioni. Grazie. – Marklar

+0

È possibile che ci sia un campo nascosto con lo stesso nome da qualche parte sulla pagina? – declan

risposta

19

ho avuto lo stesso problema. Dopo aver letto la documentazione di capibara, la mia soluzione era usare page.execute_script() per impostare un valore direttamente sull'input.

## fill_in "person_birthdate, with: "21/12/1980" 
page.execute_script("$('#person_birthdate').val('21/12/1980')") 

Questo un po 'sporco, credo, ma il lavoro per me.

trucchi:

  • ho usato auto selenio.
  • Eseguo l'esempio con js: true
  • Ho usato un plug-in chiamato zebra per generare i datepickers, ma il principio è lo stesso.

Edit: Questo funziona per Poltergeist così

+0

Grazie ragazzo! Per me funziona. –

0

La soluzione di cui sopra non ha funzionato per me. Forse perché non c'è nessun campo di input sull'applicazione per cui sto scrivendo i test. La mia soluzione è molto più brutta, ma seleziona date e verifica la selezione in un datepicker che è solo GUI.

##selects 'Custom' option, then specified dates, and verifies that specified dates are displayed. 
Then(/^select "Custom" values, "([^"]*)" to "([^"]*)" and verify selection$/) do |arg1,arg2| 
    step %{select 'Custom' from timespan drop-down} 
    start = Date.strptime("#{arg1}",'%m/%d/%Y') 
    start_day = start.day 
    start_month = start.strftime('%b') 
    start_year = start.year 
    stop = Date.strptime("#{arg2}",'%m/%d/%Y') 
    stop_day = stop.day 
    stop_month = stop.strftime('%b') 
    stop_year = stop.year 
    within('.left.hasDatepicker') do 
    find('.ui-datepicker-year').click 
    find('option', :text => start_year).click 
    find('.ui-datepicker-month').click 
    find('option', :text => start_month).click 
    find('.ui-state-default', :text => start_day, :match => :prefer_exact).click 
    end 
    within('.right.customdatepicker') do 
    find('.ui-datepicker-year').click 
    find('option', :text => stop_year).click 
    find('.ui-datepicker-month').click 
    find('option', :text => stop_month).click 
    find('.ui-state-default', :text => stop_day, :match => :prefer_exact).click 
    end 
    find('input[value="Go"]').click 
    date_picker = find('.timespanperiod').text 
    start_date, end_date = date_picker.split(" - ") 
    start_formatted = Date.strptime("#{start_date}",'%d/%m/%Y') 
    end_formatted = Date.strptime("#{end_date}",'%d/%m/%Y') 
    start_formatted.should eq (Date.strptime("#{arg1}",'%m/%d/%Y')) 
    end_formatted.should eq (Date.strptime("#{arg2}",'%m/%d/%Y')) 
end 
4

se si desidera simulare i clic dell'interfaccia utente, questo funziona per me (utilizzando un driver javascript).

quando ID di mio datepicker è 'target_date', questo naviga per il mese prossimo, quindi l'15 °.

page.execute_script %Q{ $('#target_date').trigger('focus') } 
page.execute_script %Q{ $('a.ui-datepicker-next').trigger('click') } 
page.execute_script %Q{ $('a.ui-state-default:contains("15")').trigger('click') } 
Problemi correlati