diff --git a/History.md b/History.md index fa321ce9..a855eee0 100644 --- a/History.md +++ b/History.md @@ -3,7 +3,7 @@ Release date: unreleased ### Added -* New global configuration `default_set_options` used in `Capybara::Node::Element#set` as default `options` hash +* New global configuration `default_set_options` used in `Capybara::Node::Element#set` as default `options` hash [Champier Cyril] # Version 3.1.0 Release date: 2018-05-10 diff --git a/lib/capybara/node/actions.rb b/lib/capybara/node/actions.rb index 0e408574..39ab9cec 100644 --- a/lib/capybara/node/actions.rb +++ b/lib/capybara/node/actions.rb @@ -77,7 +77,7 @@ module Capybara # @option options [String] name Match fields that match the name attribute # @option options [String] placeholder Match fields that match the placeholder attribute # @option options [String, Array] class Match fields that match the class(es) provided - # @option options [Hash] fill_options Driver specific options regarding how to fill fields + # @option options [Hash] fill_options Driver specific options regarding how to fill fields (Defaults come from Capybara.default_set_options) # # @return [Capybara::Node::Element] The element filled_in def fill_in(locator = nil, with:, fill_options: {}, **options) diff --git a/lib/capybara/node/element.rb b/lib/capybara/node/element.rb index c4d127b4..3e4d454e 100644 --- a/lib/capybara/node/element.rb +++ b/lib/capybara/node/element.rb @@ -89,7 +89,7 @@ module Capybara # @return [Capybara::Node::Element] The element def set(value, **options) raise Capybara::ReadOnlyElementError, "Attempt to set readonly element with value: #{value}" if readonly? - options = session_options.default_set_options.merge(options) + options = session_options.default_set_options.to_h.merge(options) synchronize { base.set(value, options) } self end diff --git a/lib/capybara/spec/session/fill_in_spec.rb b/lib/capybara/spec/session/fill_in_spec.rb index 26eede1d..dc69b000 100644 --- a/lib/capybara/spec/session/fill_in_spec.rb +++ b/lib/capybara/spec/session/fill_in_spec.rb @@ -159,6 +159,13 @@ Capybara::SpecHelper.spec "#fill_in" do expect(extract_results(@session)['zipcode']).to eq('12345') end + it "fills in a field if default_set_options is nil" do + Capybara.default_set_options = nil + @session.fill_in(:form_first_name, with: 'Thomas') + @session.click_button('awesome') + expect(extract_results(@session)['first_name']).to eq('Thomas') + end + context 'on a pre-populated textfield with a reformatting onchange', requires: [:js] do it 'should only trigger onchange once' do @session.visit('/with_js') diff --git a/lib/capybara/spec/session/node_spec.rb b/lib/capybara/spec/session/node_spec.rb index 1aced418..da46a80f 100644 --- a/lib/capybara/spec/session/node_spec.rb +++ b/lib/capybara/spec/session/node_spec.rb @@ -102,9 +102,9 @@ Capybara::SpecHelper.spec "node" do expect { @session.first('//textarea[@readonly]').set('changed') }.to raise_error(Capybara::ReadOnlyElementError) end - it 'should use global default options', requires: [:js] do + it 'should use global default options' do Capybara.default_set_options = { clear: :backspace } - element = @session.first('//input') + element = @session.first(:fillable_field, type: 'text') expect(element.base).to receive(:set).with('gorilla', clear: :backspace) element.set('gorilla') end diff --git a/spec/shared_selenium_session.rb b/spec/shared_selenium_session.rb index 553f805a..5372d1bc 100644 --- a/spec/shared_selenium_session.rb +++ b/spec/shared_selenium_session.rb @@ -88,6 +88,13 @@ RSpec.shared_examples "Capybara::Session" do |session, mode| expect(session.find(:fillable_field, 'form_first_name').value).to eq('Harry') end + it 'should fill in if the option is set via global option' do + Capybara.default_set_options = { clear: :backspace } + session.visit('/form') + session.fill_in('form_first_name', with: 'Thomas') + expect(session.find(:fillable_field, 'form_first_name').value).to eq('Thomas') + end + it 'should only trigger onchange once' do session.visit('/with_js') session.fill_in('with_change_event',