20

我有一个生成以下 HTML 的 form_tag:

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

以上是所有生成的 HTML。我已经删除了所有部分和布局,以尝试尽可能轻松地调试此问题。

datepicker 字段调用 jquery UI datepicker。

我想在我的测试中避免使用 javascript,只需用文本日期填写日期字段。我已经尝试过fill_in "datepicker_mini", :with => "01/01/2010",但是虽然它不会导致测试失败,但在我用来测试时它也不会填写该字段save_and_open_page

更新:测试代码

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

任何帮助将不胜感激。

谢谢。

4

5 回答 5

28

我有同样的问题。在阅读了 capybara 的文档后,我的解决方案是使用 page.execute_script() 直接为输入设置一个值。

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

这有点脏,我想,但为我工作。

陷阱:

  • 我使用硒驱动器。
  • 我用 js 运行示例:true
  • 我使用了一个名为 zebra 的插件来生成日期选择器,但原理是一样的。

编辑:这也适用于 Poltergeist

于 2013-09-15T02:27:26.477 回答
8

我喜欢这个解决方案:

page.execute_script("$('#show_sale_date').datepicker('setDate', '01/01/2010')")

取自这里http://api.jqueryui.com/datepicker/#method-setDate

于 2014-07-24T17:16:46.043 回答
7

如果你想模拟 UI 点击,这对我有用(使用 javascript 驱动程序)。

当我的日期选择器的 ID 是“target_date”时,它会导航到下个月,然后选择 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') }
于 2016-04-29T15:47:53.540 回答
0

上述解决方案对我不起作用。也许是因为我正在为其编写测试的应用程序上没有输入字段。我的解决方案要丑得多,但它会选择日期并在仅是 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
于 2015-01-23T17:00:17.007 回答
0

这对我有用。日期采用该格式很重要,否则日期选择器不会对其进行解析。 page.execute_script %Q{ $("md-datepicker[name='datepicker_mini'] input").val('2010-1-1').trigger('input') }

于 2018-12-24T07:37:23.123 回答