capybara 3.38.0 → 3.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/History.md +20 -0
- data/lib/capybara/node/actions.rb +4 -4
- data/lib/capybara/node/finders.rb +2 -0
- data/lib/capybara/node/whitespace_normalizer.rb +81 -0
- data/lib/capybara/rack_test/node.rb +18 -15
- data/lib/capybara/registrations/drivers.rb +3 -3
- data/lib/capybara/registrations/servers.rb +16 -4
- data/lib/capybara/rspec/matcher_proxies.rb +3 -3
- data/lib/capybara/rspec/matchers/base.rb +8 -6
- data/lib/capybara/rspec/matchers/compound.rb +1 -1
- data/lib/capybara/selector/definition/link.rb +2 -1
- data/lib/capybara/selenium/driver.rb +4 -4
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +8 -4
- data/lib/capybara/selenium/extensions/html5_drag.rb +3 -0
- data/lib/capybara/selenium/node.rb +8 -10
- data/lib/capybara/selenium/nodes/chrome_node.rb +5 -1
- data/lib/capybara/selenium/nodes/edge_node.rb +24 -2
- data/lib/capybara/selenium/patches/action_pauser.rb +3 -3
- data/lib/capybara/selenium/patches/atoms.rb +1 -1
- data/lib/capybara/selenium/patches/pause_duration_fix.rb +1 -1
- data/lib/capybara/server/animation_disabler.rb +2 -3
- data/lib/capybara/spec/public/test.js +4 -0
- data/lib/capybara/spec/session/all_spec.rb +1 -1
- data/lib/capybara/spec/session/click_link_spec.rb +11 -0
- data/lib/capybara/spec/session/find_link_spec.rb +10 -0
- data/lib/capybara/spec/session/find_spec.rb +1 -1
- data/lib/capybara/spec/session/first_spec.rb +1 -1
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +2 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +5 -5
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +2 -2
- data/lib/capybara/spec/session/has_current_path_spec.rb +1 -1
- data/lib/capybara/spec/session/has_link_spec.rb +5 -1
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +7 -7
- data/lib/capybara/spec/session/matches_style_spec.rb +2 -0
- data/lib/capybara/spec/session/node_spec.rb +16 -0
- data/lib/capybara/spec/session/scroll_spec.rb +3 -1
- data/lib/capybara/spec/session/window/windows_spec.rb +1 -1
- data/lib/capybara/spec/views/form.erb +4 -0
- data/lib/capybara/spec/views/with_html.erb +1 -1
- data/lib/capybara/version.rb +1 -1
- data/spec/css_builder_spec.rb +1 -1
- data/spec/css_splitter_spec.rb +1 -1
- data/spec/rack_test_spec.rb +2 -2
- data/spec/rspec/scenarios_spec.rb +1 -1
- data/spec/rspec_matchers_spec.rb +25 -0
- data/spec/sauce_spec_chrome.rb +1 -1
- data/spec/selenium_spec_chrome.rb +5 -6
- data/spec/selenium_spec_chrome_remote.rb +5 -7
- data/spec/selenium_spec_edge.rb +11 -7
- data/spec/selenium_spec_firefox.rb +10 -4
- data/spec/selenium_spec_firefox_remote.rb +16 -3
- data/spec/selenium_spec_ie.rb +1 -1
- data/spec/selenium_spec_safari.rb +1 -1
- data/spec/server_spec.rb +2 -2
- data/spec/shared_selenium_session.rb +2 -1
- data/spec/spec_helper.rb +33 -0
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +1 -1
- metadata +4 -2
| @@ -67,4 +67,14 @@ Capybara::SpecHelper.spec '#find_link' do | |
| 67 67 | 
             
                  expect { @session.find_link(download: 37) }.to raise_error ArgumentError
         | 
| 68 68 | 
             
                end
         | 
| 69 69 | 
             
              end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
              context 'with :target option' do
         | 
| 72 | 
            +
                it 'should accept partial matches when false' do
         | 
| 73 | 
            +
                  expect(@session.find_link(target: '_self').text).to eq('labore')
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                it 'should not accept partial matches when true' do
         | 
| 77 | 
            +
                  expect { @session.find_link(target: '_blank') }.to raise_error Capybara::ElementNotFound
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
              end
         | 
| 70 80 | 
             
            end
         | 
| @@ -236,7 +236,7 @@ Capybara::SpecHelper.spec '#find' do | |
| 236 236 | 
             
              it 'should accept an XPath instance' do
         | 
| 237 237 | 
             
                @session.visit('/form')
         | 
| 238 238 | 
             
                @xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('First Name')
         | 
| 239 | 
            -
                expect(@xpath).to be_a( | 
| 239 | 
            +
                expect(@xpath).to be_a(XPath::Union)
         | 
| 240 240 | 
             
                expect(@session.find(@xpath).value).to eq('John')
         | 
| 241 241 | 
             
              end
         | 
| 242 242 |  | 
| @@ -25,7 +25,7 @@ Capybara::SpecHelper.spec '#first' do | |
| 25 25 | 
             
              it 'should accept an XPath instance' do
         | 
| 26 26 | 
             
                @session.visit('/form')
         | 
| 27 27 | 
             
                @xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('First Name')
         | 
| 28 | 
            -
                expect(@xpath).to be_a( | 
| 28 | 
            +
                expect(@xpath).to be_a(XPath::Union)
         | 
| 29 29 | 
             
                expect(@session.first(@xpath).value).to eq('John')
         | 
| 30 30 | 
             
              end
         | 
| 31 31 |  | 
| @@ -64,7 +64,9 @@ Capybara::SpecHelper.spec '#within_frame', requires: [:frames] do | |
| 64 64 | 
             
                end
         | 
| 65 65 | 
             
                expect do
         | 
| 66 66 | 
             
                  # Multiple frames in scope here
         | 
| 67 | 
            +
                  # rubocop:disable Style/Semicolon
         | 
| 67 68 | 
             
                  @session.within_frame { ; }
         | 
| 69 | 
            +
                  # rubocop:enable Style/Semicolon
         | 
| 68 70 | 
             
                end.to raise_error Capybara::Ambiguous
         | 
| 69 71 | 
             
              end
         | 
| 70 72 |  | 
| @@ -12,7 +12,7 @@ Capybara::SpecHelper.spec '#have_all_of_selectors' do | |
| 12 12 | 
             
              it 'should be false if any of the given selectors are not on the page' do
         | 
| 13 13 | 
             
                expect do
         | 
| 14 14 | 
             
                  expect(@session).to have_all_of_selectors(:css, 'p a#foo', 'h2#h2three', 'h2#h2one')
         | 
| 15 | 
            -
                end.to raise_error  | 
| 15 | 
            +
                end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 16 16 | 
             
              end
         | 
| 17 17 |  | 
| 18 18 | 
             
              it 'should use default selector' do
         | 
| @@ -20,7 +20,7 @@ Capybara::SpecHelper.spec '#have_all_of_selectors' do | |
| 20 20 | 
             
                expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2two', 'h2#h2one')
         | 
| 21 21 | 
             
                expect do
         | 
| 22 22 | 
             
                  expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2three', 'h2#h2one')
         | 
| 23 | 
            -
                end.to raise_error  | 
| 23 | 
            +
                end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 24 24 | 
             
              end
         | 
| 25 25 |  | 
| 26 26 | 
             
              context 'should respect scopes' do
         | 
| @@ -29,7 +29,7 @@ Capybara::SpecHelper.spec '#have_all_of_selectors' do | |
| 29 29 | 
             
                    expect(@session).to have_all_of_selectors(".//a[@id='foo']")
         | 
| 30 30 | 
             
                    expect do
         | 
| 31 31 | 
             
                      expect(@session).to have_all_of_selectors(".//a[@id='red']")
         | 
| 32 | 
            -
                    end.to raise_error  | 
| 32 | 
            +
                    end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 33 33 | 
             
                  end
         | 
| 34 34 | 
             
                end
         | 
| 35 35 |  | 
| @@ -38,7 +38,7 @@ Capybara::SpecHelper.spec '#have_all_of_selectors' do | |
| 38 38 | 
             
                  expect(el).to have_all_of_selectors(".//a[@id='foo']")
         | 
| 39 39 | 
             
                  expect do
         | 
| 40 40 | 
             
                    expect(el).to have_all_of_selectors(".//a[@id='red']")
         | 
| 41 | 
            -
                  end.to raise_error  | 
| 41 | 
            +
                  end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 42 42 | 
             
                end
         | 
| 43 43 | 
             
              end
         | 
| 44 44 |  | 
| @@ -47,7 +47,7 @@ Capybara::SpecHelper.spec '#have_all_of_selectors' do | |
| 47 47 | 
             
                  expect(@session).to have_all_of_selectors(:field, 'normal', 'additional_newline', type: :textarea)
         | 
| 48 48 | 
             
                  expect do
         | 
| 49 49 | 
             
                    expect(@session).to have_all_of_selectors(:field, 'normal', 'test_field', 'additional_newline', type: :textarea)
         | 
| 50 | 
            -
                  end.to raise_error  | 
| 50 | 
            +
                  end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 51 51 | 
             
                end
         | 
| 52 52 | 
             
              end
         | 
| 53 53 |  | 
| @@ -12,7 +12,7 @@ Capybara::SpecHelper.spec '#have_any_of_selectors' do | |
| 12 12 | 
             
              it 'should be false if none of the given selectors are not on the page' do
         | 
| 13 13 | 
             
                expect do
         | 
| 14 14 | 
             
                  expect(@session).to have_any_of_selectors(:css, 'span a#foo', 'h2#h2nope', 'h2#h2one_no')
         | 
| 15 | 
            -
                end.to raise_error  | 
| 15 | 
            +
                end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 16 16 | 
             
              end
         | 
| 17 17 |  | 
| 18 18 | 
             
              it 'should use default selector' do
         | 
| @@ -20,7 +20,7 @@ Capybara::SpecHelper.spec '#have_any_of_selectors' do | |
| 20 20 | 
             
                expect(@session).to have_any_of_selectors('p a#foo', 'h2#h2two', 'a#not_on_page')
         | 
| 21 21 | 
             
                expect do
         | 
| 22 22 | 
             
                  expect(@session).to have_any_of_selectors('p a#blah', 'h2#h2three')
         | 
| 23 | 
            -
                end.to raise_error  | 
| 23 | 
            +
                end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 24 24 | 
             
              end
         | 
| 25 25 |  | 
| 26 26 | 
             
              it 'should be negateable' do
         | 
| @@ -75,7 +75,7 @@ Capybara::SpecHelper.spec '#has_current_path?' do | |
| 75 75 | 
             
                @session.visit('/with_js?test=test')
         | 
| 76 76 | 
             
                expect(@session).to have_current_path('/with_js?test=test')
         | 
| 77 77 | 
             
                expect(@session).to have_current_path('/with_js', ignore_query: true)
         | 
| 78 | 
            -
                uri =  | 
| 78 | 
            +
                uri = Addressable::URI.parse(@session.current_url)
         | 
| 79 79 | 
             
                uri.query = nil
         | 
| 80 80 | 
             
                expect(@session).to have_current_path(uri.to_s, ignore_query: true)
         | 
| 81 81 | 
             
              end
         | 
| @@ -11,12 +11,14 @@ Capybara::SpecHelper.spec '#has_link?' do | |
| 11 11 | 
             
                expect(@session).to have_link('A link', href: '/with_simple_html')
         | 
| 12 12 | 
             
                expect(@session).to have_link(:'A link', href: :'/with_simple_html')
         | 
| 13 13 | 
             
                expect(@session).to have_link('A link', href: %r{/with_simple_html})
         | 
| 14 | 
            +
                expect(@session).to have_link('labore', target: '_self')
         | 
| 14 15 | 
             
              end
         | 
| 15 16 |  | 
| 16 17 | 
             
              it 'should be false if the given link is not on the page' do
         | 
| 17 18 | 
             
                expect(@session).not_to have_link('monkey')
         | 
| 18 19 | 
             
                expect(@session).not_to have_link('A link', href: '/nonexistent-href')
         | 
| 19 20 | 
             
                expect(@session).not_to have_link('A link', href: /nonexistent/)
         | 
| 21 | 
            +
                expect(@session).not_to have_link('labore', target: '_blank')
         | 
| 20 22 | 
             
              end
         | 
| 21 23 |  | 
| 22 24 | 
             
              it 'should notify if an invalid locator is specified' do
         | 
| @@ -40,7 +42,7 @@ Capybara::SpecHelper.spec '#has_link?' do | |
| 40 42 | 
             
              it 'should raise an error if an invalid option is passed' do
         | 
| 41 43 | 
             
                expect do
         | 
| 42 44 | 
             
                  expect(@session).to have_link('labore', invalid: true)
         | 
| 43 | 
            -
                end.to raise_error(ArgumentError, 'Invalid option(s) :invalid, should be one of :above, :below, :left_of, :right_of, :near, :count, :minimum, :maximum, :between, :text, :id, :class, :style, :visible, :obscured, :exact, :exact_text, :normalize_ws, :match, :wait, :filter_set, :focused, :href, :alt, :title, :download')
         | 
| 45 | 
            +
                end.to raise_error(ArgumentError, 'Invalid option(s) :invalid, should be one of :above, :below, :left_of, :right_of, :near, :count, :minimum, :maximum, :between, :text, :id, :class, :style, :visible, :obscured, :exact, :exact_text, :normalize_ws, :match, :wait, :filter_set, :focused, :href, :alt, :title, :target, :download')
         | 
| 44 46 | 
             
              end
         | 
| 45 47 | 
             
            end
         | 
| 46 48 |  | 
| @@ -53,12 +55,14 @@ Capybara::SpecHelper.spec '#has_no_link?' do | |
| 53 55 | 
             
                expect(@session).not_to have_no_link('foo')
         | 
| 54 56 | 
             
                expect(@session).not_to have_no_link('awesome title')
         | 
| 55 57 | 
             
                expect(@session).not_to have_no_link('A link', href: '/with_simple_html')
         | 
| 58 | 
            +
                expect(@session).not_to have_no_link('labore', target: '_self')
         | 
| 56 59 | 
             
              end
         | 
| 57 60 |  | 
| 58 61 | 
             
              it 'should be true if the given link is not on the page' do
         | 
| 59 62 | 
             
                expect(@session).to have_no_link('monkey')
         | 
| 60 63 | 
             
                expect(@session).to have_no_link('A link', href: '/nonexistent-href')
         | 
| 61 64 | 
             
                expect(@session).to have_no_link('A link', href: %r{/nonexistent-href})
         | 
| 65 | 
            +
                expect(@session).to have_no_link('labore', target: '_blank')
         | 
| 62 66 | 
             
              end
         | 
| 63 67 |  | 
| 64 68 | 
             
              context 'with focused:', requires: [:active_element] do
         | 
| @@ -8,10 +8,10 @@ Capybara::SpecHelper.spec '#have_none_of_selectors' do | |
| 8 8 | 
             
              it 'should be false if any of the given locators are on the page' do
         | 
| 9 9 | 
             
                expect do
         | 
| 10 10 | 
             
                  expect(@session).to have_none_of_selectors(:xpath, '//p', '//a')
         | 
| 11 | 
            -
                end.to raise_error  | 
| 11 | 
            +
                end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 12 12 | 
             
                expect do
         | 
| 13 13 | 
             
                  expect(@session).to have_none_of_selectors(:css, 'p a#foo')
         | 
| 14 | 
            -
                end.to raise_error  | 
| 14 | 
            +
                end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 15 15 | 
             
              end
         | 
| 16 16 |  | 
| 17 17 | 
             
              it 'should be true if none of the given locators are on the page' do
         | 
| @@ -24,7 +24,7 @@ Capybara::SpecHelper.spec '#have_none_of_selectors' do | |
| 24 24 | 
             
                expect(@session).to have_none_of_selectors('p a#doesnotexist', 'abbr')
         | 
| 25 25 | 
             
                expect do
         | 
| 26 26 | 
             
                  expect(@session).to have_none_of_selectors('abbr', 'p a#foo')
         | 
| 27 | 
            -
                end.to raise_error  | 
| 27 | 
            +
                end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 28 28 | 
             
              end
         | 
| 29 29 |  | 
| 30 30 | 
             
              context 'should respect scopes' do
         | 
| @@ -32,7 +32,7 @@ Capybara::SpecHelper.spec '#have_none_of_selectors' do | |
| 32 32 | 
             
                  @session.within "//p[@id='first']" do
         | 
| 33 33 | 
             
                    expect do
         | 
| 34 34 | 
             
                      expect(@session).to have_none_of_selectors(".//a[@id='foo']")
         | 
| 35 | 
            -
                    end.to raise_error  | 
| 35 | 
            +
                    end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 36 36 | 
             
                    expect(@session).to have_none_of_selectors(".//a[@id='red']")
         | 
| 37 37 | 
             
                  end
         | 
| 38 38 | 
             
                end
         | 
| @@ -41,7 +41,7 @@ Capybara::SpecHelper.spec '#have_none_of_selectors' do | |
| 41 41 | 
             
                  el = @session.find "//p[@id='first']"
         | 
| 42 42 | 
             
                  expect do
         | 
| 43 43 | 
             
                    expect(el).to have_none_of_selectors(".//a[@id='foo']")
         | 
| 44 | 
            -
                  end.to raise_error  | 
| 44 | 
            +
                  end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 45 45 | 
             
                  expect(el).to have_none_of_selectors(".//a[@id='red']")
         | 
| 46 46 | 
             
                end
         | 
| 47 47 | 
             
              end
         | 
| @@ -50,14 +50,14 @@ Capybara::SpecHelper.spec '#have_none_of_selectors' do | |
| 50 50 | 
             
                it 'should apply the options to all locators' do
         | 
| 51 51 | 
             
                  expect do
         | 
| 52 52 | 
             
                    expect(@session).to have_none_of_selectors('//p//a', text: 'Redirect')
         | 
| 53 | 
            -
                  end.to raise_error  | 
| 53 | 
            +
                  end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 54 54 | 
             
                  expect(@session).to have_none_of_selectors('//p', text: 'Doesnotexist')
         | 
| 55 55 | 
             
                end
         | 
| 56 56 |  | 
| 57 57 | 
             
                it 'should discard all matches where the given regexp is matched' do
         | 
| 58 58 | 
             
                  expect do
         | 
| 59 59 | 
             
                    expect(@session).to have_none_of_selectors('//p//a', text: /re[dab]i/i, count: 1)
         | 
| 60 | 
            -
                  end.to raise_error  | 
| 60 | 
            +
                  end.to raise_error RSpec::Expectations::ExpectationNotMetError
         | 
| 61 61 | 
             
                  expect(@session).to have_none_of_selectors('//p//a', text: /Red$/)
         | 
| 62 62 | 
             
                end
         | 
| 63 63 | 
             
              end
         | 
| @@ -23,6 +23,7 @@ Capybara::SpecHelper.spec '#matches_style?', requires: [:css] do | |
| 23 23 | 
             
                expect(@session.find(:css, '#first').matches_style?(display: /^in/)).to be false
         | 
| 24 24 | 
             
              end
         | 
| 25 25 |  | 
| 26 | 
            +
              # rubocop:disable Capybara/MatchStyle
         | 
| 26 27 | 
             
              it 'deprecated has_style?' do
         | 
| 27 28 | 
             
                expect { have_style(display: /^bl/) }.to \
         | 
| 28 29 | 
             
                  output(/have_style is deprecated/).to_stderr
         | 
| @@ -32,4 +33,5 @@ Capybara::SpecHelper.spec '#matches_style?', requires: [:css] do | |
| 32 33 | 
             
                el.has_style?('display' => /^bl/)
         | 
| 33 34 | 
             
                expect(Capybara::Helpers).to have_received(:warn)
         | 
| 34 35 | 
             
              end
         | 
| 36 | 
            +
              # rubocop:enable Capybara/MatchStyle
         | 
| 35 37 | 
             
            end
         | 
| @@ -157,6 +157,12 @@ Capybara::SpecHelper.spec 'node' do | |
| 157 157 | 
             
                    expect(@session.find(:css, '#existing_content_editable_child_parent').text).to eq("Some content\nWYSIWYG")
         | 
| 158 158 | 
             
                  end
         | 
| 159 159 | 
             
                end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                it 'should submit single text input forms if ended with \n' do
         | 
| 162 | 
            +
                  @session.visit('/form')
         | 
| 163 | 
            +
                  @session.find(:css, '#single_input').set("my entry\n")
         | 
| 164 | 
            +
                  expect(extract_results(@session)['single_input']).to eq('my entry')
         | 
| 165 | 
            +
                end
         | 
| 160 166 | 
             
              end
         | 
| 161 167 |  | 
| 162 168 | 
             
              describe '#tag_name' do
         | 
| @@ -651,6 +657,16 @@ Capybara::SpecHelper.spec 'node' do | |
| 651 657 | 
             
                      expect(target).to have_text(%r{^HTML5 Dropped string: text/plain drag_html5-#{key}$}m, exact: true)
         | 
| 652 658 | 
             
                    end
         | 
| 653 659 | 
             
                  end
         | 
| 660 | 
            +
             | 
| 661 | 
            +
                  it 'should trigger a dragenter event, before the first dragover event' do
         | 
| 662 | 
            +
                    @session.visit('/with_js')
         | 
| 663 | 
            +
                    element = @session.find('//div[@id="drag_html5"]')
         | 
| 664 | 
            +
                    target = @session.find('//div[@id="drop_html5"]')
         | 
| 665 | 
            +
                    element.drag_to(target)
         | 
| 666 | 
            +
             | 
| 667 | 
            +
                    # Events are listed in reverse chronological order
         | 
| 668 | 
            +
                    expect(@session).to have_text(/DragOver.*DragEnter/m)
         | 
| 669 | 
            +
                  end
         | 
| 654 670 | 
             
                end
         | 
| 655 671 | 
             
              end
         | 
| 656 672 |  | 
| @@ -36,7 +36,9 @@ Capybara::SpecHelper.spec '#scroll_to', requires: [:scroll] do | |
| 36 36 | 
             
              it 'can scroll the window to the vertical bottom' do
         | 
| 37 37 | 
             
                @session.scroll_to :bottom
         | 
| 38 38 | 
             
                max_scroll = @session.evaluate_script('document.documentElement.scrollHeight - document.documentElement.clientHeight')
         | 
| 39 | 
            -
                 | 
| 39 | 
            +
                scrolled_location_x, scrolled_location_y = @session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')
         | 
| 40 | 
            +
                expect(scrolled_location_x).to be_within(0.5).of(0)
         | 
| 41 | 
            +
                expect(scrolled_location_y).to be_within(0.5).of(max_scroll)
         | 
| 40 42 | 
             
              end
         | 
| 41 43 |  | 
| 42 44 | 
             
              it 'can scroll the window to the vertical center' do
         | 
| @@ -29,6 +29,6 @@ Capybara::SpecHelper.spec '#windows', requires: [:windows] do | |
| 29 29 | 
             
                titles = @session.windows.map do |window|
         | 
| 30 30 | 
             
                  @session.within_window(window) { @session.title }
         | 
| 31 31 | 
             
                end
         | 
| 32 | 
            -
                expect(titles).to match_array(['With Windows', 'Title of the first popup', 'Title of popup two'])
         | 
| 32 | 
            +
                expect(titles).to match_array(['With Windows', 'Title of the first popup', 'Title of popup two']) # rubocop:disable RSpec/MatchArray
         | 
| 33 33 | 
             
              end
         | 
| 34 34 | 
             
            end
         | 
| @@ -695,6 +695,10 @@ New line after and before textarea tag | |
| 695 695 | 
             
              </p>
         | 
| 696 696 | 
             
            </form>
         | 
| 697 697 |  | 
| 698 | 
            +
            <form id="single_input_form" action="/form" method="post">
         | 
| 699 | 
            +
              <input type="text" name="form[single_input]" id="single_input"/>
         | 
| 700 | 
            +
            </form>
         | 
| 701 | 
            +
             | 
| 698 702 | 
             
            <label>Confusion
         | 
| 699 703 | 
             
              <input type="checkbox" id="confusion_checkbox" class="confusion-checkbox confusion"/>
         | 
| 700 704 | 
             
            </label>
         | 
| @@ -19,7 +19,7 @@ | |
| 19 19 |  | 
| 20 20 | 
             
            <p class="para" id="first" data-random="abc\def" style="line-height: 25px;">
         | 
| 21 21 | 
             
              Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
         | 
| 22 | 
            -
              tempor incididunt ut <a href="/with_simple_html" title="awesome title" class="simple" tabindex="1">labore</a>
         | 
| 22 | 
            +
              tempor incididunt ut <a href="/with_simple_html" title="awesome title" class="simple" tabindex="1" target="_self">labore</a>
         | 
| 23 23 | 
             
              et dolore magna aliqua. Ut enim ad minim veniam,
         | 
| 24 24 | 
             
              quis nostrud exercitation <a href="/foo" id="foo" data-test-id="test-foo">ullamco</a> laboris nisi
         | 
| 25 25 | 
             
              ut aliquip ex ea commodo consequat.
         | 
    
        data/lib/capybara/version.rb
    CHANGED
    
    
    
        data/spec/css_builder_spec.rb
    CHANGED
    
    
    
        data/spec/css_splitter_spec.rb
    CHANGED
    
    
    
        data/spec/rack_test_spec.rb
    CHANGED
    
    | @@ -220,7 +220,7 @@ RSpec.describe Capybara::RackTest::Driver do | |
| 220 220 | 
             
                  driver = described_class.new(TestApp)
         | 
| 221 221 |  | 
| 222 222 | 
             
                  driver.visit('/redirect')
         | 
| 223 | 
            -
                  expect(driver.response. | 
| 223 | 
            +
                  expect(driver.response.headers['Location']).to be_nil
         | 
| 224 224 | 
             
                  expect(driver.current_url).to match %r{/landed$}
         | 
| 225 225 | 
             
                end
         | 
| 226 226 |  | 
| @@ -234,7 +234,7 @@ RSpec.describe Capybara::RackTest::Driver do | |
| 234 234 | 
             
                  driver = described_class.new(TestApp, follow_redirects: false)
         | 
| 235 235 |  | 
| 236 236 | 
             
                  driver.visit('/redirect')
         | 
| 237 | 
            -
                  expect(driver.response. | 
| 237 | 
            +
                  expect(driver.response.headers['Location']).to match %r{/redirect_again$}
         | 
| 238 238 | 
             
                  expect(driver.current_url).to match %r{/redirect$}
         | 
| 239 239 | 
             
                end
         | 
| 240 240 | 
             
              end
         | 
| @@ -16,7 +16,7 @@ feature 'if fscenario aliases focused tag then' do | |
| 16 16 | 
             
            end
         | 
| 17 17 |  | 
| 18 18 | 
             
            feature 'if xscenario aliases to pending then' do
         | 
| 19 | 
            -
              xscenario "this test should be 'temporarily disabled with xscenario'" do
         | 
| 19 | 
            +
              xscenario "this test should be 'temporarily disabled with xscenario'" do # rubocop:disable RSpec/PendingWithoutReason
         | 
| 20 20 | 
             
              end
         | 
| 21 21 | 
             
            end
         | 
| 22 22 |  | 
    
        data/spec/rspec_matchers_spec.rb
    CHANGED
    
    | @@ -56,6 +56,31 @@ RSpec.describe 'Capybara RSpec Matchers', type: :feature do | |
| 56 56 | 
             
                end
         | 
| 57 57 | 
             
              end
         | 
| 58 58 |  | 
| 59 | 
            +
              context 'with a filter block' do
         | 
| 60 | 
            +
                it 'applies the filter' do
         | 
| 61 | 
            +
                  visit('/with_html')
         | 
| 62 | 
            +
                  expect(page).to have_selector(:css, 'input#test_field')
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  expect(page).to have_selector(:css, 'input', count: 1) { |input| input.value == 'monkey' }
         | 
| 65 | 
            +
                  expect(page).to have_selector(:css, 'input', count: 1) do |input|
         | 
| 66 | 
            +
                    input.value == 'monkey'
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
                  expect(page).to have_no_selector(:css, 'input#test_field') { |input| input.value == 'not a monkey' }
         | 
| 69 | 
            +
                  expect(page).to have_no_selector(:css, 'input#test_field') do |input|
         | 
| 70 | 
            +
                    input.value == 'not a monkey'
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  expect(page).not_to have_selector(:css, 'input#test_field') { |input| input.value == 'not a monkey' }
         | 
| 74 | 
            +
                  expect(page).not_to have_selector(:css, 'input#test_field') do |input|
         | 
| 75 | 
            +
                    input.value == 'not a monkey'
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
                  expect(page).not_to have_no_selector(:css, 'input', count: 1) { |input| input.value == 'monkey' }
         | 
| 78 | 
            +
                  expect(page).not_to have_no_selector(:css, 'input#test_field', count: 1) do |input|
         | 
| 79 | 
            +
                    input.value == 'monkey'
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
             | 
| 59 84 | 
             
              def error_msg_for(&block)
         | 
| 60 85 | 
             
                expect(&block).to(raise_error { |e| return e.message })
         | 
| 61 86 | 
             
              end
         | 
    
        data/spec/sauce_spec_chrome.rb
    CHANGED
    
    | @@ -27,7 +27,7 @@ Capybara.register_driver :sauce_chrome do |app| | |
| 27 27 |  | 
| 28 28 | 
             
              Capybara::Selenium::Driver.new(app,
         | 
| 29 29 | 
             
                                             browser: :remote, url: url,
         | 
| 30 | 
            -
                                              | 
| 30 | 
            +
                                             capabilities: capabilities,
         | 
| 31 31 | 
             
                                             options: Selenium::WebDriver::Chrome::Options.new(args: ['']))
         | 
| 32 32 | 
             
            end
         | 
| 33 33 |  | 
| @@ -10,8 +10,8 @@ CHROME_DRIVER = :selenium_chrome | |
| 10 10 |  | 
| 11 11 | 
             
            Selenium::WebDriver::Chrome.path = '/usr/bin/google-chrome-beta' if ENV.fetch('CI', nil) && ENV.fetch('CHROME_BETA', nil)
         | 
| 12 12 |  | 
| 13 | 
            -
            browser_options =  | 
| 14 | 
            -
            browser_options.headless | 
| 13 | 
            +
            browser_options = Selenium::WebDriver::Chrome::Options.new
         | 
| 14 | 
            +
            browser_options.add_argument('--headless') if ENV['HEADLESS']
         | 
| 15 15 |  | 
| 16 16 | 
             
            # Chromedriver 77 requires setting this for headless mode on linux
         | 
| 17 17 | 
             
            # Different versions of Chrome/selenium-webdriver require setting differently - jus set them all
         | 
| @@ -87,6 +87,9 @@ Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_DRIVER.to_s, capybar | |
| 87 87 | 
             
                pending "Chrome headless doesn't support maximize" if ENV['HEADLESS']
         | 
| 88 88 | 
             
              when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
         | 
| 89 89 | 
             
                pending "Selenium doesn't currently support getting visible text for shadow root elements"
         | 
| 90 | 
            +
              when /Capybara::Session selenium_chrome node #shadow_root/
         | 
| 91 | 
            +
                skip 'Not supported with this Selenium version' if selenium_lt?('4.1', @session)
         | 
| 92 | 
            +
                skip 'Not supported with this chromedriver version' if chromedriver_lt?('96.0', @session)
         | 
| 90 93 | 
             
              end
         | 
| 91 94 | 
             
            end
         | 
| 92 95 |  | 
| @@ -201,8 +204,4 @@ RSpec.describe 'Capybara::Session with chrome' do | |
| 201 204 | 
             
                  end.not_to raise_error
         | 
| 202 205 | 
             
                end
         | 
| 203 206 | 
             
              end
         | 
| 204 | 
            -
             | 
| 205 | 
            -
              def chromedriver_version
         | 
| 206 | 
            -
                Gem::Version.new(session.driver.browser.capabilities['chrome']['chromedriverVersion'].split[0])
         | 
| 207 | 
            -
              end
         | 
| 208 207 | 
             
            end
         | 
| @@ -39,11 +39,10 @@ Capybara.register_driver :selenium_chrome_remote do |app| | |
| 39 39 | 
             
              ensure_selenium_running!
         | 
| 40 40 |  | 
| 41 41 | 
             
              url = "http://#{selenium_host}:#{selenium_port}/wd/hub"
         | 
| 42 | 
            -
              browser_options =  | 
| 42 | 
            +
              browser_options = Selenium::WebDriver::Chrome::Options.new
         | 
| 43 43 |  | 
| 44 44 | 
             
              Capybara::Selenium::Driver.new app,
         | 
| 45 45 | 
             
                                             browser: :remote,
         | 
| 46 | 
            -
                                             desired_capabilities: :chrome,
         | 
| 47 46 | 
             
                                             options: browser_options,
         | 
| 48 47 | 
             
                                             url: url
         | 
| 49 48 | 
             
            end
         | 
| @@ -62,8 +61,11 @@ Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_REMOTE_DRIVER.to_s, | |
| 62 61 | 
             
                   'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once for each set of files uploaded',
         | 
| 63 62 | 
             
                   'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once when uploading multiple files from empty'
         | 
| 64 63 | 
             
                pending "Selenium with Remote Chrome doesn't support multiple file upload" unless selenium_gte?(3.14)
         | 
| 65 | 
            -
              when /Capybara::Session  | 
| 64 | 
            +
              when /Capybara::Session selenium_chrome_remote node #shadow_root should get visible text/
         | 
| 66 65 | 
             
                pending "Selenium doesn't currently support getting visible text for shadow root elements"
         | 
| 66 | 
            +
              when /Capybara::Session selenium_chrome_remote node #shadow_root/
         | 
| 67 | 
            +
                skip 'Not supported with this Selenium version' if selenium_lt?('4.1', @session)
         | 
| 68 | 
            +
                skip 'Not supported with this chromedriver version' if chromedriver_lt?('96.0', @session)
         | 
| 67 69 | 
             
              end
         | 
| 68 70 | 
             
            end
         | 
| 69 71 |  | 
| @@ -96,8 +98,4 @@ RSpec.describe 'Capybara::Session with remote Chrome' do | |
| 96 98 | 
             
                  end.not_to raise_error
         | 
| 97 99 | 
             
                end
         | 
| 98 100 | 
             
              end
         | 
| 99 | 
            -
             | 
| 100 | 
            -
              def chromedriver_version
         | 
| 101 | 
            -
                Gem::Version.new(session.driver.browser.capabilities['chrome']['chromedriverVersion'].split[0])
         | 
| 102 | 
            -
              end
         | 
| 103 101 | 
             
            end
         | 
    
        data/spec/selenium_spec_edge.rb
    CHANGED
    
    | @@ -10,15 +10,17 @@ require 'rspec/shared_spec_matchers' | |
| 10 10 | 
             
            #   Selenium::WebDriver::Edge::Service.driver_path = '/usr/local/bin/msedgedriver'
         | 
| 11 11 | 
             
            # end
         | 
| 12 12 |  | 
| 13 | 
            -
            if  | 
| 14 | 
            -
              Selenium::WebDriver:: | 
| 13 | 
            +
            if Selenium::WebDriver::Platform.mac?
         | 
| 14 | 
            +
              Selenium::WebDriver::Edge.path = '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge'
         | 
| 15 15 | 
             
            end
         | 
| 16 16 |  | 
| 17 17 | 
             
            Capybara.register_driver :selenium_edge do |app|
         | 
| 18 18 | 
             
              # ::Selenium::WebDriver.logger.level = "debug"
         | 
| 19 19 | 
             
              # If we don't create an options object the path set above won't be used
         | 
| 20 | 
            -
              browser_options =  | 
| 21 | 
            -
               | 
| 20 | 
            +
              browser_options = Selenium::WebDriver::Edge::Options.new
         | 
| 21 | 
            +
              browser_options.add_argument('--headless') if ENV['HEADLESS']
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              Capybara::Selenium::Driver.new(app, browser: :edge, options: browser_options).tap do |driver|
         | 
| 22 24 | 
             
                driver.browser
         | 
| 23 25 | 
             
                driver.download_path = Capybara.save_path
         | 
| 24 26 | 
             
              end
         | 
| @@ -30,14 +32,16 @@ end | |
| 30 32 |  | 
| 31 33 | 
             
            skipped_tests = %i[response_headers status_code trigger]
         | 
| 32 34 |  | 
| 33 | 
            -
            Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver:: | 
| 35 | 
            +
            Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Edge) if ENV['CI']
         | 
| 34 36 |  | 
| 35 37 | 
             
            Capybara::SpecHelper.run_specs TestSessions::SeleniumEdge, 'selenium', capybara_skip: skipped_tests do |example|
         | 
| 36 38 | 
             
              case example.metadata[:full_description]
         | 
| 37 39 | 
             
              when 'Capybara::Session selenium #attach_file with a block can upload by clicking the file input'
         | 
| 38 | 
            -
                pending " | 
| 39 | 
            -
              when /Capybara::Session  | 
| 40 | 
            +
                pending "Edge doesn't allow clicking on file inputs"
         | 
| 41 | 
            +
              when /Capybara::Session selenium node #shadow_root should get visible text/
         | 
| 40 42 | 
             
                pending "Selenium doesn't currently support getting visible text for shadow root elements"
         | 
| 43 | 
            +
              when /Capybara::Session selenium Capybara::Window#maximize/
         | 
| 44 | 
            +
                pending "Edge headless doesn't support maximize" if ENV['HEADLESS']
         | 
| 41 45 | 
             
              end
         | 
| 42 46 | 
             
            end
         | 
| 43 47 |  | 
| @@ -6,7 +6,7 @@ require 'shared_selenium_session' | |
| 6 6 | 
             
            require 'shared_selenium_node'
         | 
| 7 7 | 
             
            require 'rspec/shared_spec_matchers'
         | 
| 8 8 |  | 
| 9 | 
            -
            browser_options =  | 
| 9 | 
            +
            browser_options = Selenium::WebDriver::Firefox::Options.new
         | 
| 10 10 | 
             
            browser_options.headless! if ENV['HEADLESS']
         | 
| 11 11 | 
             
            # browser_options.add_option("log", {"level": "trace"})
         | 
| 12 12 |  | 
| @@ -62,7 +62,7 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumFirefox, 'selenium', capyba | |
| 62 62 | 
             
              when 'Capybara::Session selenium #accept_confirm should work with nested modals'
         | 
| 63 63 | 
             
                skip 'Broken in 63 <= FF < 69 - https://bugzilla.mozilla.org/show_bug.cgi?id=1487358' if firefox_gte?(63, @session) && firefox_lt?(69, @session)
         | 
| 64 64 | 
             
                skip 'Hangs in 69 <= FF < 71 - Dont know what issue for this - previous issue was closed as fixed but it is not' if firefox_gte?(69, @session) && firefox_lt?(71, @session)
         | 
| 65 | 
            -
                skip 'Broken again intermittently in FF 71 - jus skip it'
         | 
| 65 | 
            +
                skip 'Broken again intermittently in FF 71 - jus skip it' if firefox_lt?(109, @session) # don't really know when it was fixed
         | 
| 66 66 | 
             
              when 'Capybara::Session selenium #click_link can download a file'
         | 
| 67 67 | 
             
                skip 'Need to figure out testing of file downloading on windows platform' if Gem.win_platform?
         | 
| 68 68 | 
             
              when 'Capybara::Session selenium #reset_session! removes ALL cookies'
         | 
| @@ -71,17 +71,23 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumFirefox, 'selenium', capyba | |
| 71 71 | 
             
                pending "Firefox < 62 doesn't support a DataTransfer constructor" if firefox_lt?(62.0, @session)
         | 
| 72 72 | 
             
              when 'Capybara::Session selenium #accept_alert should handle the alert if the page changes',
         | 
| 73 73 | 
             
                   'Capybara::Session selenium #accept_alert with an asynchronous alert should accept the alert'
         | 
| 74 | 
            -
                skip 'No clue what Firefox is doing here - works fine on MacOS locally'
         | 
| 74 | 
            +
                skip 'No clue what Firefox is doing here - works fine on MacOS locally' if firefox_lt?(109, @session) # don't really know when it was fixed
         | 
| 75 75 | 
             
              when 'Capybara::Session selenium node #shadow_root should find elements inside the shadow dom using CSS',
         | 
| 76 76 | 
             
                   'Capybara::Session selenium node #shadow_root should find nested shadow roots',
         | 
| 77 77 | 
             
                   'Capybara::Session selenium node #shadow_root should click on elements',
         | 
| 78 78 | 
             
                   'Capybara::Session selenium node #shadow_root should use convenience methods once moved to a descendant of the shadow root',
         | 
| 79 | 
            +
                   'Capybara::Session selenium node #shadow_root should produce error messages when failing',
         | 
| 79 80 | 
             
                   'Capybara::Session with firefox with selenium driver #evaluate_script returns a shadow root'
         | 
| 80 81 | 
             
                pending "Firefox doesn't yet have full W3C shadow root support"
         | 
| 81 82 | 
             
              when 'Capybara::Session selenium #fill_in should handle carriage returns with line feeds in a textarea correctly'
         | 
| 82 83 | 
             
                pending 'Not sure what firefox is doing here'
         | 
| 83 | 
            -
              when /Capybara::Session  | 
| 84 | 
            +
              when /Capybara::Session selenium node #shadow_root should get visible text/
         | 
| 84 85 | 
             
                pending "Selenium doesn't currently support getting visible text for shadow root elements"
         | 
| 86 | 
            +
              when /Capybara::Session selenium node #shadow_root/
         | 
| 87 | 
            +
                skip 'Not supported with this Selenium version' if selenium_lt?('4.1', @session)
         | 
| 88 | 
            +
                skip 'Not supported with this geckodriver version' if geckodriver_lt?('0.31.0', @session)
         | 
| 89 | 
            +
              when /Capybara::Session selenium node #set should submit single text input forms if ended with \\n/
         | 
| 90 | 
            +
                pending 'Firefox/geckodriver doesn\'t submit with values ending in \n'
         | 
| 85 91 | 
             
              end
         | 
| 86 92 | 
             
            end
         | 
| 87 93 |  | 
| @@ -35,11 +35,10 @@ Capybara.register_driver :selenium_firefox_remote do |app| | |
| 35 35 | 
             
              ensure_selenium_running!
         | 
| 36 36 |  | 
| 37 37 | 
             
              url = "http://#{selenium_host}:#{selenium_port}/wd/hub"
         | 
| 38 | 
            -
              browser_options =  | 
| 38 | 
            +
              browser_options = Selenium::WebDriver::Firefox::Options.new
         | 
| 39 39 |  | 
| 40 40 | 
             
              Capybara::Selenium::Driver.new app,
         | 
| 41 41 | 
             
                                             browser: :remote,
         | 
| 42 | 
            -
                                             desired_capabilities: :firefox,
         | 
| 43 42 | 
             
                                             options: browser_options,
         | 
| 44 43 | 
             
                                             url: url
         | 
| 45 44 | 
             
            end
         | 
| @@ -65,8 +64,22 @@ Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVE | |
| 65 64 | 
             
              when /#accept_confirm should work with nested modals$/
         | 
| 66 65 | 
             
                # skip because this is timing based and hence flaky when set to pending
         | 
| 67 66 | 
             
                skip 'Broken in FF 63 - https://bugzilla.mozilla.org/show_bug.cgi?id=1487358' if firefox_gte?(63, @session)
         | 
| 68 | 
            -
              when  | 
| 67 | 
            +
              when 'Capybara::Session selenium_firefox_remote #fill_in should handle carriage returns with line feeds in a textarea correctly'
         | 
| 68 | 
            +
                pending 'Not sure what firefox is doing here'
         | 
| 69 | 
            +
              when 'Capybara::Session selenium_firefox_remote node #shadow_root should find elements inside the shadow dom using CSS',
         | 
| 70 | 
            +
                   'Capybara::Session selenium_firefox_remote node #shadow_root should find nested shadow roots',
         | 
| 71 | 
            +
                   'Capybara::Session selenium_firefox_remote node #shadow_root should click on elements',
         | 
| 72 | 
            +
                   'Capybara::Session selenium_firefox_remote node #shadow_root should use convenience methods once moved to a descendant of the shadow root',
         | 
| 73 | 
            +
                   'Capybara::Session selenium_firefox_remote node #shadow_root should produce error messages when failing',
         | 
| 74 | 
            +
                   'Capybara::Session with firefox with selenium driver #evaluate_script returns a shadow root'
         | 
| 75 | 
            +
                pending "Firefox doesn't yet have full W3C shadow root support"
         | 
| 76 | 
            +
              when /Capybara::Session selenium_firefox_remote node #shadow_root should get visible text/
         | 
| 69 77 | 
             
                pending "Selenium doesn't currently support getting visible text for shadow root elements"
         | 
| 78 | 
            +
              when /Capybara::Session selenium_firefox_remote node #shadow_root/
         | 
| 79 | 
            +
                skip 'Not supported with this Selenium version' if selenium_lt?('4.1', @session)
         | 
| 80 | 
            +
                skip 'Not supported with this geckodriver version' if geckodriver_lt?('0.31.0', @session)
         | 
| 81 | 
            +
              when /Capybara::Session selenium_firefox_remote node #set should submit single text input forms if ended with \\n/
         | 
| 82 | 
            +
                pending 'Firefox/geckodriver doesn\'t submit with values ending in \n'
         | 
| 70 83 | 
             
              end
         | 
| 71 84 | 
             
            end
         | 
| 72 85 |  | 
    
        data/spec/selenium_spec_ie.rb
    CHANGED
    
    | @@ -28,7 +28,7 @@ end | |
| 28 28 |  | 
| 29 29 | 
             
            Capybara.register_driver :selenium_ie do |app|
         | 
| 30 30 | 
             
              # ::Selenium::WebDriver.logger.level = "debug"
         | 
| 31 | 
            -
              options =  | 
| 31 | 
            +
              options = Selenium::WebDriver::IE::Options.new
         | 
| 32 32 | 
             
              # options.require_window_focus = true
         | 
| 33 33 | 
             
              # options.add_option("log", {"level": "trace"})
         | 
| 34 34 |  | 
| @@ -14,7 +14,7 @@ SAFARI_DRIVER = :selenium_safari | |
| 14 14 | 
             
            #   ::Selenium::WebDriver::Safari
         | 
| 15 15 | 
             
            # end.driver_path = '/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver'
         | 
| 16 16 |  | 
| 17 | 
            -
            browser_options =  | 
| 17 | 
            +
            browser_options = Selenium::WebDriver::Safari::Options.new
         | 
| 18 18 | 
             
            # browser_options.headless! if ENV['HEADLESS']
         | 
| 19 19 |  | 
| 20 20 | 
             
            Capybara.register_driver :selenium_safari do |app|
         | 
    
        data/spec/server_spec.rb
    CHANGED
    
    | @@ -95,7 +95,7 @@ RSpec.describe Capybara::Server do | |
| 95 95 | 
             
              it 'should return its #base_url' do
         | 
| 96 96 | 
             
                app = proc { |_env| [200, {}, ['Hello Server!']] }
         | 
| 97 97 | 
             
                server = described_class.new(app).boot
         | 
| 98 | 
            -
                uri =  | 
| 98 | 
            +
                uri = Addressable::URI.parse(server.base_url)
         | 
| 99 99 | 
             
                expect(uri.to_hash).to include(scheme: 'http', host: server.host, port: server.port)
         | 
| 100 100 | 
             
              end
         | 
| 101 101 |  | 
| @@ -136,7 +136,7 @@ RSpec.describe Capybara::Server do | |
| 136 136 | 
             
                end
         | 
| 137 137 |  | 
| 138 138 | 
             
                expect(res.body).to include('Hello SSL Server!')
         | 
| 139 | 
            -
                uri =  | 
| 139 | 
            +
                uri = Addressable::URI.parse(server.base_url)
         | 
| 140 140 | 
             
                expect(uri.to_hash).to include(scheme: 'https', host: server.host, port: server.port)
         | 
| 141 141 | 
             
              ensure
         | 
| 142 142 | 
             
                Capybara.server = :default
         |