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
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'capybara/dsl'
4
5
  require 'capybara/rspec/matchers'
5
6
  require 'benchmark'
6
7
 
7
- RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
8
-
8
+ RSpec.shared_examples Capybara::RSpecMatchers do |session, _mode|
9
9
  include Capybara::DSL
10
10
  include Capybara::RSpecMatchers
11
11
 
@@ -53,7 +53,6 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
53
53
  expect("<h1>Text</h1>").to have_css('h1', between: 2..3)
54
54
  end.to raise_error("expected to find visible css \"h1\" between 2 and 3 times, found 1 match: \"Text\"")
55
55
  end
56
-
57
56
  end
58
57
 
59
58
  context "with should_not" do
@@ -81,7 +80,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
81
80
  it "supports compounding" do
82
81
  expect("<h1>Text</h1><h2>Text</h2>").to have_css('h1').and have_css('h2')
83
82
  expect("<h1>Text</h1><h2>Text</h2>").to have_css('h3').or have_css('h1')
84
- end if RSpec::Version::STRING.to_f >= 3.0
83
+ end
85
84
  end
86
85
 
87
86
  context "on a page or node" do
@@ -129,7 +128,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
129
128
  it "fails if has_xpath? returns false" do
130
129
  expect do
131
130
  expect("<h1>Text</h1>").to have_xpath('//h2')
132
- end.to raise_error(%r(expected to find visible xpath "//h2" but there were no matches))
131
+ end.to raise_error(%r{expected to find visible xpath "//h2" but there were no matches})
133
132
  end
134
133
  end
135
134
 
@@ -141,14 +140,14 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
141
140
  it "fails if has_no_xpath? returns false" do
142
141
  expect do
143
142
  expect("<h1>Text</h1>").not_to have_xpath('//h1')
144
- end.to raise_error(%r(expected not to find visible xpath "//h1"))
143
+ end.to raise_error(%r{expected not to find visible xpath "//h1"})
145
144
  end
146
145
  end
147
146
 
148
147
  it "supports compounding" do
149
148
  expect("<h1>Text</h1><h2>Text</h2>").to have_xpath('//h1').and have_xpath('//h2')
150
149
  expect("<h1>Text</h1><h2>Text</h2>").to have_xpath('//h3').or have_xpath('//h1')
151
- end if RSpec::Version::STRING.to_f >= 3.0
150
+ end
152
151
  end
153
152
 
154
153
  context "on a page or node" do
@@ -164,7 +163,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
164
163
  it "fails if has_xpath? returns false" do
165
164
  expect do
166
165
  expect(page).to have_xpath("//h1[@id='doesnotexist']")
167
- end.to raise_error(%r(expected to find visible xpath "//h1\[@id='doesnotexist'\]" but there were no matches))
166
+ end.to raise_error(%r{expected to find visible xpath "//h1\[@id='doesnotexist'\]" but there were no matches})
168
167
  end
169
168
  end
170
169
 
@@ -176,7 +175,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
176
175
  it "fails if has_no_xpath? returns false" do
177
176
  expect do
178
177
  expect(page).not_to have_xpath('//h1')
179
- end.to raise_error(%r(expected not to find visible xpath "//h1"))
178
+ end.to raise_error(%r{expected not to find visible xpath "//h1"})
180
179
  end
181
180
  end
182
181
  end
@@ -198,7 +197,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
198
197
  it "fails if has_selector? returns false" do
199
198
  expect do
200
199
  expect("<h1>Text</h1>").to have_selector('//h2')
201
- end.to raise_error(%r(expected to find visible xpath "//h2" but there were no matches))
200
+ end.to raise_error(%r{expected to find visible xpath "//h2" but there were no matches})
202
201
  end
203
202
  end
204
203
 
@@ -210,7 +209,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
210
209
  it "fails if has_no_selector? returns false" do
211
210
  expect do
212
211
  expect("<h1>Text</h1>").not_to have_selector(:css, 'h1')
213
- end.to raise_error(%r(expected not to find visible css "h1"))
212
+ end.to raise_error(%r{expected not to find visible css "h1"})
214
213
  end
215
214
  end
216
215
  end
@@ -228,13 +227,13 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
228
227
  it "fails if has_selector? returns false" do
229
228
  expect do
230
229
  expect(page).to have_selector("//h1[@id='doesnotexist']")
231
- end.to raise_error(%r(expected to find visible xpath "//h1\[@id='doesnotexist'\]" but there were no matches))
230
+ end.to raise_error(%r{expected to find visible xpath "//h1\[@id='doesnotexist'\]" but there were no matches})
232
231
  end
233
232
 
234
233
  it "includes text in error message" do
235
234
  expect do
236
235
  expect(page).to have_selector("//h1", text: 'wrong text')
237
- end.to raise_error(%r(expected to find visible xpath "//h1" with text "wrong text" but there were no matches))
236
+ end.to raise_error(%r{expected to find visible xpath "//h1" with text "wrong text" but there were no matches})
238
237
  end
239
238
  end
240
239
 
@@ -246,7 +245,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
246
245
  it "fails if has_no_selector? returns false" do
247
246
  expect do
248
247
  expect(page).not_to have_selector(:css, 'h1', text: 'test')
249
- end.to raise_error(%r(expected not to find visible css "h1" with text "test"))
248
+ end.to raise_error(%r{expected not to find visible css "h1" with text "test"})
250
249
  end
251
250
  end
252
251
  end
@@ -254,7 +253,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
254
253
  it "supports compounding" do
255
254
  expect("<h1>Text</h1><h2>Text</h2>").to have_selector('//h1').and have_selector('//h2')
256
255
  expect("<h1>Text</h1><h2>Text</h2>").to have_selector('//h3').or have_selector('//h1')
257
- end if RSpec::Version::STRING.to_f >= 3.0
256
+ end
258
257
  end
259
258
 
260
259
  describe "have_content matcher" do
@@ -343,7 +342,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
343
342
  it "supports compounding" do
344
343
  expect("<h1>Text</h1><h2>And</h2>").to have_content('Text').and have_content('And')
345
344
  expect("<h1>Text</h1><h2>Or</h2>").to have_content('XYZ').or have_content('Or')
346
- end if RSpec::Version::STRING.to_f >= 3.0
345
+ end
347
346
  end
348
347
 
349
348
  describe "have_text matcher" do
@@ -477,7 +476,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
477
476
  it "supports compounding" do
478
477
  expect("<h1>Text</h1><h2>And</h2>").to have_text('Text').and have_text('And')
479
478
  expect("<h1>Text</h1><h2>Or</h2>").to have_text('Not here').or have_text('Or')
480
- end if RSpec::Version::STRING.to_f >= 3.0
479
+ end
481
480
  end
482
481
 
483
482
  describe "have_link matcher" do
@@ -500,7 +499,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
500
499
  it "supports compounding" do
501
500
  expect(html).to have_link('Just a link').and have_link('Another link')
502
501
  expect(html).to have_link('Not a link').or have_link('Another link')
503
- end if RSpec::Version::STRING.to_f >= 3.0
502
+ end
504
503
  end
505
504
 
506
505
  describe "have_title matcher" do
@@ -565,7 +564,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
565
564
 
566
565
  it "supports compounding" do
567
566
  expect("<title>I compound</title>").to have_title('I dont compound').or have_title('I compound')
568
- end if RSpec::Version::STRING.to_f >= 3.0
567
+ end
569
568
  end
570
569
 
571
570
  describe "have_current_path matcher" do
@@ -611,7 +610,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
611
610
  it "supports compounding" do
612
611
  visit('/with_html')
613
612
  expect(page).to have_current_path('/not_with_html').or have_current_path('/with_html')
614
- end if RSpec::Version::STRING.to_f >= 3.0
613
+ end
615
614
  end
616
615
 
617
616
  describe "have_button matcher" do
@@ -633,7 +632,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
633
632
 
634
633
  it "supports compounding" do
635
634
  expect(html).to have_button('Not this button').or have_button('A button')
636
- end if RSpec::Version::STRING.to_f >= 3.0
635
+ end
637
636
  end
638
637
 
639
638
  describe "have_field matcher" do
@@ -678,7 +677,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
678
677
 
679
678
  it "supports compounding" do
680
679
  expect(html).to have_field('Not this one').or have_field('Text field')
681
- end if RSpec::Version::STRING.to_f >= 3.0
680
+ end
682
681
  end
683
682
 
684
683
  describe "have_checked_field matcher" do
@@ -727,7 +726,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
727
726
 
728
727
  it "supports compounding" do
729
728
  expect(html).to have_checked_field('not this one').or have_checked_field('it is checked')
730
- end if RSpec::Version::STRING.to_f >= 3.0
729
+ end
731
730
  end
732
731
 
733
732
  describe "have_unchecked_field matcher" do
@@ -776,7 +775,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
776
775
 
777
776
  it "supports compounding" do
778
777
  expect(html).to have_unchecked_field('it is checked').or have_unchecked_field('unchecked field')
779
- end if RSpec::Version::STRING.to_f >= 3.0
778
+ end
780
779
  end
781
780
 
782
781
  describe "have_select matcher" do
@@ -802,7 +801,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
802
801
 
803
802
  it "supports compounding" do
804
803
  expect(html).to have_select('Not this one').or have_select('Select Box')
805
- end if RSpec::Version::STRING.to_f >= 3.0
804
+ end
806
805
  end
807
806
 
808
807
  describe "have_table matcher" do
@@ -831,100 +830,98 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
831
830
 
832
831
  it "supports compounding" do
833
832
  expect(html).to have_table('nope').or have_table('Lovely table')
834
- end if RSpec::Version::STRING.to_f >= 3.0
833
+ end
835
834
  end
836
835
 
837
- if RSpec::Version::STRING.to_f >= 3.0
838
- context "compounding", requires: [:js] do
839
- before(:each) do
840
- @session = session
841
- @session.visit('/with_js')
842
- @el = @session.find(:css, '#reload-me')
843
- end
844
-
845
- context "#and" do
846
- it "should run 'concurrently'" do
847
- Capybara.using_wait_time(2) do
848
- matcher = have_text('this is not there').and have_text('neither is this')
849
- expect(Benchmark.realtime do
850
- expect {
851
- expect(@el).to matcher
852
- }.to raise_error RSpec::Expectations::ExpectationNotMetError
853
- end).to be_between(2,3)
854
- end
855
- end
836
+ context "compounding", requires: [:js] do
837
+ before(:each) do
838
+ @session = session
839
+ @session.visit('/with_js')
840
+ @el = @session.find(:css, '#reload-me')
841
+ end
856
842
 
857
- it "should run 'concurrently' and retry" do
858
- @session.click_link('reload-link')
859
- @session.using_wait_time(2) do
860
- expect(Benchmark.realtime do
861
- expect {
862
- expect(@el).to have_text('waiting to be reloaded').and(have_text('has been reloaded'))
863
- }.to raise_error RSpec::Expectations::ExpectationNotMetError, /expected to find text "waiting to be reloaded" in "has been reloaded"/
864
- end).to be_between(2,3)
865
- end
843
+ context "#and" do
844
+ it "should run 'concurrently'" do
845
+ Capybara.using_wait_time(2) do
846
+ matcher = have_text('this is not there').and have_text('neither is this')
847
+ expect(Benchmark.realtime do
848
+ expect do
849
+ expect(@el).to matcher
850
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
851
+ end).to be_between(2, 3)
866
852
  end
853
+ end
867
854
 
868
- it "should ignore :wait options" do
869
- @session.using_wait_time(2) do
870
- matcher = have_text('this is not there', wait: 5).and have_text('neither is this', wait: 6)
871
- expect(Benchmark.realtime do
872
- expect {
873
- expect(@el).to matcher
874
- }.to raise_error RSpec::Expectations::ExpectationNotMetError
875
- end).to be_between(2,3)
876
- end
855
+ it "should run 'concurrently' and retry" do
856
+ @session.click_link('reload-link')
857
+ @session.using_wait_time(2) do
858
+ expect(Benchmark.realtime do
859
+ expect do
860
+ expect(@el).to have_text('waiting to be reloaded').and(have_text('has been reloaded'))
861
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError, /expected to find text "waiting to be reloaded" in "has been reloaded"/
862
+ end).to be_between(2, 3)
877
863
  end
864
+ end
878
865
 
879
- it "should work on the session" do
880
- @session.using_wait_time(2) do
881
- @session.click_link('reload-link')
882
- expect(@session).to have_selector(:css, 'h1', text: 'FooBar').and have_text('has been reloaded')
883
- end
866
+ it "should ignore :wait options" do
867
+ @session.using_wait_time(2) do
868
+ matcher = have_text('this is not there', wait: 5).and have_text('neither is this', wait: 6)
869
+ expect(Benchmark.realtime do
870
+ expect do
871
+ expect(@el).to matcher
872
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
873
+ end).to be_between(2, 3)
884
874
  end
885
875
  end
886
876
 
887
- context "#and_then" do
888
- it "should run sequentially" do
877
+ it "should work on the session" do
878
+ @session.using_wait_time(2) do
889
879
  @session.click_link('reload-link')
890
- expect(@el).to have_text('waiting to be reloaded').and_then have_text('has been reloaded')
880
+ expect(@session).to have_selector(:css, 'h1', text: 'FooBar').and have_text('has been reloaded')
891
881
  end
892
882
  end
883
+ end
893
884
 
894
- context "#or" do
895
- it "should run 'concurrently'" do
896
- @session.using_wait_time(3) do
897
- expect(Benchmark.realtime do
898
- expect(@el).to have_text('has been reloaded').or have_text('waiting to be reloaded')
899
- end).to be < 1
900
- end
885
+ context "#and_then" do
886
+ it "should run sequentially" do
887
+ @session.click_link('reload-link')
888
+ expect(@el).to have_text('waiting to be reloaded').and_then have_text('has been reloaded')
889
+ end
890
+ end
891
+
892
+ context "#or" do
893
+ it "should run 'concurrently'" do
894
+ @session.using_wait_time(3) do
895
+ expect(Benchmark.realtime do
896
+ expect(@el).to have_text('has been reloaded').or have_text('waiting to be reloaded')
897
+ end).to be < 1
901
898
  end
899
+ end
902
900
 
903
- it "should retry" do
904
- @session.using_wait_time(3) do
905
- expect(Benchmark.realtime do
906
- expect {
907
- expect(@el).to have_text('has been reloaded').or have_text('random stuff')
908
- }.to raise_error RSpec::Expectations::ExpectationNotMetError
909
- end).to be > 3
910
- end
901
+ it "should retry" do
902
+ @session.using_wait_time(3) do
903
+ expect(Benchmark.realtime do
904
+ expect do
905
+ expect(@el).to have_text('has been reloaded').or have_text('random stuff')
906
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
907
+ end).to be > 3
911
908
  end
909
+ end
912
910
 
913
- it "should ignore :wait options" do
914
- @session.using_wait_time(2) do
915
- expect(Benchmark.realtime do
916
- expect {
917
- expect(@el).to have_text('this is not there', wait: 10).or have_text('neither is this', wait: 15)
918
- }.to raise_error RSpec::Expectations::ExpectationNotMetError
919
- end).to be_between(2,3)
920
- end
911
+ it "should ignore :wait options" do
912
+ @session.using_wait_time(2) do
913
+ expect(Benchmark.realtime do
914
+ expect do
915
+ expect(@el).to have_text('this is not there', wait: 10).or have_text('neither is this', wait: 15)
916
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
917
+ end).to be_between(2, 3)
921
918
  end
919
+ end
922
920
 
923
- it "should work on the session" do
924
- @session.using_wait_time(2) do
925
- @session.click_link('reload-link')
926
- expect(@session).to have_selector(:css, 'h1', text: 'Not on the page').or have_text('has been reloaded')
927
- end
921
+ it "should work on the session" do
922
+ @session.using_wait_time(2) do
923
+ @session.click_link('reload-link')
924
+ expect(@session).to have_selector(:css, 'h1', text: 'Not on the page').or have_text('has been reloaded')
928
925
  end
929
926
  end
930
927
  end
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  RSpec.describe "capybara/rspec", type: :view do
5
6
  it "allows matchers to be used on strings" do
6
- expect(%{<h1>Test header</h1>}).to have_css("h1", text: "Test header")
7
+ expect(%(<h1>Test header</h1>)).to have_css("h1", text: "Test header")
7
8
  end
8
9
 
9
10
  it "doesn't include RSpecMatcherProxies" do
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
- RSpec.describe 'Capybara RSpec Matchers', :type => :feature do
5
+ RSpec.describe 'Capybara RSpec Matchers', type: :feature do
5
6
  context "after called on session" do
6
7
  it "HaveSelector should allow getting a description of the matcher" do
7
8
  visit('/with_html')
@@ -16,6 +17,17 @@ RSpec.describe 'Capybara RSpec Matchers', :type => :feature do
16
17
  expect(page).to matcher
17
18
  expect { matcher.description }.not_to raise_error
18
19
  end
20
+
21
+ it "should produce the same error for .to have_no_xxx and .not_to have_xxx" do
22
+ visit('/with_html')
23
+ not_to_msg = error_msg_for { expect(page).not_to have_selector(:css, '#referrer') }
24
+ have_no_msg = error_msg_for { expect(page).to have_no_selector(:css, '#referrer') }
25
+ expect(not_to_msg).to eq have_no_msg
26
+
27
+ not_to_msg = error_msg_for { expect(page).not_to have_text('This is a test') }
28
+ have_no_msg = error_msg_for { expect(page).to have_no_text('This is a test') }
29
+ expect(not_to_msg).to eq have_no_msg
30
+ end
19
31
  end
20
32
 
21
33
  context "after called on element" do
@@ -43,4 +55,8 @@ RSpec.describe 'Capybara RSpec Matchers', :type => :feature do
43
55
  expect { matcher.description }.not_to raise_error
44
56
  end
45
57
  end
46
- end
58
+
59
+ def error_msg_for(&block)
60
+ expect(&block).to(raise_error { |e| return e.message })
61
+ end
62
+ end
data/spec/rspec_spec.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
- RSpec.describe 'capybara/rspec', :type => :feature do
5
+ RSpec.describe 'capybara/rspec', type: :feature do
5
6
  it "should include Capybara in rspec" do
6
7
  visit('/foo')
7
8
  expect(page.body).to include('Another World')
@@ -37,21 +38,20 @@ RSpec.describe 'capybara/rspec', :type => :feature do
37
38
  expect(Capybara.current_driver).to eq(Capybara.javascript_driver)
38
39
  end
39
40
 
40
- it "switches to the given driver when giving it as metadata", :driver => :culerity do
41
+ it "switches to the given driver when giving it as metadata", driver: :culerity do
41
42
  expect(Capybara.current_driver).to eq(:culerity)
42
43
  end
43
44
 
44
45
  context "#all" do
45
46
  it "allows access to the Capybara finder" do
46
47
  visit('/with_html')
47
- expect(all(:css, 'h2.head').size).to eq(5)
48
+ found = all(:css, 'h2') { |element| element[:class] == 'head' }
49
+ expect(found.size).to eq(5)
48
50
  end
49
51
 
50
52
  it "allows access to the RSpec matcher" do
51
- skip "RSpec < 3 doesn't have an `all` matcher" if rspec2?
52
-
53
53
  visit('/with_html')
54
- expect(["test1", "test2"]).to all(be_a(String))
54
+ expect(%w[test1 test2]).to all(be_a(String))
55
55
  end
56
56
  end
57
57
 
@@ -64,7 +64,6 @@ RSpec.describe 'capybara/rspec', :type => :feature do
64
64
  end
65
65
 
66
66
  it "allows access to the RSpec matcher" do
67
- skip "RSpec version doesn't have a 'within' matcher" unless ::RSpec::Matchers.instance_methods.include?(:within)
68
67
  visit('/with_html')
69
68
  # This reads terribly, but must call #within
70
69
  expect(find(:css, 'span.number').text.to_i).to within(1).of(41)
@@ -72,15 +71,15 @@ RSpec.describe 'capybara/rspec', :type => :feature do
72
71
  end
73
72
  end
74
73
 
75
- RSpec.describe 'capybara/rspec', :type => :other do
74
+ RSpec.describe 'capybara/rspec', type: :other do
76
75
  context "when RSpec::Matchers is included after Capybara::DSL" do
77
76
  before do
78
- class DSL_MatchersTest
77
+ class DSLMatchersTest
79
78
  include Capybara::DSL
80
79
  include RSpec::Matchers
81
80
  end
82
81
 
83
- @test_class_instance = DSL_MatchersTest.new
82
+ @test_class_instance = DSLMatchersTest.new
84
83
  end
85
84
 
86
85
  context "#all" do
@@ -90,10 +89,8 @@ RSpec.describe 'capybara/rspec', :type => :other do
90
89
  end
91
90
 
92
91
  it "allows access to the RSpec matcher" do
93
- skip "RSpec < 3 doesn't have an `all` matcher" if rspec2?
94
-
95
92
  @test_class_instance.visit('/with_html')
96
- expect(["test1", "test2"]).to @test_class_instance.all(be_a(String))
93
+ expect(%w[test1 test2]).to @test_class_instance.all(be_a(String))
97
94
  end
98
95
  end
99
96
 
@@ -106,7 +103,6 @@ RSpec.describe 'capybara/rspec', :type => :other do
106
103
  end
107
104
 
108
105
  it "allows access to the RSpec matcher" do
109
- skip "RSpec version doesn't have a 'within' matcher" unless ::RSpec::Matchers.instance_methods.include?(:within)
110
106
  @test_class_instance.visit('/with_html')
111
107
  # This reads terribly, but must call #within
112
108
  expect(@test_class_instance.find(:css, 'span.number').text.to_i).to @test_class_instance.within(1).of(41)
@@ -115,7 +111,7 @@ RSpec.describe 'capybara/rspec', :type => :other do
115
111
  end
116
112
  end
117
113
 
118
- RSpec.describe 'capybara/rspec', :type => :other do
114
+ RSpec.describe 'capybara/rspec', type: :other do
119
115
  it "should not include Capybara" do
120
116
  expect { visit('/') }.to raise_error(NoMethodError)
121
117
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  RSpec.describe Capybara do
@@ -56,7 +57,7 @@ RSpec.describe Capybara do
56
57
  it "can set default visiblity" do
57
58
  Capybara.add_selector :hidden_field do
58
59
  visible :hidden
59
- css { |sel| 'input[type="hidden"]' }
60
+ css { |_sel| 'input[type="hidden"]' }
60
61
  end
61
62
 
62
63
  expect(string).to have_no_css('input[type="hidden"]')
@@ -77,7 +78,7 @@ RSpec.describe Capybara do
77
78
 
78
79
  it "doesn't change existing filters" do
79
80
  Capybara.modify_selector :custom_selector do
80
- css { |css_class| "p.#{css_class}"}
81
+ css { |css_class| "p.#{css_class}" }
81
82
  end
82
83
  expect(string).to have_selector(:custom_selector, 'b', count: 1)
83
84
  expect(string).to have_selector(:custom_selector, 'b', not_empty: false, count: 1)
@@ -92,7 +93,7 @@ RSpec.describe Capybara do
92
93
  field: ".//*[self::input | self::textarea | self::select][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'hidden')]",
93
94
  fieldset: ".//fieldset",
94
95
  link: ".//a[./@href]",
95
- link_or_button: ".//a[./@href] | .//input[./@type = 'submit' or ./@type = 'reset' or ./@type = 'image' or ./@type = 'button'] | .//button" ,
96
+ link_or_button: ".//a[./@href] | .//input[./@type = 'submit' or ./@type = 'reset' or ./@type = 'image' or ./@type = 'button'] | .//button",
96
97
  fillable_field: ".//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')]",
97
98
  radio_button: ".//input[./@type = 'radio']",
98
99
  checkbox: ".//input[./@type = 'checkbox']",
@@ -102,7 +103,7 @@ RSpec.describe Capybara do
102
103
  table: ".//table"
103
104
  }
104
105
  selectors.each do |selector, xpath|
105
- results = string.all(selector,nil).to_a.map(&:native)
106
+ results = string.all(selector, nil).to_a.map(&:native)
106
107
  expect(results.size).to be > 0
107
108
  expect(results).to eq string.all(:xpath, xpath).to_a.map(&:native)
108
109
  end
@@ -116,7 +117,6 @@ RSpec.describe Capybara do
116
117
  end
117
118
 
118
119
  it "works with 'special' characters" do
119
- skip "We support old Nokogiris but they have their limits" if Gem::Version.new(Nokogiri::VERSION) < Gem::Version.new('1.6.8')
120
120
  expect(string.find(:custom_css_selector, "div", id: "#special")[:id]).to eq '#special'
121
121
  expect(string.find(:custom_css_selector, "input", id: "2checkbox")[:id]).to eq '2checkbox'
122
122
  end
@@ -129,7 +129,6 @@ RSpec.describe Capybara do
129
129
  end
130
130
 
131
131
  it "works with 'special' characters" do
132
- skip "We support old Nokogiris but they have their limits" if Gem::Version.new(Nokogiri::VERSION) < Gem::Version.new('1.6.8')
133
132
  expect(string.find(:custom_css_selector, "input", class: ".special")[:id]).to eq 'file'
134
133
  expect(string.find(:custom_css_selector, "input", class: "2checkbox")[:id]).to eq '2checkbox'
135
134
  end
@@ -1,9 +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'
6
+ require 'rspec/shared_spec_matchers'
5
7
 
6
- CHROME_DRIVER = if ENV['HEADLESS'] then :selenium_chrome_headless else :selenium_chrome end
8
+ CHROME_DRIVER = ENV['HEADLESS'] ? :selenium_chrome_headless : :selenium_chrome
7
9
 
8
10
  # if ENV['HEADLESS'] && ENV['TRAVIS']
9
11
  # Selenium::WebDriver::Chrome.path='/usr/bin/google-chrome-beta'
@@ -12,7 +14,7 @@ CHROME_DRIVER = if ENV['HEADLESS'] then :selenium_chrome_headless else :selenium
12
14
  Capybara.register_driver :selenium_chrome_clear_storage do |app|
13
15
  chrome_options = {
14
16
  browser: :chrome,
15
- options: ::Selenium::WebDriver::Chrome::Options.new()
17
+ options: ::Selenium::WebDriver::Chrome::Options.new
16
18
  }
17
19
  chrome_options[:options].args << 'headless' if ENV['HEADLESS']
18
20
  Capybara::Selenium::Driver.new(app, chrome_options.merge(clear_local_storage: true, clear_session_storage: true))
@@ -22,15 +24,18 @@ module TestSessions
22
24
  Chrome = Capybara::Session.new(CHROME_DRIVER, TestApp)
23
25
  end
24
26
 
25
- skipped_tests = [:response_headers, :status_code, :trigger]
27
+ skipped_tests = %i[response_headers status_code trigger]
26
28
  # skip window tests when headless for now - closing a window not supported by chromedriver/chrome
27
- skipped_tests << :windows if ENV['TRAVIS'] && (ENV['SKIP_WINDOW'] || ENV['HEADLESS'])
29
+ skipped_tests << :windows if ENV['TRAVIS'] && (ENV['SKIP_WINDOW'] || ENV['HEADLESS'])
30
+
31
+ $stdout.puts `#{Selenium::WebDriver::Chrome.driver_path} --version` if ENV['CI']
28
32
 
29
33
  Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_DRIVER.to_s, capybara_skip: skipped_tests
30
34
 
31
35
  RSpec.describe "Capybara::Session with chrome" do
32
36
  include Capybara::SpecHelper
33
37
  include_examples "Capybara::Session", TestSessions::Chrome, CHROME_DRIVER
38
+ include_examples Capybara::RSpecMatchers, TestSessions::Chrome, CHROME_DRIVER
34
39
 
35
40
  context "storage" do
36
41
  describe "#reset!" do
@@ -0,0 +1,27 @@
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_edge do |app|
9
+ # ::Selenium::WebDriver.logger.level = "debug"
10
+ Capybara::Selenium::Driver.new(app, browser: :edge)
11
+ end
12
+
13
+ module TestSessions
14
+ SeleniumEdge = Capybara::Session.new(:selenium_edge, TestApp)
15
+ end
16
+
17
+ skipped_tests = %i[response_headers status_code trigger modals]
18
+
19
+ $stdout.puts `#{Selenium::WebDriver::Edge.driver_path} --version` if ENV['CI']
20
+
21
+ Capybara::SpecHelper.run_specs TestSessions::SeleniumEdge, "selenium", capybara_skip: skipped_tests
22
+
23
+ RSpec.describe "Capybara::Session with Edge", capybara_skip: skipped_tests do
24
+ include Capybara::SpecHelper
25
+ include_examples "Capybara::Session", TestSessions::SeleniumEdge, :selenium_edge
26
+ include_examples Capybara::RSpecMatchers, TestSessions::SeleniumEdge, :selenium_edge
27
+ end