From 65d43316d0e5e8c7842f374476a27f217dcbfc19 Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Thu, 2 Apr 2020 17:45:06 -0700 Subject: [PATCH] Respect maxlength when doing rapid set --- lib/capybara/selenium/node.rb | 12 +++++++++++- lib/capybara/spec/views/form.erb | 4 ++++ spec/shared_selenium_node.rb | 10 ++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/capybara/selenium/node.rb b/lib/capybara/selenium/node.rb index 1451be98..12f0fb75 100644 --- a/lib/capybara/selenium/node.rb +++ b/lib/capybara/selenium/node.rb @@ -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 diff --git a/lib/capybara/spec/views/form.erb b/lib/capybara/spec/views/form.erb index 7e2f97e9..452e8412 100644 --- a/lib/capybara/spec/views/form.erb +++ b/lib/capybara/spec/views/form.erb @@ -143,6 +143,10 @@

+

+ +

+

diff --git a/spec/shared_selenium_node.rb b/spec/shared_selenium_node.rb index 872dfe1a..e606eb7b 100644 --- a/spec/shared_selenium_node.rb +++ b/spec/shared_selenium_node.rb @@ -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)