Add support for setting date, time, and datetime-local inputs

This commit is contained in:
Thomas Walpole 2018-03-09 14:23:52 -08:00
parent 8e735d68a0
commit 1750932349
3 changed files with 73 additions and 0 deletions

View File

@ -1,6 +1,19 @@
# frozen_string_literal: true
class Capybara::Selenium::Node < Capybara::Driver::Node
SET_FORMATS = Hash.new(date: '%Y-%m-%d', time: '%H:%M', datetime: "%m%d%Y\t%I%M%P").merge(
firefox: {
date: '%Y-%m-%d',
time: '%H:%M',
datetime: "%m%d%Y\t%I%M%P"
},
chrome: {
date: '%m%d%Y',
time: '%I%M%P',
datetime: "%m%d%Y\t%I%M%P"
}
)
def visible_text
# Selenium doesn't normalize Unicode whitespace.
Capybara::Helpers.normalize_whitespace(native.text)
@ -48,6 +61,12 @@ class Capybara::Selenium::Node < Capybara::Driver::Node
click if value ^ checked?
when 'file'
set_file(value)
when 'date'
set_date(value)
when 'time'
set_time(value)
when 'datetime-local'
set_datetime_local(value)
else
set_text(value, options)
end
@ -231,6 +250,30 @@ private
yield
end
def set_date(value) # rubocop:disable Naming/AccessorMethodName
if value.respond_to?(:to_date)
set_text(value.to_date.strftime(SET_FORMATS[driver.options[:browser].to_sym][:date]))
else
set_text(value)
end
end
def set_time(value) # rubocop:disable Naming/AccessorMethodName
if value.respond_to?(:to_time)
set_text(value.to_time.strftime(SET_FORMATS[driver.options[:browser].to_sym][:time]))
else
set_text(value)
end
end
def set_datetime_local(value) # rubocop:disable Naming/AccessorMethodName
if value.respond_to?(:to_time)
set_text(value.to_time.strftime(SET_FORMATS[driver.options[:browser].to_sym][:datetime]))
else
set_text(value)
end
end
def set_file(value) # rubocop:disable Naming/AccessorMethodName
path_names = value.to_s.empty? ? [] : value
if driver.chrome?

View File

@ -53,6 +53,30 @@ Capybara::SpecHelper.spec "#fill_in" do
expect(extract_results(@session)['password']).to eq('supasikrit')
end
context "Date/Time" do
it "should fill in a date input" do
date = Date.today
@session.fill_in('form_date', with: date)
@session.click_button('awesome')
expect(Date.parse(extract_results(@session)['date'])).to eq date
end
it "should fill in a time input" do
time = Time.new(2018, 3, 9, 15, 26)
@session.fill_in('form_time', with: time)
@session.click_button('awesome')
results = extract_results(@session)['time']
expect(Time.parse(results).strftime('%r')).to eq time.strftime('%r')
end
it "should fill in a datetime input" do
dt = Time.new(2018, 3, 13, 9, 53)
@session.fill_in('form_datetime', with: dt)
@session.click_button('awesome')
expect(Time.parse(extract_results(@session)['datetime'])).to eq dt
end
end
it "should handle HTML in a textarea" do
@session.fill_in('form_description', with: 'is <strong>very</strong> secret!')
@session.click_button('awesome')

View File

@ -426,6 +426,12 @@ New line after and before textarea tag
<input type="button" disabled="disabled" value="Disabled button"/>
</p>
<p>
<input type="date" name="form[date]" id="form_date"/>
<input type="time" name="form[time]" id="form_time"/>
<input type="datetime-local" name="form[datetime]" id="form_datetime">
</p>
<p>
<input id="readonly" name="form[readonly_test]" readonly/>
<input id="not_readonly" name="form[readonly_test]" />