capybara 2.18.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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