capybara 3.3.1 → 3.4.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 (159) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +16 -0
  3. data/README.md +5 -7
  4. data/lib/capybara.rb +7 -6
  5. data/lib/capybara/config.rb +1 -1
  6. data/lib/capybara/dsl.rb +2 -2
  7. data/lib/capybara/helpers.rb +3 -3
  8. data/lib/capybara/minitest/spec.rb +3 -3
  9. data/lib/capybara/node/actions.rb +18 -18
  10. data/lib/capybara/node/base.rb +1 -1
  11. data/lib/capybara/node/element.rb +2 -2
  12. data/lib/capybara/node/finders.rb +6 -6
  13. data/lib/capybara/node/matchers.rb +5 -5
  14. data/lib/capybara/node/simple.rb +2 -2
  15. data/lib/capybara/queries/ancestor_query.rb +1 -1
  16. data/lib/capybara/queries/base_query.rb +12 -11
  17. data/lib/capybara/queries/current_path_query.rb +1 -1
  18. data/lib/capybara/queries/selector_query.rb +39 -15
  19. data/lib/capybara/queries/sibling_query.rb +1 -1
  20. data/lib/capybara/queries/text_query.rb +1 -1
  21. data/lib/capybara/rack_test/browser.rb +7 -7
  22. data/lib/capybara/rack_test/driver.rb +1 -1
  23. data/lib/capybara/rack_test/form.rb +7 -7
  24. data/lib/capybara/rack_test/node.rb +16 -16
  25. data/lib/capybara/rails.rb +1 -1
  26. data/lib/capybara/result.rb +8 -4
  27. data/lib/capybara/rspec/features.rb +4 -4
  28. data/lib/capybara/rspec/matchers.rb +6 -6
  29. data/lib/capybara/selector.rb +106 -90
  30. data/lib/capybara/selector/css.rb +4 -4
  31. data/lib/capybara/selector/filter_set.rb +52 -8
  32. data/lib/capybara/selector/selector.rb +39 -15
  33. data/lib/capybara/selenium/driver.rb +10 -10
  34. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +8 -0
  35. data/lib/capybara/selenium/node.rb +9 -10
  36. data/lib/capybara/selenium/nodes/chrome_node.rb +18 -0
  37. data/lib/capybara/selenium/nodes/marionette_node.rb +32 -7
  38. data/lib/capybara/server.rb +3 -3
  39. data/lib/capybara/server/animation_disabler.rb +1 -1
  40. data/lib/capybara/server/middleware.rb +1 -1
  41. data/lib/capybara/session.rb +23 -19
  42. data/lib/capybara/session/config.rb +18 -3
  43. data/lib/capybara/spec/public/test.js +1 -1
  44. data/lib/capybara/spec/session/accept_alert_spec.rb +10 -10
  45. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  46. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  47. data/lib/capybara/spec/session/all_spec.rb +33 -32
  48. data/lib/capybara/spec/session/ancestor_spec.rb +19 -19
  49. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +38 -38
  50. data/lib/capybara/spec/session/assert_current_path_spec.rb +16 -16
  51. data/lib/capybara/spec/session/assert_selector_spec.rb +53 -53
  52. data/lib/capybara/spec/session/assert_style_spec.rb +3 -3
  53. data/lib/capybara/spec/session/assert_text_spec.rb +31 -30
  54. data/lib/capybara/spec/session/assert_title_spec.rb +12 -12
  55. data/lib/capybara/spec/session/attach_file_spec.rb +51 -52
  56. data/lib/capybara/spec/session/body_spec.rb +6 -6
  57. data/lib/capybara/spec/session/check_spec.rb +52 -47
  58. data/lib/capybara/spec/session/choose_spec.rb +32 -32
  59. data/lib/capybara/spec/session/click_button_spec.rb +103 -103
  60. data/lib/capybara/spec/session/click_link_or_button_spec.rb +24 -23
  61. data/lib/capybara/spec/session/click_link_spec.rb +49 -48
  62. data/lib/capybara/spec/session/current_scope_spec.rb +7 -7
  63. data/lib/capybara/spec/session/current_url_spec.rb +26 -27
  64. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  65. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  66. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +8 -8
  67. data/lib/capybara/spec/session/element/match_css_spec.rb +10 -10
  68. data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
  69. data/lib/capybara/spec/session/element/matches_selector_spec.rb +51 -51
  70. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  71. data/lib/capybara/spec/session/evaluate_script_spec.rb +15 -8
  72. data/lib/capybara/spec/session/execute_script_spec.rb +7 -7
  73. data/lib/capybara/spec/session/fill_in_spec.rb +43 -42
  74. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  75. data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
  76. data/lib/capybara/spec/session/find_field_spec.rb +32 -30
  77. data/lib/capybara/spec/session/find_link_spec.rb +21 -21
  78. data/lib/capybara/spec/session/find_spec.rb +153 -135
  79. data/lib/capybara/spec/session/first_spec.rb +41 -41
  80. data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
  81. data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
  82. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +17 -17
  83. data/lib/capybara/spec/session/frame/within_frame_spec.rb +31 -17
  84. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  85. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  86. data/lib/capybara/spec/session/has_all_selectors_spec.rb +17 -17
  87. data/lib/capybara/spec/session/has_button_spec.rb +13 -13
  88. data/lib/capybara/spec/session/has_css_spec.rb +133 -131
  89. data/lib/capybara/spec/session/has_current_path_spec.rb +29 -29
  90. data/lib/capybara/spec/session/has_field_spec.rb +58 -58
  91. data/lib/capybara/spec/session/has_link_spec.rb +4 -4
  92. data/lib/capybara/spec/session/has_none_selectors_spec.rb +24 -24
  93. data/lib/capybara/spec/session/has_select_spec.rb +43 -43
  94. data/lib/capybara/spec/session/has_selector_spec.rb +71 -71
  95. data/lib/capybara/spec/session/has_style_spec.rb +3 -3
  96. data/lib/capybara/spec/session/has_table_spec.rb +4 -4
  97. data/lib/capybara/spec/session/has_text_spec.rb +53 -52
  98. data/lib/capybara/spec/session/has_title_spec.rb +14 -14
  99. data/lib/capybara/spec/session/has_xpath_spec.rb +39 -38
  100. data/lib/capybara/spec/session/headers_spec.rb +1 -1
  101. data/lib/capybara/spec/session/html_spec.rb +6 -6
  102. data/lib/capybara/spec/session/node_spec.rb +129 -123
  103. data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
  104. data/lib/capybara/spec/session/refresh_spec.rb +4 -7
  105. data/lib/capybara/spec/session/reset_session_spec.rb +28 -28
  106. data/lib/capybara/spec/session/response_code_spec.rb +1 -1
  107. data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
  108. data/lib/capybara/spec/session/save_page_spec.rb +37 -37
  109. data/lib/capybara/spec/session/save_screenshot_spec.rb +6 -6
  110. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  111. data/lib/capybara/spec/session/select_spec.rb +81 -81
  112. data/lib/capybara/spec/session/selectors_spec.rb +17 -17
  113. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  114. data/lib/capybara/spec/session/text_spec.rb +23 -23
  115. data/lib/capybara/spec/session/title_spec.rb +5 -5
  116. data/lib/capybara/spec/session/uncheck_spec.rb +24 -20
  117. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  118. data/lib/capybara/spec/session/visit_spec.rb +48 -49
  119. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
  120. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +16 -16
  121. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -2
  122. data/lib/capybara/spec/session/window/window_spec.rb +4 -4
  123. data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
  124. data/lib/capybara/spec/session/within_spec.rb +41 -41
  125. data/lib/capybara/spec/spec_helper.rb +11 -9
  126. data/lib/capybara/spec/test_app.rb +18 -17
  127. data/lib/capybara/spec/views/form.erb +29 -31
  128. data/lib/capybara/spec/views/with_html.erb +2 -2
  129. data/lib/capybara/version.rb +1 -1
  130. data/spec/basic_node_spec.rb +23 -23
  131. data/spec/capybara_spec.rb +20 -20
  132. data/spec/css_splitter_spec.rb +7 -7
  133. data/spec/dsl_spec.rb +37 -32
  134. data/spec/filter_set_spec.rb +4 -4
  135. data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -1
  136. data/spec/fixtures/selenium_driver_rspec_success.rb +1 -1
  137. data/spec/minitest_spec.rb +4 -4
  138. data/spec/minitest_spec_spec.rb +23 -23
  139. data/spec/per_session_config_spec.rb +5 -5
  140. data/spec/rack_test_spec.rb +44 -44
  141. data/spec/result_spec.rb +14 -14
  142. data/spec/rspec/features_spec.rb +13 -13
  143. data/spec/rspec/scenarios_spec.rb +4 -4
  144. data/spec/rspec/shared_spec_matchers.rb +282 -281
  145. data/spec/rspec/views_spec.rb +3 -3
  146. data/spec/rspec_matchers_spec.rb +10 -10
  147. data/spec/rspec_spec.rb +29 -29
  148. data/spec/selector_spec.rb +64 -64
  149. data/spec/selenium_spec_chrome.rb +14 -22
  150. data/spec/selenium_spec_chrome_remote.rb +28 -8
  151. data/spec/selenium_spec_edge.rb +9 -4
  152. data/spec/selenium_spec_firefox_remote.rb +87 -0
  153. data/spec/selenium_spec_ie.rb +9 -4
  154. data/spec/selenium_spec_marionette.rb +42 -18
  155. data/spec/server_spec.rb +29 -27
  156. data/spec/session_spec.rb +17 -17
  157. data/spec/shared_selenium_session.rb +70 -52
  158. data/spec/spec_helper.rb +1 -1
  159. metadata +4 -2
@@ -18,7 +18,7 @@ Capybara::SpecHelper.spec '#current_window', requires: [:windows] do
18
18
  expect(@session.current_window).to be_instance_of(Capybara::Window)
19
19
  end
20
20
 
21
- it "should be modified by switching to another window" do
21
+ it 'should be modified by switching to another window' do
22
22
  window = @session.window_opened_by { @session.find(:css, '#openWindow').click }
23
23
 
24
24
  expect do
@@ -15,27 +15,27 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
15
15
  @session.switch_to_window(@window)
16
16
  end
17
17
 
18
- it "should raise error when invoked without args" do
18
+ it 'should raise error when invoked without args' do
19
19
  expect do
20
20
  @session.switch_to_window
21
- end.to raise_error(ArgumentError, "`switch_to_window`: either window or block should be provided")
21
+ end.to raise_error(ArgumentError, '`switch_to_window`: either window or block should be provided')
22
22
  end
23
23
 
24
- it "should raise error when invoked with window and block" do
24
+ it 'should raise error when invoked with window and block' do
25
25
  expect do
26
26
  @session.switch_to_window(@window) { @session.title == 'Title of the first popup' }
27
- end.to raise_error(ArgumentError, "`switch_to_window` can take either a block or a window, not both")
27
+ end.to raise_error(ArgumentError, '`switch_to_window` can take either a block or a window, not both')
28
28
  end
29
29
 
30
- context "with an instance of Capybara::Window" do
31
- it "should be able to switch to window" do
30
+ context 'with an instance of Capybara::Window' do
31
+ it 'should be able to switch to window' do
32
32
  window = @session.open_new_window
33
33
  expect(@session.title).to eq('With Windows')
34
34
  @session.switch_to_window(window)
35
35
  expect(@session.title).to satisfy('be a blank title') { |title| ['', 'about:blank'].include? title }
36
36
  end
37
37
 
38
- it "should raise error when closed window is passed" do
38
+ it 'should raise error when closed window is passed' do
39
39
  original_window = @session.current_window
40
40
  new_window = @session.open_new_window
41
41
  @session.switch_to_window(new_window)
@@ -47,30 +47,30 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
47
47
  end
48
48
  end
49
49
 
50
- context "with block" do
50
+ context 'with block' do
51
51
  before do
52
52
  @session.find(:css, '#openTwoWindows').click
53
53
  sleep(1) # wait for the windows to open
54
54
  end
55
55
 
56
- it "should be able to switch to current window" do
56
+ it 'should be able to switch to current window' do
57
57
  @session.switch_to_window { @session.title == 'With Windows' }
58
58
  expect(@session).to have_css('#openTwoWindows')
59
59
  end
60
60
 
61
- it "should find the div in another window" do
61
+ it 'should find the div in another window' do
62
62
  @session.switch_to_window { @session.title == 'Title of popup two' }
63
63
  expect(@session).to have_css('#divInPopupTwo')
64
64
  end
65
65
 
66
- it "should be able to switch multiple times" do
66
+ it 'should be able to switch multiple times' do
67
67
  @session.switch_to_window { @session.title == 'Title of the first popup' }
68
68
  expect(@session).to have_css('#divInPopupOne')
69
69
  @session.switch_to_window { @session.title == 'Title of popup two' }
70
70
  expect(@session).to have_css('#divInPopupTwo')
71
71
  end
72
72
 
73
- it "should return window" do
73
+ it 'should return window' do
74
74
  window = @session.switch_to_window { @session.title == 'Title of popup two' }
75
75
  expect((@session.windows - [@window])).to include(window)
76
76
  end
@@ -91,7 +91,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
91
91
  end.to raise_error(Capybara::ScopeError, /`switch_to_window` is not supposed to be invoked from/)
92
92
  end
93
93
 
94
- it "should allow to be called inside within_window and within_window will still return to original" do
94
+ it 'should allow to be called inside within_window and within_window will still return to original' do
95
95
  other_windows = (@session.windows - [@window])
96
96
  expect(@session.current_window).to eq(@window)
97
97
  @session.within_window other_windows[0] do
@@ -106,11 +106,11 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
106
106
  original = @session.current_window
107
107
  expect do
108
108
  @session.switch_to_window { @session.title == 'A title' }
109
- end.to raise_error(Capybara::WindowError, "Could not find a window matching block/lambda")
109
+ end.to raise_error(Capybara::WindowError, 'Could not find a window matching block/lambda')
110
110
  expect(@session.current_window).to eq(original)
111
111
  end
112
112
 
113
- it "should switch to original window if error is raised inside block" do
113
+ it 'should switch to original window if error is raised inside block' do
114
114
  original = @session.switch_to_window(@session.windows[1])
115
115
  expect do
116
116
  @session.switch_to_window { raise 'error' }
@@ -119,7 +119,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
119
119
  end
120
120
  end
121
121
 
122
- it "should wait for window to appear" do
122
+ it 'should wait for window to appear' do
123
123
  @session.find(:css, '#openWindowWithTimeout').click
124
124
  expect do
125
125
  @session.switch_to_window(wait: 5) { @session.title == 'Title of the first popup' }
@@ -15,8 +15,8 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
15
15
  @session.switch_to_window(@window)
16
16
  end
17
17
 
18
- let(:zero_windows_message) { "block passed to #window_opened_by opened 0 windows instead of 1" }
19
- let(:two_windows_message) { "block passed to #window_opened_by opened 2 windows instead of 1" }
18
+ let(:zero_windows_message) { 'block passed to #window_opened_by opened 0 windows instead of 1' }
19
+ let(:two_windows_message) { 'block passed to #window_opened_by opened 2 windows instead of 1' }
20
20
 
21
21
  context 'with :wait option' do
22
22
  it 'should raise error if value of :wait is less than timeout' do
@@ -21,7 +21,7 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
21
21
  end
22
22
  end
23
23
 
24
- it "should become false after window was closed" do
24
+ it 'should become false after window was closed' do
25
25
  expect do
26
26
  @session.switch_to_window @other_window
27
27
  @other_window.close
@@ -30,7 +30,7 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
30
30
  end
31
31
 
32
32
  describe '#closed?' do
33
- it "should become true after window was closed" do
33
+ it 'should become true after window was closed' do
34
34
  @other_window = @session.window_opened_by do
35
35
  @session.find(:css, '#openWindow').click
36
36
  end
@@ -89,7 +89,7 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
89
89
 
90
90
  describe '#size' do
91
91
  def win_size
92
- @session.evaluate_script("[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]")
92
+ @session.evaluate_script('[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]')
93
93
  end
94
94
 
95
95
  it 'should return size of whole window', requires: %i[windows js] do
@@ -195,7 +195,7 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
195
195
  sleep 0.5
196
196
  end
197
197
 
198
- it "should be able to fullscreen the window" do
198
+ it 'should be able to fullscreen the window' do
199
199
  expect do
200
200
  @session.current_window.fullscreen
201
201
  end.not_to raise_error
@@ -19,8 +19,8 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
19
19
  @session.switch_to_window(@window)
20
20
  end
21
21
 
22
- context "with an instance of Capybara::Window" do
23
- it "should not invoke driver#switch_to_window when given current window" do
22
+ context 'with an instance of Capybara::Window' do
23
+ it 'should not invoke driver#switch_to_window when given current window' do
24
24
  allow(@session.driver).to receive(:switch_to_window).and_call_original
25
25
  @session.within_window @window do
26
26
  expect(@session.title).to eq('With Windows')
@@ -28,7 +28,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
28
28
  expect(@session.driver).not_to have_received(:switch_to_window)
29
29
  end
30
30
 
31
- it "should be able to switch to another window" do
31
+ it 'should be able to switch to another window' do
32
32
  window = (@session.windows - [@window]).first
33
33
  @session.within_window window do
34
34
  expect(@session).to have_title(/Title of the first popup|Title of popup two/)
@@ -36,7 +36,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
36
36
  expect(@session.title).to eq('With Windows')
37
37
  end
38
38
 
39
- it "returns value from the block" do
39
+ it 'returns value from the block' do
40
40
  window = (@session.windows - [@window]).first
41
41
  value = @session.within_window window do
42
42
  43252003274489856000
@@ -44,7 +44,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
44
44
  expect(value).to eq(43252003274489856000)
45
45
  end
46
46
 
47
- it "should switch back if exception was raised inside block" do
47
+ it 'should switch back if exception was raised inside block' do
48
48
  window = (@session.windows - [@window]).first
49
49
  expect do
50
50
  @session.within_window(window) do
@@ -58,7 +58,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
58
58
  expect(@session.send(:scopes)).to eq([nil])
59
59
  end
60
60
 
61
- it "should leave correct scopes after execution in case of error", requires: %i[windows frames] do
61
+ it 'should leave correct scopes after execution in case of error', requires: %i[windows frames] do
62
62
  window = (@session.windows - [@window]).first
63
63
  expect do
64
64
  @session.within_frame 'frameOne' do
@@ -86,14 +86,14 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
86
86
  end
87
87
  end
88
88
 
89
- context "with lambda" do
90
- it "should find the div in another window" do
89
+ context 'with lambda' do
90
+ it 'should find the div in another window' do
91
91
  @session.within_window(-> { @session.title == 'Title of the first popup' }) do
92
92
  expect(@session).to have_css('#divInPopupOne')
93
93
  end
94
94
  end
95
95
 
96
- it "should find divs in both windows" do
96
+ it 'should find divs in both windows' do
97
97
  @session.within_window(-> { @session.title == 'Title of popup two' }) do
98
98
  expect(@session).to have_css('#divInPopupTwo')
99
99
  end
@@ -103,7 +103,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
103
103
  expect(@session.title).to eq('With Windows')
104
104
  end
105
105
 
106
- it "should be able to nest within_window" do
106
+ it 'should be able to nest within_window' do
107
107
  @session.within_window(-> { @session.title == 'Title of popup two' }) do
108
108
  expect(@session).to have_css('#divInPopupTwo')
109
109
  @session.within_window(-> { @session.title == 'Title of the first popup' }) do
@@ -117,7 +117,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
117
117
  expect(@session.title).to eq('With Windows')
118
118
  end
119
119
 
120
- it "should work inside a normal scope" do
120
+ it 'should work inside a normal scope' do
121
121
  expect(@session).to have_css('#openWindow')
122
122
  @session.within(:css, '#scope') do
123
123
  @session.within_window(-> { @session.title == 'Title of the first popup' }) do
@@ -133,18 +133,18 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
133
133
  @session.within_window(-> { @session.title == 'Invalid title' }) do
134
134
  expect(@session).to have_css('#divInPopupOne')
135
135
  end
136
- end.to raise_error(Capybara::WindowError, "Could not find a window matching block/lambda")
136
+ end.to raise_error(Capybara::WindowError, 'Could not find a window matching block/lambda')
137
137
  expect(@session.current_window).to eq(@window)
138
138
  expect(@session).to have_css('#doesNotOpenWindows')
139
139
  expect(@session.send(:scopes)).to eq([nil])
140
140
  end
141
141
 
142
- it "returns value from the block" do
142
+ it 'returns value from the block' do
143
143
  value = @session.within_window(-> { @session.title == 'Title of popup two' }) { 42 }
144
144
  expect(value).to eq(42)
145
145
  end
146
146
 
147
- it "should switch back if exception was raised inside block" do
147
+ it 'should switch back if exception was raised inside block' do
148
148
  expect do
149
149
  @session.within_window(-> { @session.title == 'Title of popup two' }) do
150
150
  raise 'some error'
@@ -5,31 +5,31 @@ Capybara::SpecHelper.spec '#within' do
5
5
  @session.visit('/with_scope')
6
6
  end
7
7
 
8
- context "with CSS selector" do
9
- it "should click links in the given scope" do
10
- @session.within(:css, "#for_bar li:first-child") do
8
+ context 'with CSS selector' do
9
+ it 'should click links in the given scope' do
10
+ @session.within(:css, '#for_bar li:first-child') do
11
11
  @session.click_link('Go')
12
12
  end
13
13
  expect(@session).to have_content('Bar')
14
14
  end
15
15
 
16
- it "should assert content in the given scope" do
17
- @session.within(:css, "#for_foo") do
16
+ it 'should assert content in the given scope' do
17
+ @session.within(:css, '#for_foo') do
18
18
  expect(@session).not_to have_content('First Name')
19
19
  end
20
20
  expect(@session).to have_content('First Name')
21
21
  end
22
22
 
23
- it "should accept additional options" do
24
- @session.within(:css, "#for_bar li", text: 'With Simple HTML') do
23
+ it 'should accept additional options' do
24
+ @session.within(:css, '#for_bar li', text: 'With Simple HTML') do
25
25
  @session.click_link('Go')
26
26
  end
27
27
  expect(@session).to have_content('Bar')
28
28
  end
29
29
  end
30
30
 
31
- context "with XPath selector" do
32
- it "should click links in the given scope" do
31
+ context 'with XPath selector' do
32
+ it 'should click links in the given scope' do
33
33
  @session.within(:xpath, "//div[@id='for_bar']//li[contains(.,'With Simple HTML')]") do
34
34
  @session.click_link('Go')
35
35
  end
@@ -37,8 +37,8 @@ Capybara::SpecHelper.spec '#within' do
37
37
  end
38
38
  end
39
39
 
40
- context "with the default selector" do
41
- it "should use XPath" do
40
+ context 'with the default selector' do
41
+ it 'should use XPath' do
42
42
  @session.within("//div[@id='for_bar']//li[contains(.,'With Simple HTML')]") do
43
43
  @session.click_link('Go')
44
44
  end
@@ -46,9 +46,9 @@ Capybara::SpecHelper.spec '#within' do
46
46
  end
47
47
  end
48
48
 
49
- context "with Node rather than selector" do
50
- it "should click links in the given scope" do
51
- node_of_interest = @session.find(:css, "#for_bar li", text: 'With Simple HTML')
49
+ context 'with Node rather than selector' do
50
+ it 'should click links in the given scope' do
51
+ node_of_interest = @session.find(:css, '#for_bar li', text: 'With Simple HTML')
52
52
 
53
53
  @session.within(node_of_interest) do
54
54
  @session.click_link('Go')
@@ -57,11 +57,11 @@ Capybara::SpecHelper.spec '#within' do
57
57
  end
58
58
  end
59
59
 
60
- context "with the default selector set to CSS" do
60
+ context 'with the default selector set to CSS' do
61
61
  before { Capybara.default_selector = :css }
62
62
 
63
- it "should use CSS" do
64
- @session.within("#for_bar li", text: 'With Simple HTML') do
63
+ it 'should use CSS' do
64
+ @session.within('#for_bar li', text: 'With Simple HTML') do
65
65
  @session.click_link('Go')
66
66
  end
67
67
  expect(@session).to have_content('Bar')
@@ -69,8 +69,8 @@ Capybara::SpecHelper.spec '#within' do
69
69
  after { Capybara.default_selector = :xpath }
70
70
  end
71
71
 
72
- context "with nested scopes" do
73
- it "should respect the inner scope" do
72
+ context 'with nested scopes' do
73
+ it 'should respect the inner scope' do
74
74
  @session.within("//div[@id='for_bar']") do
75
75
  @session.within(".//li[contains(.,'Bar')]") do
76
76
  @session.click_link('Go')
@@ -79,7 +79,7 @@ Capybara::SpecHelper.spec '#within' do
79
79
  expect(@session).to have_content('Another World')
80
80
  end
81
81
 
82
- it "should respect the outer scope" do
82
+ it 'should respect the outer scope' do
83
83
  @session.within("//div[@id='another_foo']") do
84
84
  @session.within(".//li[contains(.,'With Simple HTML')]") do
85
85
  @session.click_link('Go')
@@ -89,14 +89,14 @@ Capybara::SpecHelper.spec '#within' do
89
89
  end
90
90
  end
91
91
 
92
- it "should raise an error if the scope is not found on the page" do
92
+ it 'should raise an error if the scope is not found on the page' do
93
93
  expect do
94
94
  @session.within("//div[@id='doesnotexist']") do
95
95
  end
96
96
  end.to raise_error(Capybara::ElementNotFound)
97
97
  end
98
98
 
99
- it "should restore the scope when an error is raised" do
99
+ it 'should restore the scope when an error is raised' do
100
100
  expect do
101
101
  @session.within("//div[@id='for_bar']") do
102
102
  expect do
@@ -109,7 +109,7 @@ Capybara::SpecHelper.spec '#within' do
109
109
  end.not_to change { @session.has_xpath?(".//div[@id='another_foo']") }.from(true)
110
110
  end
111
111
 
112
- it "should fill in a field and click a button" do
112
+ it 'should fill in a field and click a button' do
113
113
  @session.within("//li[contains(.,'Bar')]") do
114
114
  @session.click_button('Go')
115
115
  end
@@ -122,9 +122,9 @@ Capybara::SpecHelper.spec '#within' do
122
122
  expect(extract_results(@session)['first_name']).to eq('Dagobert')
123
123
  end
124
124
 
125
- it "should have #within_element as an alias" do
125
+ it 'should have #within_element as an alias' do
126
126
  expect(Capybara::Session.instance_method(:within)).to eq Capybara::Session.instance_method(:within_element)
127
- @session.within_element(:css, "#for_foo") do
127
+ @session.within_element(:css, '#for_foo') do
128
128
  expect(@session).not_to have_content('First Name')
129
129
  end
130
130
  end
@@ -135,18 +135,18 @@ Capybara::SpecHelper.spec '#within_fieldset' do
135
135
  @session.visit('/fieldsets')
136
136
  end
137
137
 
138
- it "should restrict scope to a fieldset given by id" do
139
- @session.within_fieldset("villain_fieldset") do
140
- @session.fill_in("Name", with: 'Goldfinger')
141
- @session.click_button("Create")
138
+ it 'should restrict scope to a fieldset given by id' do
139
+ @session.within_fieldset('villain_fieldset') do
140
+ @session.fill_in('Name', with: 'Goldfinger')
141
+ @session.click_button('Create')
142
142
  end
143
143
  expect(extract_results(@session)['villain_name']).to eq('Goldfinger')
144
144
  end
145
145
 
146
- it "should restrict scope to a fieldset given by legend" do
147
- @session.within_fieldset("Villain") do
148
- @session.fill_in("Name", with: 'Goldfinger')
149
- @session.click_button("Create")
146
+ it 'should restrict scope to a fieldset given by legend' do
147
+ @session.within_fieldset('Villain') do
148
+ @session.fill_in('Name', with: 'Goldfinger')
149
+ @session.click_button('Create')
150
150
  end
151
151
  expect(extract_results(@session)['villain_name']).to eq('Goldfinger')
152
152
  end
@@ -157,18 +157,18 @@ Capybara::SpecHelper.spec '#within_table' do
157
157
  @session.visit('/tables')
158
158
  end
159
159
 
160
- it "should restrict scope to a fieldset given by id" do
161
- @session.within_table("girl_table") do
162
- @session.fill_in("Name", with: 'Christmas')
163
- @session.click_button("Create")
160
+ it 'should restrict scope to a fieldset given by id' do
161
+ @session.within_table('girl_table') do
162
+ @session.fill_in('Name', with: 'Christmas')
163
+ @session.click_button('Create')
164
164
  end
165
165
  expect(extract_results(@session)['girl_name']).to eq('Christmas')
166
166
  end
167
167
 
168
- it "should restrict scope to a fieldset given by legend" do
169
- @session.within_table("Villain") do
170
- @session.fill_in("Name", with: 'Quantum')
171
- @session.click_button("Create")
168
+ it 'should restrict scope to a fieldset given by legend' do
169
+ @session.within_table('Villain') do
170
+ @session.fill_in('Name', with: 'Quantum')
171
+ @session.click_button('Create')
172
172
  end
173
173
  expect(extract_results(@session)['villain_name']).to eq('Quantum')
174
174
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rspec"
4
- require "rspec/expectations"
5
- require "capybara"
6
- require "capybara/rspec" # Required here instead of in rspec_spec to avoid RSpec deprecation warning
7
- require "capybara/spec/test_app"
8
- require "nokogiri"
3
+ require 'rspec'
4
+ require 'rspec/expectations'
5
+ require 'capybara'
6
+ require 'capybara/rspec' # Required here instead of in rspec_spec to avoid RSpec deprecation warning
7
+ require 'capybara/spec/test_app'
8
+ require 'nokogiri'
9
9
 
10
10
  Capybara.save_path = File.join(Dir.pwd, 'save_path_tmp')
11
11
 
@@ -33,6 +33,7 @@ module Capybara
33
33
  Capybara.enable_aria_label = false
34
34
  Capybara.default_set_options = {}
35
35
  Capybara.disable_animation = false
36
+ Capybara.test_id = nil
36
37
  reset_threadsafe
37
38
  end
38
39
 
@@ -51,14 +52,15 @@ module Capybara
51
52
  @specs << [name, options, block]
52
53
  end
53
54
 
54
- def run_specs(session, name, **options)
55
+ def run_specs(session, name, **options, &filter_block)
55
56
  specs = @specs
56
57
  RSpec.describe Capybara::Session, name, options do # rubocop:disable RSpec/EmptyExampleGroup
57
58
  include Capybara::SpecHelper
58
59
  include Capybara::RSpecMatchers
59
60
  # rubocop:disable RSpec/ScatteredSetup
60
- before do
61
+ before do |example|
61
62
  @session = session
63
+ instance_exec(example, &filter_block) if filter_block
62
64
  end
63
65
 
64
66
  after do
@@ -150,4 +152,4 @@ module Capybara
150
152
  end
151
153
  end
152
154
 
153
- Dir[File.dirname(__FILE__) + "/session/**/*.rb"].each { |file| require_relative file }
155
+ Dir[File.dirname(__FILE__) + '/session/**/*.rb'].each { |file| require_relative file }