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.
- checksums.yaml +4 -4
- data/History.md +16 -0
- data/README.md +5 -7
- data/lib/capybara.rb +7 -6
- data/lib/capybara/config.rb +1 -1
- data/lib/capybara/dsl.rb +2 -2
- data/lib/capybara/helpers.rb +3 -3
- data/lib/capybara/minitest/spec.rb +3 -3
- data/lib/capybara/node/actions.rb +18 -18
- data/lib/capybara/node/base.rb +1 -1
- data/lib/capybara/node/element.rb +2 -2
- data/lib/capybara/node/finders.rb +6 -6
- data/lib/capybara/node/matchers.rb +5 -5
- data/lib/capybara/node/simple.rb +2 -2
- data/lib/capybara/queries/ancestor_query.rb +1 -1
- data/lib/capybara/queries/base_query.rb +12 -11
- data/lib/capybara/queries/current_path_query.rb +1 -1
- data/lib/capybara/queries/selector_query.rb +39 -15
- data/lib/capybara/queries/sibling_query.rb +1 -1
- data/lib/capybara/queries/text_query.rb +1 -1
- data/lib/capybara/rack_test/browser.rb +7 -7
- data/lib/capybara/rack_test/driver.rb +1 -1
- data/lib/capybara/rack_test/form.rb +7 -7
- data/lib/capybara/rack_test/node.rb +16 -16
- data/lib/capybara/rails.rb +1 -1
- data/lib/capybara/result.rb +8 -4
- data/lib/capybara/rspec/features.rb +4 -4
- data/lib/capybara/rspec/matchers.rb +6 -6
- data/lib/capybara/selector.rb +106 -90
- data/lib/capybara/selector/css.rb +4 -4
- data/lib/capybara/selector/filter_set.rb +52 -8
- data/lib/capybara/selector/selector.rb +39 -15
- data/lib/capybara/selenium/driver.rb +10 -10
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +8 -0
- data/lib/capybara/selenium/node.rb +9 -10
- data/lib/capybara/selenium/nodes/chrome_node.rb +18 -0
- data/lib/capybara/selenium/nodes/marionette_node.rb +32 -7
- data/lib/capybara/server.rb +3 -3
- data/lib/capybara/server/animation_disabler.rb +1 -1
- data/lib/capybara/server/middleware.rb +1 -1
- data/lib/capybara/session.rb +23 -19
- data/lib/capybara/session/config.rb +18 -3
- data/lib/capybara/spec/public/test.js +1 -1
- data/lib/capybara/spec/session/accept_alert_spec.rb +10 -10
- data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
- data/lib/capybara/spec/session/all_spec.rb +33 -32
- data/lib/capybara/spec/session/ancestor_spec.rb +19 -19
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +38 -38
- data/lib/capybara/spec/session/assert_current_path_spec.rb +16 -16
- data/lib/capybara/spec/session/assert_selector_spec.rb +53 -53
- data/lib/capybara/spec/session/assert_style_spec.rb +3 -3
- data/lib/capybara/spec/session/assert_text_spec.rb +31 -30
- data/lib/capybara/spec/session/assert_title_spec.rb +12 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +51 -52
- data/lib/capybara/spec/session/body_spec.rb +6 -6
- data/lib/capybara/spec/session/check_spec.rb +52 -47
- data/lib/capybara/spec/session/choose_spec.rb +32 -32
- data/lib/capybara/spec/session/click_button_spec.rb +103 -103
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +24 -23
- data/lib/capybara/spec/session/click_link_spec.rb +49 -48
- data/lib/capybara/spec/session/current_scope_spec.rb +7 -7
- data/lib/capybara/spec/session/current_url_spec.rb +26 -27
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
- data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +8 -8
- data/lib/capybara/spec/session/element/match_css_spec.rb +10 -10
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +51 -51
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +15 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +7 -7
- data/lib/capybara/spec/session/fill_in_spec.rb +43 -42
- data/lib/capybara/spec/session/find_button_spec.rb +23 -23
- data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
- data/lib/capybara/spec/session/find_field_spec.rb +32 -30
- data/lib/capybara/spec/session/find_link_spec.rb +21 -21
- data/lib/capybara/spec/session/find_spec.rb +153 -135
- data/lib/capybara/spec/session/first_spec.rb +41 -41
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +17 -17
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +31 -17
- data/lib/capybara/spec/session/go_back_spec.rb +1 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +17 -17
- data/lib/capybara/spec/session/has_button_spec.rb +13 -13
- data/lib/capybara/spec/session/has_css_spec.rb +133 -131
- data/lib/capybara/spec/session/has_current_path_spec.rb +29 -29
- data/lib/capybara/spec/session/has_field_spec.rb +58 -58
- data/lib/capybara/spec/session/has_link_spec.rb +4 -4
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +24 -24
- data/lib/capybara/spec/session/has_select_spec.rb +43 -43
- data/lib/capybara/spec/session/has_selector_spec.rb +71 -71
- data/lib/capybara/spec/session/has_style_spec.rb +3 -3
- data/lib/capybara/spec/session/has_table_spec.rb +4 -4
- data/lib/capybara/spec/session/has_text_spec.rb +53 -52
- data/lib/capybara/spec/session/has_title_spec.rb +14 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +39 -38
- data/lib/capybara/spec/session/headers_spec.rb +1 -1
- data/lib/capybara/spec/session/html_spec.rb +6 -6
- data/lib/capybara/spec/session/node_spec.rb +129 -123
- data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
- data/lib/capybara/spec/session/refresh_spec.rb +4 -7
- data/lib/capybara/spec/session/reset_session_spec.rb +28 -28
- data/lib/capybara/spec/session/response_code_spec.rb +1 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
- data/lib/capybara/spec/session/save_page_spec.rb +37 -37
- data/lib/capybara/spec/session/save_screenshot_spec.rb +6 -6
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/select_spec.rb +81 -81
- data/lib/capybara/spec/session/selectors_spec.rb +17 -17
- data/lib/capybara/spec/session/sibling_spec.rb +9 -9
- data/lib/capybara/spec/session/text_spec.rb +23 -23
- data/lib/capybara/spec/session/title_spec.rb +5 -5
- data/lib/capybara/spec/session/uncheck_spec.rb +24 -20
- data/lib/capybara/spec/session/unselect_spec.rb +37 -37
- data/lib/capybara/spec/session/visit_spec.rb +48 -49
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +16 -16
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -2
- data/lib/capybara/spec/session/window/window_spec.rb +4 -4
- data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
- data/lib/capybara/spec/session/within_spec.rb +41 -41
- data/lib/capybara/spec/spec_helper.rb +11 -9
- data/lib/capybara/spec/test_app.rb +18 -17
- data/lib/capybara/spec/views/form.erb +29 -31
- data/lib/capybara/spec/views/with_html.erb +2 -2
- data/lib/capybara/version.rb +1 -1
- data/spec/basic_node_spec.rb +23 -23
- data/spec/capybara_spec.rb +20 -20
- data/spec/css_splitter_spec.rb +7 -7
- data/spec/dsl_spec.rb +37 -32
- data/spec/filter_set_spec.rb +4 -4
- data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +1 -1
- data/spec/minitest_spec.rb +4 -4
- data/spec/minitest_spec_spec.rb +23 -23
- data/spec/per_session_config_spec.rb +5 -5
- data/spec/rack_test_spec.rb +44 -44
- data/spec/result_spec.rb +14 -14
- data/spec/rspec/features_spec.rb +13 -13
- data/spec/rspec/scenarios_spec.rb +4 -4
- data/spec/rspec/shared_spec_matchers.rb +282 -281
- data/spec/rspec/views_spec.rb +3 -3
- data/spec/rspec_matchers_spec.rb +10 -10
- data/spec/rspec_spec.rb +29 -29
- data/spec/selector_spec.rb +64 -64
- data/spec/selenium_spec_chrome.rb +14 -22
- data/spec/selenium_spec_chrome_remote.rb +28 -8
- data/spec/selenium_spec_edge.rb +9 -4
- data/spec/selenium_spec_firefox_remote.rb +87 -0
- data/spec/selenium_spec_ie.rb +9 -4
- data/spec/selenium_spec_marionette.rb +42 -18
- data/spec/server_spec.rb +29 -27
- data/spec/session_spec.rb +17 -17
- data/spec/shared_selenium_session.rb +70 -52
- data/spec/spec_helper.rb +1 -1
- 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
|
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
|
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,
|
21
|
+
end.to raise_error(ArgumentError, '`switch_to_window`: either window or block should be provided')
|
22
22
|
end
|
23
23
|
|
24
|
-
it
|
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,
|
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
|
31
|
-
it
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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,
|
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
|
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
|
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) {
|
19
|
-
let(:two_windows_message) {
|
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
|
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
|
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(
|
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
|
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
|
23
|
-
it
|
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
|
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
|
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
|
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
|
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
|
90
|
-
it
|
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
|
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
|
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
|
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,
|
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
|
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
|
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
|
9
|
-
it
|
10
|
-
@session.within(:css,
|
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
|
17
|
-
@session.within(:css,
|
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
|
24
|
-
@session.within(:css,
|
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
|
32
|
-
it
|
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
|
41
|
-
it
|
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
|
50
|
-
it
|
51
|
-
node_of_interest = @session.find(:css,
|
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
|
60
|
+
context 'with the default selector set to CSS' do
|
61
61
|
before { Capybara.default_selector = :css }
|
62
62
|
|
63
|
-
it
|
64
|
-
@session.within(
|
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
|
73
|
-
it
|
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
|
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
|
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
|
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
|
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
|
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,
|
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
|
139
|
-
@session.within_fieldset(
|
140
|
-
@session.fill_in(
|
141
|
-
@session.click_button(
|
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
|
147
|
-
@session.within_fieldset(
|
148
|
-
@session.fill_in(
|
149
|
-
@session.click_button(
|
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
|
161
|
-
@session.within_table(
|
162
|
-
@session.fill_in(
|
163
|
-
@session.click_button(
|
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
|
169
|
-
@session.within_table(
|
170
|
-
@session.fill_in(
|
171
|
-
@session.click_button(
|
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
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
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__) +
|
155
|
+
Dir[File.dirname(__FILE__) + '/session/**/*.rb'].each { |file| require_relative file }
|