@@ -101,8 +101,28 @@ def set(value, options = {})
101
101
when "file"
102
102
files = value . respond_to? ( :to_ary ) ? value . to_ary . map ( &:to_s ) : value . to_s
103
103
command ( :select_file , files )
104
- when "color"
105
- node . evaluate ( "this.setAttribute('value', '#{ value } ')" )
104
+ when 'date'
105
+ if value . respond_to? ( :to_time )
106
+ set_value_js ( value . to_date . iso8601 )
107
+ else
108
+ command ( :set , value . to_s )
109
+ end
110
+ when 'time'
111
+ if value . respond_to? ( :to_time ) && !value . is_a? ( String )
112
+ set_value_js ( value . to_time . strftime ( '%H:%M' ) )
113
+ else
114
+ command ( :set , value . to_s )
115
+ end
116
+ when 'datetime-local'
117
+ if value . respond_to? ( :to_time ) && !value . is_a? ( String )
118
+ set_value_js ( value . to_time . strftime ( '%Y-%m-%dT%H:%M' ) )
119
+ else
120
+ command ( :set , value . to_s )
121
+ end
122
+ when 'range'
123
+ set_value_js ( value )
124
+ when 'color'
125
+ set_value_js ( value )
106
126
else
107
127
command ( :set , value . to_s )
108
128
end
@@ -114,6 +134,23 @@ def set(value, options = {})
114
134
end
115
135
end
116
136
137
+ # Copied from MIT licensed capybara project
138
+ # revision 0be79d6
139
+ # path lib/capybara/selenium/node.rb
140
+ def set_value_js ( value )
141
+ driver . execute_script ( <<-JS , self , value )
142
+ if (arguments[0].readOnly) { return };
143
+ if (document.activeElement !== arguments[0]){
144
+ arguments[0].focus();
145
+ }
146
+ if (arguments[0].value != arguments[1]) {
147
+ arguments[0].value = arguments[1]
148
+ arguments[0].dispatchEvent(new InputEvent('input'));
149
+ arguments[0].dispatchEvent(new Event('change', { bubbles: true }));
150
+ }
151
+ JS
152
+ end
153
+
117
154
def select_option
118
155
command ( :select , true )
119
156
end
0 commit comments