Respect maxlength when doing rapid set

This commit is contained in:
Thomas Walpole 2020-04-02 17:45:06 -07:00
parent 1a748f21eb
commit 65d43316d0
3 changed files with 25 additions and 1 deletions

View File

@ -281,7 +281,7 @@ private
driver.execute_script 'arguments[0].select()', self unless clear == :none
if rapid == true || (value.length > 30 && rapid != false)
send_keys(value[0..3])
driver.execute_script 'arguments[0].value += arguments[1]', self, value[4...-3]
driver.execute_script RAPID_SET_TEXT, self, value[4...-3]
send_keys(value[-3..-1])
else
send_keys(value)
@ -530,6 +530,16 @@ private
})(arguments[0], arguments[1], arguments[2])
JS
RAPID_SET_TEXT = <<~'JS'
(function(el, val) {
var value = el.value + val;
if (el.maxLength != -1){
value = value.slice(0, el.maxLength);
}
el.value = value;
})(arguments[0], arguments[1])
JS
# SettableValue encapsulates time/date field formatting
class SettableValue
attr_reader :value

View File

@ -143,6 +143,10 @@
<input type="text" maxlength="5" name="form[zipcode]" id="form_zipcode" />
</p>
<p>
<input maxlength="35" id="long_length" />
</p>
<p>
<label for="form_tendency">Tendency</label>
<select name="form[tendency]" id="form_tendency"></select>

View File

@ -35,6 +35,16 @@ RSpec.shared_examples 'Capybara::Node' do |session, _mode|
end
end
describe '#set' do
it 'respects maxlength when using rapid set' do
session.visit('/form')
inp = session.find(:css, '#long_length')
value = (0...50).map { |i| ((i % 26) + 65).chr }.join
inp.set(value, rapid: true)
expect(inp.value).to eq value[0...35]
end
end
describe '#visible?' do
let(:bridge) do
session.driver.browser.send(:bridge)