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)