2013-04-17 11 views
8

Mam form_tag który generuje następujący kod HTML:Jak FILL_IN datepicker przy użyciu Kapibara, szyny, MiniTest specyfikację

<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> 

Powyższy to wszystko wygenerowanego kodu HTML. Usunąłem wszystkie części i układy, aby ułatwić debugowanie tego problemu.

Pola datepicker wywołują datepicker jquery UI.

Chciałbym uniknąć testu javascript dla mojego testu i po prostu wypełnić pola dat datami tekstu. Próbowałem już fill_in "datepicker_mini", :with => "01/01/2010", ale chociaż nie powoduje to niepowodzenia testu, to również nie wypełnia pola, kiedy testuję.

Aktualizacja: CODE TEST

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 

Każda pomoc będzie mile widziana.

Dzięki.

+0

Czy możesz napisać kod do testu? – declan

+0

Dodano kod testowy. Proszę dać mi znać, jeśli potrzebujesz więcej informacji. Dzięki. – Marklar

+0

Czy jest możliwe, że gdzieś na stronie znajduje się ukryte pole o tej samej nazwie? – declan

Odpowiedz

19

Miałem ten sam problem. Po przeczytaniu dokumentacji capybary, moim rozwiązaniem było użycie page.execute_script() do ustawienia wartości bezpośrednio na dane wejściowe.

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

To trochę brudne, myślę, ale pracuj dla mnie.

pułapek:

  • użyłem napęd selenu.
  • Uruchomiłem przykład z js: true
  • Użyłem wtyczki o nazwie zebra do generowania datepickerów, ale zasada jest taka sama.

Edit: Działa to dla Poltergeist oraz

+0

Dziękuję facet! Mi to pasuje. –

0

Powyższe rozwiązanie nie działa dla mnie. Być może dlatego, że nie ma pola wejściowego w aplikacji, dla której piszę testy. Moje rozwiązanie jest dużo brzydsze, ale wybiera daty i weryfikuje wybór w datepicker, który jest tylko 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

Jeśli chcesz symulować kliknięcia interfejsu użytkownika, działa to dla mnie (przy użyciu sterownika javascript).

, gdy mój identyfikator dateplera to "target_date", to przechodzi do następnego miesiąca, a następnie wybiera 15-ty.

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') } 
Powiązane problemy