capybara 2.18.0 → 3.0.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 +55 -1
- data/README.md +18 -17
- data/lib/capybara/config.rb +11 -58
- data/lib/capybara/cucumber.rb +2 -3
- data/lib/capybara/driver/base.rb +15 -16
- data/lib/capybara/driver/node.rb +5 -4
- data/lib/capybara/dsl.rb +1 -0
- data/lib/capybara/helpers.rb +19 -29
- data/lib/capybara/minitest/spec.rb +15 -14
- data/lib/capybara/minitest.rb +139 -138
- data/lib/capybara/node/actions.rb +60 -81
- data/lib/capybara/node/base.rb +11 -18
- data/lib/capybara/node/document.rb +2 -2
- data/lib/capybara/node/document_matchers.rb +8 -8
- data/lib/capybara/node/element.rb +30 -40
- data/lib/capybara/node/finders.rb +62 -70
- data/lib/capybara/node/matchers.rb +50 -71
- data/lib/capybara/node/simple.rb +11 -17
- data/lib/capybara/queries/ancestor_query.rb +11 -7
- data/lib/capybara/queries/base_query.rb +22 -18
- data/lib/capybara/queries/current_path_query.rb +8 -24
- data/lib/capybara/queries/match_query.rb +3 -7
- data/lib/capybara/queries/selector_query.rb +92 -95
- data/lib/capybara/queries/sibling_query.rb +4 -4
- data/lib/capybara/queries/text_query.rb +35 -35
- data/lib/capybara/queries/title_query.rb +8 -11
- data/lib/capybara/rack_test/browser.rb +15 -18
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +6 -10
- data/lib/capybara/rack_test/form.rb +50 -40
- data/lib/capybara/rack_test/node.rb +93 -63
- data/lib/capybara/rails.rb +2 -6
- data/lib/capybara/result.rb +22 -22
- data/lib/capybara/rspec/compound.rb +5 -10
- data/lib/capybara/rspec/features.rb +17 -48
- data/lib/capybara/rspec/matcher_proxies.rb +31 -15
- data/lib/capybara/rspec/matchers.rb +70 -61
- data/lib/capybara/rspec.rb +5 -10
- data/lib/capybara/selector/css.rb +6 -11
- data/lib/capybara/selector/filter.rb +1 -17
- data/lib/capybara/selector/filter_set.rb +18 -15
- data/lib/capybara/selector/filters/base.rb +7 -6
- data/lib/capybara/selector/filters/expression_filter.rb +6 -23
- data/lib/capybara/selector/filters/node_filter.rb +2 -12
- data/lib/capybara/selector/selector.rb +28 -34
- data/lib/capybara/selector.rb +129 -117
- data/lib/capybara/selenium/driver.rb +131 -125
- data/lib/capybara/selenium/node.rb +197 -115
- data/lib/capybara/server.rb +3 -2
- data/lib/capybara/session/config.rb +47 -67
- data/lib/capybara/session/matchers.rb +8 -7
- data/lib/capybara/session.rb +138 -224
- data/lib/capybara/spec/public/test.js +25 -4
- data/lib/capybara/spec/session/accept_alert_spec.rb +1 -0
- data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -2
- data/lib/capybara/spec/session/accept_prompt_spec.rb +1 -0
- data/lib/capybara/spec/session/all_spec.rb +31 -18
- data/lib/capybara/spec/session/ancestor_spec.rb +6 -8
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +6 -5
- data/lib/capybara/spec/session/assert_current_path.rb +12 -11
- data/lib/capybara/spec/session/assert_selector.rb +1 -0
- data/lib/capybara/spec/session/assert_text.rb +23 -23
- data/lib/capybara/spec/session/assert_title.rb +13 -3
- data/lib/capybara/spec/session/attach_file_spec.rb +51 -30
- data/lib/capybara/spec/session/body_spec.rb +1 -0
- data/lib/capybara/spec/session/check_spec.rb +7 -6
- data/lib/capybara/spec/session/choose_spec.rb +5 -4
- data/lib/capybara/spec/session/click_button_spec.rb +24 -32
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +8 -7
- data/lib/capybara/spec/session/click_link_spec.rb +8 -7
- data/lib/capybara/spec/session/current_scope_spec.rb +4 -3
- data/lib/capybara/spec/session/current_url_spec.rb +17 -6
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -0
- data/lib/capybara/spec/session/element/assert_match_selector.rb +1 -1
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +1 -1
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +5 -5
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +3 -2
- data/lib/capybara/spec/session/evaluate_script_spec.rb +4 -3
- data/lib/capybara/spec/session/execute_script_spec.rb +4 -3
- data/lib/capybara/spec/session/fill_in_spec.rb +30 -5
- data/lib/capybara/spec/session/find_button_spec.rb +4 -3
- data/lib/capybara/spec/session/find_by_id_spec.rb +2 -1
- data/lib/capybara/spec/session/find_field_spec.rb +9 -15
- data/lib/capybara/spec/session/find_link_spec.rb +6 -5
- data/lib/capybara/spec/session/find_spec.rb +37 -31
- data/lib/capybara/spec/session/first_spec.rb +60 -33
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +2 -1
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +9 -16
- data/lib/capybara/spec/session/go_back_spec.rb +1 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +15 -15
- data/lib/capybara/spec/session/has_button_spec.rb +2 -1
- data/lib/capybara/spec/session/has_css_spec.rb +3 -2
- data/lib/capybara/spec/session/has_current_path_spec.rb +12 -28
- data/lib/capybara/spec/session/has_field_spec.rb +4 -3
- data/lib/capybara/spec/session/has_link_spec.rb +1 -0
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +17 -17
- data/lib/capybara/spec/session/has_select_spec.rb +30 -29
- data/lib/capybara/spec/session/has_selector_spec.rb +5 -4
- data/lib/capybara/spec/session/has_table_spec.rb +2 -1
- data/lib/capybara/spec/session/has_text_spec.rb +9 -13
- data/lib/capybara/spec/session/has_title_spec.rb +1 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
- data/lib/capybara/spec/session/headers.rb +2 -1
- data/lib/capybara/spec/session/html_spec.rb +1 -0
- data/lib/capybara/spec/session/node_spec.rb +91 -56
- data/lib/capybara/spec/session/node_wrapper_spec.rb +36 -0
- data/lib/capybara/spec/session/refresh_spec.rb +6 -2
- data/lib/capybara/spec/session/reset_session_spec.rb +19 -0
- data/lib/capybara/spec/session/response_code.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -11
- data/lib/capybara/spec/session/save_page_spec.rb +1 -17
- data/lib/capybara/spec/session/save_screenshot_spec.rb +3 -3
- data/lib/capybara/spec/session/select_spec.rb +20 -20
- data/lib/capybara/spec/session/selectors_spec.rb +2 -2
- data/lib/capybara/spec/session/sibling_spec.rb +1 -1
- data/lib/capybara/spec/session/text_spec.rb +17 -3
- data/lib/capybara/spec/session/title_spec.rb +11 -1
- data/lib/capybara/spec/session/uncheck_spec.rb +4 -3
- data/lib/capybara/spec/session/unselect_spec.rb +6 -5
- data/lib/capybara/spec/session/visit_spec.rb +9 -3
- data/lib/capybara/spec/session/window/become_closed_spec.rb +2 -1
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +2 -1
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
- data/lib/capybara/spec/session/window/window_spec.rb +12 -12
- data/lib/capybara/spec/session/window/windows_spec.rb +2 -3
- data/lib/capybara/spec/session/window/within_window_spec.rb +15 -71
- data/lib/capybara/spec/session/within_spec.rb +1 -0
- data/lib/capybara/spec/spec_helper.rb +34 -18
- data/lib/capybara/spec/test_app.rb +17 -9
- data/lib/capybara/spec/views/form.erb +7 -0
- data/lib/capybara/spec/views/with_html.erb +23 -1
- data/lib/capybara/spec/views/within_frames.erb +4 -1
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +6 -10
- data/lib/capybara.rb +28 -25
- data/spec/basic_node_spec.rb +1 -0
- data/spec/capybara_spec.rb +11 -50
- data/spec/dsl_spec.rb +5 -13
- data/spec/filter_set_spec.rb +5 -4
- data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +3 -2
- data/spec/minitest_spec.rb +4 -3
- data/spec/minitest_spec_spec.rb +3 -2
- data/spec/per_session_config_spec.rb +9 -8
- data/spec/rack_test_spec.rb +21 -20
- data/spec/result_spec.rb +17 -16
- data/spec/rspec/features_spec.rb +17 -14
- data/spec/rspec/scenarios_spec.rb +5 -7
- data/spec/rspec/shared_spec_matchers.rb +96 -99
- data/spec/rspec/views_spec.rb +2 -1
- data/spec/rspec_matchers_spec.rb +18 -2
- data/spec/rspec_spec.rb +11 -15
- data/spec/selector_spec.rb +5 -6
- data/spec/selenium_spec_chrome.rb +9 -4
- data/spec/selenium_spec_edge.rb +27 -0
- data/spec/selenium_spec_ie.rb +31 -0
- data/spec/selenium_spec_marionette.rb +28 -12
- data/spec/server_spec.rb +33 -33
- data/spec/session_spec.rb +2 -1
- data/spec/shared_selenium_session.rb +36 -22
- data/spec/spec_helper.rb +3 -6
- metadata +68 -85
- data/lib/capybara/query.rb +0 -7
- data/spec/selenium_spec_firefox.rb +0 -68
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require "selenium-webdriver"
|
5
|
+
require 'shared_selenium_session'
|
6
|
+
require 'rspec/shared_spec_matchers'
|
7
|
+
|
8
|
+
Capybara.register_driver :selenium_ie do |app|
|
9
|
+
# ::Selenium::WebDriver.logger.level = "debug"
|
10
|
+
Capybara::Selenium::Driver.new(
|
11
|
+
app,
|
12
|
+
browser: :ie,
|
13
|
+
desired_capabilities: ::Selenium::WebDriver::Remote::Capabilities.ie('requireWindowFocus': true)
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
module TestSessions
|
18
|
+
SeleniumIE = Capybara::Session.new(:selenium_ie, TestApp)
|
19
|
+
end
|
20
|
+
|
21
|
+
skipped_tests = %i[response_headers status_code trigger modals hover form_attribute windows]
|
22
|
+
|
23
|
+
$stdout.puts `#{Selenium::WebDriver::IE.driver_path} --version` if ENV['CI']
|
24
|
+
|
25
|
+
Capybara::SpecHelper.run_specs TestSessions::SeleniumIE, "selenium", capybara_skip: skipped_tests
|
26
|
+
|
27
|
+
RSpec.describe "Capybara::Session with Internet Explorer", capybara_skip: skipped_tests do
|
28
|
+
include Capybara::SpecHelper
|
29
|
+
include_examples "Capybara::Session", TestSessions::SeleniumIE, :selenium_ie
|
30
|
+
include_examples Capybara::RSpecMatchers, TestSessions::SeleniumIE, :selenium_ie
|
31
|
+
end
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'spec_helper'
|
3
4
|
require "selenium-webdriver"
|
4
5
|
require 'shared_selenium_session'
|
5
6
|
require 'rspec/shared_spec_matchers'
|
6
7
|
|
7
|
-
browser_options = ::Selenium::WebDriver::Firefox::Options.new
|
8
|
+
browser_options = ::Selenium::WebDriver::Firefox::Options.new
|
8
9
|
browser_options.args << '--headless' if ENV['HEADLESS']
|
9
10
|
browser_options.add_preference 'dom.file.createInChild', true
|
10
11
|
# browser_options.add_option("log", {"level": "trace"})
|
@@ -14,7 +15,7 @@ Capybara.register_driver :selenium_marionette do |app|
|
|
14
15
|
Capybara::Selenium::Driver.new(
|
15
16
|
app,
|
16
17
|
browser: :firefox,
|
17
|
-
desired_capabilities: {marionette: true, 'moz:webdriverClick': true},
|
18
|
+
desired_capabilities: { marionette: true, 'moz:webdriverClick': true },
|
18
19
|
options: browser_options
|
19
20
|
# Get a trace level log from geckodriver
|
20
21
|
# :driver_opts => { args: ['-vv'] }
|
@@ -25,26 +26,22 @@ Capybara.register_driver :selenium_marionette_clear_storage do |app|
|
|
25
26
|
Capybara::Selenium::Driver.new(
|
26
27
|
app,
|
27
28
|
browser: :firefox,
|
28
|
-
desired_capabilities: {marionette: true},
|
29
|
+
desired_capabilities: { marionette: true },
|
29
30
|
clear_local_storage: true,
|
30
31
|
clear_session_storage: true,
|
31
32
|
options: browser_options
|
32
33
|
)
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
36
|
module TestSessions
|
38
37
|
SeleniumMarionette = Capybara::Session.new(:selenium_marionette, TestApp)
|
39
38
|
end
|
40
39
|
|
41
|
-
skipped_tests = [
|
42
|
-
:response_headers,
|
43
|
-
:status_code,
|
44
|
-
:trigger
|
45
|
-
]
|
40
|
+
skipped_tests = %i[response_headers status_code trigger]
|
46
41
|
skipped_tests << :windows if ENV['TRAVIS'] && ENV['SKIP_WINDOW']
|
47
42
|
|
43
|
+
$stdout.puts `#{Selenium::WebDriver::Firefox.driver_path} --version` if ENV['CI']
|
44
|
+
|
48
45
|
Capybara::SpecHelper.run_specs TestSessions::SeleniumMarionette, "selenium", capybara_skip: skipped_tests
|
49
46
|
|
50
47
|
RSpec.describe "Capybara::Session with firefox" do
|
@@ -62,7 +59,7 @@ RSpec.describe Capybara::Selenium::Driver do
|
|
62
59
|
it "should reset browser when quit" do
|
63
60
|
expect(@driver.browser).to be
|
64
61
|
@driver.quit
|
65
|
-
#access instance variable directly so we don't create a new browser instance
|
62
|
+
# access instance variable directly so we don't create a new browser instance
|
66
63
|
expect(@driver.instance_variable_get(:@browser)).to be_nil
|
67
64
|
end
|
68
65
|
|
@@ -123,5 +120,24 @@ RSpec.describe Capybara::Selenium::Driver do
|
|
123
120
|
end
|
124
121
|
end
|
125
122
|
end
|
126
|
-
end
|
127
123
|
|
124
|
+
context "#refresh" do
|
125
|
+
def extract_results(session)
|
126
|
+
expect(session).to have_xpath("//pre[@id='results']")
|
127
|
+
YAML.load Nokogiri::HTML(session.body).xpath("//pre[@id='results']").first.inner_html.lstrip
|
128
|
+
end
|
129
|
+
|
130
|
+
it "can repost by accepting confirm" do
|
131
|
+
@session = TestSessions::SeleniumMarionette
|
132
|
+
@session.visit('/form')
|
133
|
+
@session.select('Sweden', from: 'form_region')
|
134
|
+
@session.click_button('awesome')
|
135
|
+
expect do
|
136
|
+
@session.accept_confirm(wait: 0.1) do
|
137
|
+
@session.refresh
|
138
|
+
sleep 2
|
139
|
+
end
|
140
|
+
end.to change { extract_results(@session)['post_count'] }.by(1)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
data/spec/server_spec.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'spec_helper'
|
3
4
|
|
4
5
|
RSpec.describe Capybara::Server do
|
5
|
-
|
6
6
|
it "should spool up a rack server" do
|
7
|
-
@app = proc { |
|
7
|
+
@app = proc { |_env| [200, {}, ["Hello Server!"]] }
|
8
8
|
@server = Capybara::Server.new(@app).boot
|
9
9
|
|
10
10
|
@res = Net::HTTP.start(@server.host, @server.port) { |http| http.get('/') }
|
@@ -19,8 +19,9 @@ RSpec.describe Capybara::Server do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should bind to the specified host" do
|
22
|
+
# TODO: travis with jruby in container mode has an issue with this test
|
22
23
|
begin
|
23
|
-
app = proc { |
|
24
|
+
app = proc { |_env| [200, {}, ['Hello Server!']] }
|
24
25
|
|
25
26
|
Capybara.server_host = '127.0.0.1'
|
26
27
|
server = Capybara::Server.new(app).boot
|
@@ -34,12 +35,12 @@ RSpec.describe Capybara::Server do
|
|
34
35
|
ensure
|
35
36
|
Capybara.server_host = nil
|
36
37
|
end
|
37
|
-
end unless ENV['TRAVIS']
|
38
|
+
end unless ENV['TRAVIS'] && (RUBY_ENGINE == 'jruby') or Gem.win_platform?
|
38
39
|
|
39
40
|
it "should use specified port" do
|
40
41
|
Capybara.server_port = 22789
|
41
42
|
|
42
|
-
@app = proc { |
|
43
|
+
@app = proc { |_env| [200, {}, ["Hello Server!"]] }
|
43
44
|
@server = Capybara::Server.new(@app).boot
|
44
45
|
|
45
46
|
@res = Net::HTTP.start(@server.host, 22789) { |http| http.get('/') }
|
@@ -49,7 +50,7 @@ RSpec.describe Capybara::Server do
|
|
49
50
|
end
|
50
51
|
|
51
52
|
it "should use given port" do
|
52
|
-
@app = proc { |
|
53
|
+
@app = proc { |_env| [200, {}, ["Hello Server!"]] }
|
53
54
|
@server = Capybara::Server.new(@app, 22790).boot
|
54
55
|
|
55
56
|
@res = Net::HTTP.start(@server.host, 22790) { |http| http.get('/') }
|
@@ -59,8 +60,8 @@ RSpec.describe Capybara::Server do
|
|
59
60
|
end
|
60
61
|
|
61
62
|
it "should find an available port" do
|
62
|
-
@app1 = proc { |
|
63
|
-
@app2 = proc { |
|
63
|
+
@app1 = proc { |_env| [200, {}, ["Hello Server!"]] }
|
64
|
+
@app2 = proc { |_env| [200, {}, ["Hello Second Server!"]] }
|
64
65
|
|
65
66
|
@server1 = Capybara::Server.new(@app1).boot
|
66
67
|
@server2 = Capybara::Server.new(@app2).boot
|
@@ -83,7 +84,7 @@ RSpec.describe Capybara::Server do
|
|
83
84
|
end
|
84
85
|
|
85
86
|
it "should use the existing server if it already running" do
|
86
|
-
@app = proc { |
|
87
|
+
@app = proc { |_env| [200, {}, ["Hello Server!"]] }
|
87
88
|
|
88
89
|
@server1 = Capybara::Server.new(@app).boot
|
89
90
|
@server2 = Capybara::Server.new(@app).boot
|
@@ -98,27 +99,25 @@ RSpec.describe Capybara::Server do
|
|
98
99
|
end
|
99
100
|
|
100
101
|
it "detects and waits for all reused server sessions pending requests" do
|
101
|
-
done =
|
102
|
+
done = 0
|
102
103
|
|
103
104
|
app = proc do |env|
|
104
105
|
request = Rack::Request.new(env)
|
105
106
|
sleep request.params['wait_time'].to_f
|
106
|
-
done
|
107
|
+
done += 1
|
107
108
|
[200, {}, ["Hello Server!"]]
|
108
109
|
end
|
109
110
|
|
110
111
|
server1 = Capybara::Server.new(app).boot
|
111
112
|
server2 = Capybara::Server.new(app).boot
|
112
113
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
expect {
|
114
|
+
expect do
|
115
|
+
start_request(server1, 1.0)
|
116
|
+
start_request(server2, 3.0)
|
117
117
|
server1.wait_for_pending_requests
|
118
|
-
|
118
|
+
end.to change { done }.from(0).to(2)
|
119
119
|
expect(server2.send(:pending_requests?)).to eq(false)
|
120
120
|
end
|
121
|
-
|
122
121
|
end
|
123
122
|
|
124
123
|
context "When Capybara.reuse_server is false" do
|
@@ -132,7 +131,7 @@ RSpec.describe Capybara::Server do
|
|
132
131
|
end
|
133
132
|
|
134
133
|
it "should not reuse an already running server" do
|
135
|
-
@app = proc { |
|
134
|
+
@app = proc { |_env| [200, {}, ["Hello Server!"]] }
|
136
135
|
|
137
136
|
@server1 = Capybara::Server.new(@app).boot
|
138
137
|
@server2 = Capybara::Server.new(@app).boot
|
@@ -147,48 +146,48 @@ RSpec.describe Capybara::Server do
|
|
147
146
|
end
|
148
147
|
|
149
148
|
it "detects and waits for only one sessions pending requests" do
|
150
|
-
done =
|
149
|
+
done = 0
|
151
150
|
|
152
151
|
app = proc do |env|
|
153
152
|
request = Rack::Request.new(env)
|
154
153
|
sleep request.params['wait_time'].to_f
|
155
|
-
done
|
154
|
+
done += 1
|
156
155
|
[200, {}, ["Hello Server!"]]
|
157
156
|
end
|
158
157
|
|
159
158
|
server1 = Capybara::Server.new(app).boot
|
160
159
|
server2 = Capybara::Server.new(app).boot
|
161
160
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
expect {
|
161
|
+
expect do
|
162
|
+
start_request(server1, 1.0)
|
163
|
+
start_request(server2, 3.0)
|
166
164
|
server1.wait_for_pending_requests
|
167
|
-
|
165
|
+
end.to change { done }.from(0).to(1)
|
168
166
|
expect(server2.send(:pending_requests?)).to eq(true)
|
167
|
+
expect do
|
168
|
+
server2.wait_for_pending_requests
|
169
|
+
end.to change { done }.from(1).to(2)
|
169
170
|
end
|
170
|
-
|
171
171
|
end
|
172
172
|
|
173
173
|
it "should raise server errors when the server errors before the timeout" do
|
174
174
|
begin
|
175
|
-
Capybara.
|
175
|
+
Capybara.register_server :kaboom do
|
176
176
|
sleep 0.1
|
177
177
|
raise 'kaboom'
|
178
178
|
end
|
179
|
+
Capybara.server = :kaboom
|
179
180
|
|
180
181
|
expect do
|
181
|
-
Capybara::Server.new(proc {|e|}).boot
|
182
|
+
Capybara::Server.new(proc { |e| }).boot
|
182
183
|
end.to raise_error(RuntimeError, 'kaboom')
|
183
184
|
ensure
|
184
|
-
|
185
|
-
# a one-time call in capybara.rb
|
186
|
-
Capybara.server {|app, port| Capybara.run_default_server(app, port)}
|
185
|
+
Capybara.server = :default
|
187
186
|
end
|
188
187
|
end
|
189
188
|
|
190
189
|
it "is not #responsive? when Net::HTTP raises a SystemCallError" do
|
191
|
-
app =
|
190
|
+
app = -> { [200, {}, ['Hello, world']] }
|
192
191
|
server = Capybara::Server.new(app)
|
193
192
|
expect(Net::HTTP).to receive(:start).and_raise(SystemCallError.allocate)
|
194
193
|
expect(server.responsive?).to eq false
|
@@ -197,7 +196,8 @@ RSpec.describe Capybara::Server do
|
|
197
196
|
def start_request(server, wait_time)
|
198
197
|
# Start request, but don't wait for it to finish
|
199
198
|
socket = TCPSocket.new(server.host, server.port)
|
200
|
-
socket.write "GET /?wait_time=#{wait_time
|
199
|
+
socket.write "GET /?wait_time=#{wait_time} HTTP/1.0\r\n\r\n"
|
200
|
+
sleep 0.1
|
201
201
|
socket.close
|
202
202
|
sleep 0.1
|
203
203
|
end
|
data/spec/session_spec.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'spec_helper'
|
3
4
|
|
4
5
|
RSpec.describe Capybara::Session do
|
5
6
|
it "verifies a passed app is a rack app" do
|
6
7
|
expect do
|
7
|
-
Capybara::Session.new(:unknown,
|
8
|
+
Capybara::Session.new(:unknown, random: "hash")
|
8
9
|
end.to raise_error TypeError, "The second parameter to Session::new should be a rack app if passed."
|
9
10
|
end
|
10
11
|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'spec_helper'
|
3
4
|
require "selenium-webdriver"
|
4
5
|
|
5
6
|
RSpec.shared_examples "Capybara::Session" do |session, mode|
|
6
|
-
let(:session) {session}
|
7
|
+
let(:session) { session }
|
7
8
|
|
8
9
|
context 'with selenium driver' do
|
9
10
|
before do
|
@@ -35,7 +36,6 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
35
36
|
@current_dir = Dir.getwd
|
36
37
|
Dir.chdir(File.join(File.dirname(__FILE__), '..'))
|
37
38
|
@env = { 'SELENIUM_BROWSER' => @session.driver.options[:browser].to_s }
|
38
|
-
@env['LEGACY_FIREFOX'] = 'TRUE' if mode == :selenium_firefox
|
39
39
|
end
|
40
40
|
|
41
41
|
after do
|
@@ -45,22 +45,22 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
45
45
|
it "should have return code 1 when running selenium_driver_rspec_failure.rb" do
|
46
46
|
skip if ENV['HEADLESS']
|
47
47
|
system(@env, 'rspec spec/fixtures/selenium_driver_rspec_failure.rb', out: File::NULL, err: File::NULL)
|
48
|
-
expect(
|
48
|
+
expect($CHILD_STATUS.exitstatus).to eq(1)
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should have return code 0 when running selenium_driver_rspec_success.rb" do
|
52
52
|
skip if ENV['HEADLESS']
|
53
53
|
system(@env, 'rspec spec/fixtures/selenium_driver_rspec_success.rb', out: File::NULL, err: File::NULL)
|
54
|
-
expect(
|
54
|
+
expect($CHILD_STATUS.exitstatus).to eq(0)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
describe "#accept_alert" do
|
58
|
+
describe "#accept_alert", requires: [:modals] do
|
59
59
|
it "supports a blockless mode" do
|
60
60
|
@session.visit('/with_js')
|
61
61
|
@session.click_link('Open alert')
|
62
62
|
@session.accept_alert
|
63
|
-
expect{@session.driver.browser.switch_to.alert}.to raise_error(@session.driver.send(:modal_error))
|
63
|
+
expect { @session.driver.browser.switch_to.alert }.to raise_error(@session.driver.send(:modal_error))
|
64
64
|
end
|
65
65
|
|
66
66
|
it "can be called before visiting" do
|
@@ -84,15 +84,17 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
84
84
|
context "#fill_in with { :clear => :backspace } fill_option", requires: [:js] do
|
85
85
|
it 'should fill in a field, replacing an existing value' do
|
86
86
|
@session.visit('/form')
|
87
|
-
@session.fill_in('form_first_name',
|
88
|
-
|
87
|
+
@session.fill_in('form_first_name',
|
88
|
+
with: 'Harry',
|
89
|
+
fill_options: { clear: :backspace })
|
89
90
|
expect(@session.find(:fillable_field, 'form_first_name').value).to eq('Harry')
|
90
91
|
end
|
91
92
|
|
92
93
|
it 'should only trigger onchange once' do
|
93
94
|
@session.visit('/with_js')
|
94
|
-
@session.fill_in('with_change_event',
|
95
|
-
|
95
|
+
@session.fill_in('with_change_event',
|
96
|
+
with: 'some value',
|
97
|
+
fill_options: { clear: :backspace })
|
96
98
|
# click outside the field to trigger the change event
|
97
99
|
@session.find(:css, 'body').click
|
98
100
|
expect(@session.find(:css, '.change_event_triggered', match: :one)).to have_text 'some value'
|
@@ -100,8 +102,9 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
100
102
|
|
101
103
|
it 'should trigger change when clearing field' do
|
102
104
|
@session.visit('/with_js')
|
103
|
-
@session.fill_in('with_change_event',
|
104
|
-
|
105
|
+
@session.fill_in('with_change_event',
|
106
|
+
with: '',
|
107
|
+
fill_options: { clear: :backspace })
|
105
108
|
# click outside the field to trigger the change event
|
106
109
|
@session.find(:css, 'body').click
|
107
110
|
expect(@session).to have_selector(:css, '.change_event_triggered', match: :one)
|
@@ -109,8 +112,9 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
109
112
|
|
110
113
|
it 'should trigger input event field_value.length times' do
|
111
114
|
@session.visit('/with_js')
|
112
|
-
@session.fill_in('with_change_event',
|
113
|
-
|
115
|
+
@session.fill_in('with_change_event',
|
116
|
+
with: '',
|
117
|
+
fill_options: { clear: :backspace })
|
114
118
|
# click outside the field to trigger the change event
|
115
119
|
@session.find(:css, 'body').click
|
116
120
|
expect(@session).to have_xpath('//p[@class="input_event_triggered"]', count: 13)
|
@@ -120,8 +124,9 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
120
124
|
context "#fill_in with { clear: :none } fill_options" do
|
121
125
|
it 'should append to content in a field' do
|
122
126
|
@session.visit('/form')
|
123
|
-
@session.fill_in('form_first_name',
|
124
|
-
|
127
|
+
@session.fill_in('form_first_name',
|
128
|
+
with: 'Harry',
|
129
|
+
fill_options: { clear: :none })
|
125
130
|
expect(@session.find(:fillable_field, 'form_first_name').value).to eq('JohnHarry')
|
126
131
|
end
|
127
132
|
end
|
@@ -129,10 +134,11 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
129
134
|
context "#fill_in with { clear: Array } fill_options" do
|
130
135
|
it 'should pass the array through to the element' do
|
131
136
|
pending "selenium-webdriver/geckodriver doesn't support complex sets of characters" if marionette?(@session)
|
132
|
-
#this is mainly for use with [[:control, 'a'], :backspace] - however since that is platform dependant I'm testing with something less useful
|
137
|
+
# this is mainly for use with [[:control, 'a'], :backspace] - however since that is platform dependant I'm testing with something less useful
|
133
138
|
@session.visit('/form')
|
134
|
-
@session.fill_in('form_first_name',
|
135
|
-
|
139
|
+
@session.fill_in('form_first_name',
|
140
|
+
with: 'Harry',
|
141
|
+
fill_options: { clear: [[:shift, 'abc'], :backspace] })
|
136
142
|
expect(@session.find(:fillable_field, 'form_first_name').value).to eq('JohnABHarry')
|
137
143
|
end
|
138
144
|
end
|
@@ -149,7 +155,7 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
149
155
|
describe "all with disappearing elements" do
|
150
156
|
it "ignores stale elements in results" do
|
151
157
|
@session.visit('/path')
|
152
|
-
elements = @session.all(:link) { |
|
158
|
+
elements = @session.all(:link) { |_node| raise Selenium::WebDriver::Error::StaleElementReferenceError }
|
153
159
|
expect(elements.size).to eq 0
|
154
160
|
end
|
155
161
|
end
|
@@ -173,12 +179,12 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
173
179
|
it "can return hashes with elements" do
|
174
180
|
@session.visit('/form')
|
175
181
|
result = @session.evaluate_script("{ a: document.getElementById('form_title'), b: {c: document.querySelectorAll('#form_city option')}}")
|
176
|
-
expect(result).to eq(
|
182
|
+
expect(result).to eq(
|
177
183
|
'a' => @session.find(:id, 'form_title'),
|
178
184
|
'b' => {
|
179
185
|
'c' => @session.find(:css, '#form_city').all(:css, 'option').to_a
|
180
186
|
}
|
181
|
-
|
187
|
+
)
|
182
188
|
end
|
183
189
|
|
184
190
|
describe "#evaluate_async_script" do
|
@@ -211,5 +217,13 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
211
217
|
expect(@session).to have_current_path('/')
|
212
218
|
end
|
213
219
|
end
|
220
|
+
|
221
|
+
context "Windows" do
|
222
|
+
it "can't close the primary window" do
|
223
|
+
expect do
|
224
|
+
@session.current_window.close
|
225
|
+
end.to raise_error(ArgumentError, 'Not allowed to close the primary window')
|
226
|
+
end
|
227
|
+
end
|
214
228
|
end
|
215
229
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,14 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'rspec/expectations'
|
3
4
|
require "capybara/spec/spec_helper"
|
4
|
-
require
|
5
|
+
require 'webdrivers' if ENV['CI']
|
5
6
|
|
6
7
|
RSpec.configure do |config|
|
7
8
|
Capybara::SpecHelper.configure(config)
|
8
|
-
config.filter_run_including focus_: true unless ENV['
|
9
|
+
config.filter_run_including focus_: true unless ENV['CI']
|
9
10
|
config.run_all_when_everything_filtered = true
|
10
11
|
end
|
11
|
-
|
12
|
-
def rspec2?
|
13
|
-
!defined?(::RSpec::Expectations::Version) || (Gem::Version.new(RSpec::Expectations::Version::STRING) < Gem::Version.new('3.0'))
|
14
|
-
end
|