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.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +55 -1
  3. data/README.md +18 -17
  4. data/lib/capybara/config.rb +11 -58
  5. data/lib/capybara/cucumber.rb +2 -3
  6. data/lib/capybara/driver/base.rb +15 -16
  7. data/lib/capybara/driver/node.rb +5 -4
  8. data/lib/capybara/dsl.rb +1 -0
  9. data/lib/capybara/helpers.rb +19 -29
  10. data/lib/capybara/minitest/spec.rb +15 -14
  11. data/lib/capybara/minitest.rb +139 -138
  12. data/lib/capybara/node/actions.rb +60 -81
  13. data/lib/capybara/node/base.rb +11 -18
  14. data/lib/capybara/node/document.rb +2 -2
  15. data/lib/capybara/node/document_matchers.rb +8 -8
  16. data/lib/capybara/node/element.rb +30 -40
  17. data/lib/capybara/node/finders.rb +62 -70
  18. data/lib/capybara/node/matchers.rb +50 -71
  19. data/lib/capybara/node/simple.rb +11 -17
  20. data/lib/capybara/queries/ancestor_query.rb +11 -7
  21. data/lib/capybara/queries/base_query.rb +22 -18
  22. data/lib/capybara/queries/current_path_query.rb +8 -24
  23. data/lib/capybara/queries/match_query.rb +3 -7
  24. data/lib/capybara/queries/selector_query.rb +92 -95
  25. data/lib/capybara/queries/sibling_query.rb +4 -4
  26. data/lib/capybara/queries/text_query.rb +35 -35
  27. data/lib/capybara/queries/title_query.rb +8 -11
  28. data/lib/capybara/rack_test/browser.rb +15 -18
  29. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  30. data/lib/capybara/rack_test/driver.rb +6 -10
  31. data/lib/capybara/rack_test/form.rb +50 -40
  32. data/lib/capybara/rack_test/node.rb +93 -63
  33. data/lib/capybara/rails.rb +2 -6
  34. data/lib/capybara/result.rb +22 -22
  35. data/lib/capybara/rspec/compound.rb +5 -10
  36. data/lib/capybara/rspec/features.rb +17 -48
  37. data/lib/capybara/rspec/matcher_proxies.rb +31 -15
  38. data/lib/capybara/rspec/matchers.rb +70 -61
  39. data/lib/capybara/rspec.rb +5 -10
  40. data/lib/capybara/selector/css.rb +6 -11
  41. data/lib/capybara/selector/filter.rb +1 -17
  42. data/lib/capybara/selector/filter_set.rb +18 -15
  43. data/lib/capybara/selector/filters/base.rb +7 -6
  44. data/lib/capybara/selector/filters/expression_filter.rb +6 -23
  45. data/lib/capybara/selector/filters/node_filter.rb +2 -12
  46. data/lib/capybara/selector/selector.rb +28 -34
  47. data/lib/capybara/selector.rb +129 -117
  48. data/lib/capybara/selenium/driver.rb +131 -125
  49. data/lib/capybara/selenium/node.rb +197 -115
  50. data/lib/capybara/server.rb +3 -2
  51. data/lib/capybara/session/config.rb +47 -67
  52. data/lib/capybara/session/matchers.rb +8 -7
  53. data/lib/capybara/session.rb +138 -224
  54. data/lib/capybara/spec/public/test.js +25 -4
  55. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -0
  56. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -2
  57. data/lib/capybara/spec/session/accept_prompt_spec.rb +1 -0
  58. data/lib/capybara/spec/session/all_spec.rb +31 -18
  59. data/lib/capybara/spec/session/ancestor_spec.rb +6 -8
  60. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +6 -5
  61. data/lib/capybara/spec/session/assert_current_path.rb +12 -11
  62. data/lib/capybara/spec/session/assert_selector.rb +1 -0
  63. data/lib/capybara/spec/session/assert_text.rb +23 -23
  64. data/lib/capybara/spec/session/assert_title.rb +13 -3
  65. data/lib/capybara/spec/session/attach_file_spec.rb +51 -30
  66. data/lib/capybara/spec/session/body_spec.rb +1 -0
  67. data/lib/capybara/spec/session/check_spec.rb +7 -6
  68. data/lib/capybara/spec/session/choose_spec.rb +5 -4
  69. data/lib/capybara/spec/session/click_button_spec.rb +24 -32
  70. data/lib/capybara/spec/session/click_link_or_button_spec.rb +8 -7
  71. data/lib/capybara/spec/session/click_link_spec.rb +8 -7
  72. data/lib/capybara/spec/session/current_scope_spec.rb +4 -3
  73. data/lib/capybara/spec/session/current_url_spec.rb +17 -6
  74. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
  75. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -0
  76. data/lib/capybara/spec/session/element/assert_match_selector.rb +1 -1
  77. data/lib/capybara/spec/session/element/match_xpath_spec.rb +1 -1
  78. data/lib/capybara/spec/session/element/matches_selector_spec.rb +5 -5
  79. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +3 -2
  80. data/lib/capybara/spec/session/evaluate_script_spec.rb +4 -3
  81. data/lib/capybara/spec/session/execute_script_spec.rb +4 -3
  82. data/lib/capybara/spec/session/fill_in_spec.rb +30 -5
  83. data/lib/capybara/spec/session/find_button_spec.rb +4 -3
  84. data/lib/capybara/spec/session/find_by_id_spec.rb +2 -1
  85. data/lib/capybara/spec/session/find_field_spec.rb +9 -15
  86. data/lib/capybara/spec/session/find_link_spec.rb +6 -5
  87. data/lib/capybara/spec/session/find_spec.rb +37 -31
  88. data/lib/capybara/spec/session/first_spec.rb +60 -33
  89. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  90. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  91. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +2 -1
  92. data/lib/capybara/spec/session/frame/within_frame_spec.rb +9 -16
  93. data/lib/capybara/spec/session/go_back_spec.rb +1 -0
  94. data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
  95. data/lib/capybara/spec/session/has_all_selectors_spec.rb +15 -15
  96. data/lib/capybara/spec/session/has_button_spec.rb +2 -1
  97. data/lib/capybara/spec/session/has_css_spec.rb +3 -2
  98. data/lib/capybara/spec/session/has_current_path_spec.rb +12 -28
  99. data/lib/capybara/spec/session/has_field_spec.rb +4 -3
  100. data/lib/capybara/spec/session/has_link_spec.rb +1 -0
  101. data/lib/capybara/spec/session/has_none_selectors_spec.rb +17 -17
  102. data/lib/capybara/spec/session/has_select_spec.rb +30 -29
  103. data/lib/capybara/spec/session/has_selector_spec.rb +5 -4
  104. data/lib/capybara/spec/session/has_table_spec.rb +2 -1
  105. data/lib/capybara/spec/session/has_text_spec.rb +9 -13
  106. data/lib/capybara/spec/session/has_title_spec.rb +1 -0
  107. data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
  108. data/lib/capybara/spec/session/headers.rb +2 -1
  109. data/lib/capybara/spec/session/html_spec.rb +1 -0
  110. data/lib/capybara/spec/session/node_spec.rb +91 -56
  111. data/lib/capybara/spec/session/node_wrapper_spec.rb +36 -0
  112. data/lib/capybara/spec/session/refresh_spec.rb +6 -2
  113. data/lib/capybara/spec/session/reset_session_spec.rb +19 -0
  114. data/lib/capybara/spec/session/response_code.rb +1 -0
  115. data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
  116. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -11
  117. data/lib/capybara/spec/session/save_page_spec.rb +1 -17
  118. data/lib/capybara/spec/session/save_screenshot_spec.rb +3 -3
  119. data/lib/capybara/spec/session/select_spec.rb +20 -20
  120. data/lib/capybara/spec/session/selectors_spec.rb +2 -2
  121. data/lib/capybara/spec/session/sibling_spec.rb +1 -1
  122. data/lib/capybara/spec/session/text_spec.rb +17 -3
  123. data/lib/capybara/spec/session/title_spec.rb +11 -1
  124. data/lib/capybara/spec/session/uncheck_spec.rb +4 -3
  125. data/lib/capybara/spec/session/unselect_spec.rb +6 -5
  126. data/lib/capybara/spec/session/visit_spec.rb +9 -3
  127. data/lib/capybara/spec/session/window/become_closed_spec.rb +2 -1
  128. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
  129. data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
  130. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +2 -1
  131. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
  132. data/lib/capybara/spec/session/window/window_spec.rb +12 -12
  133. data/lib/capybara/spec/session/window/windows_spec.rb +2 -3
  134. data/lib/capybara/spec/session/window/within_window_spec.rb +15 -71
  135. data/lib/capybara/spec/session/within_spec.rb +1 -0
  136. data/lib/capybara/spec/spec_helper.rb +34 -18
  137. data/lib/capybara/spec/test_app.rb +17 -9
  138. data/lib/capybara/spec/views/form.erb +7 -0
  139. data/lib/capybara/spec/views/with_html.erb +23 -1
  140. data/lib/capybara/spec/views/within_frames.erb +4 -1
  141. data/lib/capybara/version.rb +2 -1
  142. data/lib/capybara/window.rb +6 -10
  143. data/lib/capybara.rb +28 -25
  144. data/spec/basic_node_spec.rb +1 -0
  145. data/spec/capybara_spec.rb +11 -50
  146. data/spec/dsl_spec.rb +5 -13
  147. data/spec/filter_set_spec.rb +5 -4
  148. data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -1
  149. data/spec/fixtures/selenium_driver_rspec_success.rb +3 -2
  150. data/spec/minitest_spec.rb +4 -3
  151. data/spec/minitest_spec_spec.rb +3 -2
  152. data/spec/per_session_config_spec.rb +9 -8
  153. data/spec/rack_test_spec.rb +21 -20
  154. data/spec/result_spec.rb +17 -16
  155. data/spec/rspec/features_spec.rb +17 -14
  156. data/spec/rspec/scenarios_spec.rb +5 -7
  157. data/spec/rspec/shared_spec_matchers.rb +96 -99
  158. data/spec/rspec/views_spec.rb +2 -1
  159. data/spec/rspec_matchers_spec.rb +18 -2
  160. data/spec/rspec_spec.rb +11 -15
  161. data/spec/selector_spec.rb +5 -6
  162. data/spec/selenium_spec_chrome.rb +9 -4
  163. data/spec/selenium_spec_edge.rb +27 -0
  164. data/spec/selenium_spec_ie.rb +31 -0
  165. data/spec/selenium_spec_marionette.rb +28 -12
  166. data/spec/server_spec.rb +33 -33
  167. data/spec/session_spec.rb +2 -1
  168. data/spec/shared_selenium_session.rb +36 -22
  169. data/spec/spec_helper.rb +3 -6
  170. metadata +68 -85
  171. data/lib/capybara/query.rb +0 -7
  172. 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 { |env| [200, {}, ["Hello Server!"]]}
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 { |env| [200, {}, ['Hello Server!']] }
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'] and (RUBY_ENGINE == 'jruby') #TODO travis with jruby in container mode has an issue with this test
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 { |env| [200, {}, ["Hello Server!"]]}
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 { |env| [200, {}, ["Hello Server!"]]}
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 { |env| [200, {}, ["Hello Server!"]]}
63
- @app2 = proc { |env| [200, {}, ["Hello Second Server!"]]}
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 { |env| [200, {}, ["Hello Server!"]]}
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 = false
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 = true
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
- start_request(server1, 0.5)
114
- start_request(server2, 1.0)
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
- }.to change{done}.from(false).to(true)
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 { |env| [200, {}, ["Hello Server!"]]}
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 = false
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 = true
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
- start_request(server1, 0.5)
163
- start_request(server2, 1.0)
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
- }.to change{done}.from(false).to(true)
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.server do
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
- # TODO refactor out the defaults so it's reliant on unset state instead of
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 = lambda { [200, {}, ['Hello, world']] }
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.to_s} HTTP/1.0\r\n\r\n"
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, { random: "hash"})
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($?.exitstatus).to eq(1)
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($?.exitstatus).to eq(0)
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', with: 'Harry',
88
- fill_options: { clear: :backspace} )
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', with: 'some value',
95
- fill_options: { :clear => :backspace })
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', with: '',
104
- fill_options: { :clear => :backspace })
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', with: '',
113
- fill_options: { :clear => :backspace })
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', with: 'Harry',
124
- fill_options: { clear: :none} )
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', with: 'Harry',
135
- fill_options: { clear: [[:shift, 'abc'], :backspace] } )
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) { |node| raise Selenium::WebDriver::Error::StaleElementReferenceError }
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 "pry"
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['TRAVIS']
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