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
@@ -7,7 +7,7 @@ module Capybara
|
|
7
7
|
OPTIONS = %i[always_include_port run_server default_selector default_max_wait_time ignore_hidden_elements
|
8
8
|
automatic_reload match exact exact_text raise_server_errors visible_text_only
|
9
9
|
automatic_label_click enable_aria_label save_path asset_host default_host app_host
|
10
|
-
server_host server_port server_errors default_set_options disable_animation].freeze
|
10
|
+
server_host server_port server_errors default_set_options disable_animation test_id].freeze
|
11
11
|
|
12
12
|
attr_accessor(*OPTIONS)
|
13
13
|
|
@@ -54,6 +54,8 @@ module Capybara
|
|
54
54
|
# See {Capybara.configure}
|
55
55
|
# @!method disable_animation
|
56
56
|
# See {Capybara.configure}
|
57
|
+
# @!method test_id
|
58
|
+
# See {Capybara.configure}
|
57
59
|
|
58
60
|
remove_method :server_host
|
59
61
|
|
@@ -84,10 +86,23 @@ module Capybara
|
|
84
86
|
|
85
87
|
remove_method :disable_animation=
|
86
88
|
def disable_animation=(bool)
|
87
|
-
warn
|
89
|
+
warn 'Capybara.disable_animation is a beta feature - it may change/disappear in a future point version' if bool
|
88
90
|
@disable_animation = bool
|
89
91
|
end
|
90
92
|
|
93
|
+
remove_method :test_id=
|
94
|
+
##
|
95
|
+
#
|
96
|
+
# Set an attribue to be optionally matched against the locator for builtin selector types.
|
97
|
+
# This attribute will be checked by builtin selector types whenever id would normally be checked.
|
98
|
+
# If `nil` then it will be ignored.
|
99
|
+
#
|
100
|
+
# @params [String, Symbol, nil] id Name of the attribute to use as the test id
|
101
|
+
#
|
102
|
+
def test_id=(id)
|
103
|
+
@test_id = id&.to_sym
|
104
|
+
end
|
105
|
+
|
91
106
|
def initialize_copy(other)
|
92
107
|
super
|
93
108
|
@server_errors = @server_errors.dup
|
@@ -97,7 +112,7 @@ module Capybara
|
|
97
112
|
class ReadOnlySessionConfig < SimpleDelegator
|
98
113
|
SessionConfig::OPTIONS.each do |m|
|
99
114
|
define_method "#{m}=" do |_|
|
100
|
-
raise
|
115
|
+
raise 'Per session settings are only supported when Capybara.threadsafe == true'
|
101
116
|
end
|
102
117
|
end
|
103
118
|
end
|
@@ -5,14 +5,14 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
|
|
5
5
|
@session.visit('/with_js')
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
8
|
+
it 'should accept the alert' do
|
9
9
|
@session.accept_alert do
|
10
10
|
@session.click_link('Open alert')
|
11
11
|
end
|
12
12
|
expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
|
13
13
|
end
|
14
14
|
|
15
|
-
it
|
15
|
+
it 'should accept the alert if the text matches' do
|
16
16
|
@session.accept_alert 'Alert opened' do
|
17
17
|
@session.click_link('Open alert')
|
18
18
|
end
|
@@ -26,14 +26,14 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
|
|
26
26
|
expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
|
27
27
|
end
|
28
28
|
|
29
|
-
it
|
29
|
+
it 'should accept the alert if the text matches a regexp' do
|
30
30
|
@session.accept_alert(/op.{2}ed/) do
|
31
31
|
@session.click_link('Open alert')
|
32
32
|
end
|
33
33
|
expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
|
34
34
|
end
|
35
35
|
|
36
|
-
it
|
36
|
+
it 'should not accept the alert if the text doesnt match' do
|
37
37
|
expect do
|
38
38
|
@session.accept_alert 'Incorrect Text' do
|
39
39
|
@session.click_link('Open alert')
|
@@ -41,14 +41,14 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
|
|
41
41
|
end.to raise_error(Capybara::ModalNotFound)
|
42
42
|
end
|
43
43
|
|
44
|
-
it
|
44
|
+
it 'should return the message presented' do
|
45
45
|
message = @session.accept_alert do
|
46
46
|
@session.click_link('Open alert')
|
47
47
|
end
|
48
48
|
expect(message).to eq('Alert opened [*Yay?*]')
|
49
49
|
end
|
50
50
|
|
51
|
-
it
|
51
|
+
it 'should handle the alert if the page changes' do
|
52
52
|
@session.accept_alert do
|
53
53
|
@session.click_link('Alert page change')
|
54
54
|
sleep 1 # ensure page change occurs before the accept_alert block exits
|
@@ -56,22 +56,22 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
|
|
56
56
|
expect(@session).to have_current_path('/with_html')
|
57
57
|
end
|
58
58
|
|
59
|
-
context
|
60
|
-
it
|
59
|
+
context 'with an asynchronous alert' do
|
60
|
+
it 'should accept the alert' do
|
61
61
|
@session.accept_alert do
|
62
62
|
@session.click_link('Open delayed alert')
|
63
63
|
end
|
64
64
|
expect(@session).to have_xpath("//a[@id='open-delayed-alert' and @opened='true']")
|
65
65
|
end
|
66
66
|
|
67
|
-
it
|
67
|
+
it 'should return the message presented' do
|
68
68
|
message = @session.accept_alert do
|
69
69
|
@session.click_link('Open delayed alert')
|
70
70
|
end
|
71
71
|
expect(message).to eq('Delayed alert opened')
|
72
72
|
end
|
73
73
|
|
74
|
-
it
|
74
|
+
it 'should allow to adjust the delay' do
|
75
75
|
@session.accept_alert wait: 10 do
|
76
76
|
@session.click_link('Open slow alert')
|
77
77
|
end
|
@@ -5,21 +5,21 @@ Capybara::SpecHelper.spec '#accept_confirm', requires: [:modals] do
|
|
5
5
|
@session.visit('/with_js')
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
8
|
+
it 'should accept the confirm' do
|
9
9
|
@session.accept_confirm do
|
10
10
|
@session.click_link('Open confirm')
|
11
11
|
end
|
12
12
|
expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='true']")
|
13
13
|
end
|
14
14
|
|
15
|
-
it
|
15
|
+
it 'should return the message presented' do
|
16
16
|
message = @session.accept_confirm do
|
17
17
|
@session.click_link('Open confirm')
|
18
18
|
end
|
19
19
|
expect(message).to eq('Confirm opened')
|
20
20
|
end
|
21
21
|
|
22
|
-
it
|
22
|
+
it 'should work with nested modals' do
|
23
23
|
expect do
|
24
24
|
@session.dismiss_confirm 'Are you really sure?' do
|
25
25
|
@session.accept_confirm 'Are you sure?' do
|
@@ -5,57 +5,56 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
|
|
5
5
|
@session.visit('/with_js')
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
8
|
+
it 'should accept the prompt with no message' do
|
9
9
|
@session.accept_prompt do
|
10
10
|
@session.click_link('Open prompt')
|
11
11
|
end
|
12
12
|
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='']")
|
13
13
|
end
|
14
14
|
|
15
|
-
it
|
15
|
+
it 'should accept the prompt with no message when there is a default' do
|
16
16
|
@session.accept_prompt do
|
17
17
|
@session.click_link('Open defaulted prompt')
|
18
18
|
end
|
19
19
|
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='Default value!']")
|
20
20
|
end
|
21
21
|
|
22
|
-
it
|
22
|
+
it 'should return the message presented' do
|
23
23
|
message = @session.accept_prompt do
|
24
24
|
@session.click_link('Open prompt')
|
25
25
|
end
|
26
26
|
expect(message).to eq('Prompt opened')
|
27
27
|
end
|
28
28
|
|
29
|
-
it
|
29
|
+
it 'should accept the prompt with a response' do
|
30
30
|
@session.accept_prompt with: 'the response' do
|
31
31
|
@session.click_link('Open prompt')
|
32
32
|
end
|
33
33
|
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='the response']")
|
34
34
|
end
|
35
35
|
|
36
|
-
it
|
36
|
+
it 'should accept the prompt with a response when there is a default' do
|
37
37
|
@session.accept_prompt with: 'the response' do
|
38
38
|
@session.click_link('Open defaulted prompt')
|
39
39
|
end
|
40
40
|
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='the response']")
|
41
41
|
end
|
42
42
|
|
43
|
-
it
|
44
|
-
pending "Geckodriver doesn't set a blank response currently" if marionette?(@session)
|
43
|
+
it 'should accept the prompt with a blank response when there is a default' do
|
45
44
|
@session.accept_prompt with: '' do
|
46
45
|
@session.click_link('Open defaulted prompt')
|
47
46
|
end
|
48
47
|
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='']")
|
49
48
|
end
|
50
49
|
|
51
|
-
it
|
50
|
+
it 'should allow special characters in the reponse' do
|
52
51
|
@session.accept_prompt with: '\'the\' \b "response"' do
|
53
52
|
@session.click_link('Open prompt')
|
54
53
|
end
|
55
54
|
expect(@session).to have_xpath(%{//a[@id='open-prompt' and @response=concat("'the' ", '\\b "response"')]})
|
56
55
|
end
|
57
56
|
|
58
|
-
it
|
57
|
+
it 'should accept the prompt if the message matches' do
|
59
58
|
@session.accept_prompt 'Prompt opened', with: 'matched' do
|
60
59
|
@session.click_link('Open prompt')
|
61
60
|
end
|
@@ -70,7 +69,7 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
|
|
70
69
|
end.to raise_error(Capybara::ModalNotFound)
|
71
70
|
end
|
72
71
|
|
73
|
-
it
|
72
|
+
it 'should return the message presented' do
|
74
73
|
message = @session.accept_prompt with: 'the response' do
|
75
74
|
@session.click_link('Open prompt')
|
76
75
|
end
|
@@ -1,33 +1,34 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
Capybara::SpecHelper.spec
|
3
|
+
Capybara::SpecHelper.spec '#all' do
|
4
4
|
before do
|
5
5
|
@session.visit('/with_html')
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
8
|
+
it 'should find all elements using the given locator' do
|
9
9
|
expect(@session.all('//p').size).to eq(3)
|
10
10
|
expect(@session.all('//h1').first.text).to eq('This is a test')
|
11
11
|
expect(@session.all("//input[@id='test_field']").first.value).to eq('monkey')
|
12
12
|
end
|
13
13
|
|
14
|
-
it
|
14
|
+
it 'should return an empty array when nothing was found' do
|
15
15
|
expect(@session.all('//div[@id="nosuchthing"]')).to be_empty
|
16
16
|
end
|
17
17
|
|
18
|
-
it
|
18
|
+
it 'should wait for matching elements to appear', requires: [:js] do
|
19
|
+
Capybara.default_max_wait_time = 2
|
19
20
|
@session.visit('/with_js')
|
20
21
|
@session.click_link('Click me')
|
21
|
-
expect(@session.all(:css,
|
22
|
+
expect(@session.all(:css, 'a#has-been-clicked')).not_to be_empty
|
22
23
|
end
|
23
24
|
|
24
|
-
it
|
25
|
+
it 'should not wait if `minimum: 0` option is specified', requires: [:js] do
|
25
26
|
@session.visit('/with_js')
|
26
27
|
@session.click_link('Click me')
|
27
|
-
expect(@session.all(:css,
|
28
|
+
expect(@session.all(:css, 'a#has-been-clicked', minimum: 0)).to be_empty
|
28
29
|
end
|
29
30
|
|
30
|
-
it
|
31
|
+
it 'should accept an XPath instance', :exact_false do
|
31
32
|
@session.visit('/form')
|
32
33
|
@xpath = Capybara::Selector.all[:fillable_field].call('Name')
|
33
34
|
expect(@xpath).to be_a(::XPath::Union)
|
@@ -35,61 +36,61 @@ Capybara::SpecHelper.spec "#all" do
|
|
35
36
|
expect(@result).to include('Smith', 'John', 'John Smith')
|
36
37
|
end
|
37
38
|
|
38
|
-
it
|
39
|
-
expect { @session.all('//p', schmoo:
|
39
|
+
it 'should raise an error when given invalid options' do
|
40
|
+
expect { @session.all('//p', schmoo: 'foo') }.to raise_error(ArgumentError)
|
40
41
|
end
|
41
42
|
|
42
|
-
context
|
43
|
-
it
|
43
|
+
context 'with css selectors' do
|
44
|
+
it 'should find all elements using the given selector' do
|
44
45
|
expect(@session.all(:css, 'h1').first.text).to eq('This is a test')
|
45
46
|
expect(@session.all(:css, "input[id='test_field']").first.value).to eq('monkey')
|
46
47
|
end
|
47
48
|
|
48
|
-
it
|
49
|
+
it 'should find all elements when given a list of selectors' do
|
49
50
|
expect(@session.all(:css, 'h1, p').size).to eq(4)
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
53
|
-
context
|
54
|
-
it
|
54
|
+
context 'with xpath selectors' do
|
55
|
+
it 'should find the first element using the given locator' do
|
55
56
|
expect(@session.all(:xpath, '//h1').first.text).to eq('This is a test')
|
56
57
|
expect(@session.all(:xpath, "//input[@id='test_field']").first.value).to eq('monkey')
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
60
|
-
context
|
61
|
+
context 'with css as default selector' do
|
61
62
|
before { Capybara.default_selector = :css }
|
62
63
|
|
63
|
-
it
|
64
|
+
it 'should find the first element using the given locator' do
|
64
65
|
expect(@session.all('h1').first.text).to eq('This is a test')
|
65
66
|
expect(@session.all("input[id='test_field']").first.value).to eq('monkey')
|
66
67
|
end
|
67
68
|
end
|
68
69
|
|
69
|
-
context
|
70
|
-
it
|
71
|
-
expect(@session.all(:css,
|
70
|
+
context 'with visible filter' do
|
71
|
+
it 'should only find visible nodes when true' do
|
72
|
+
expect(@session.all(:css, 'a.simple', visible: true).size).to eq(1)
|
72
73
|
end
|
73
74
|
|
74
|
-
it
|
75
|
-
expect(@session.all(:css,
|
75
|
+
it 'should find nodes regardless of whether they are invisible when false' do
|
76
|
+
expect(@session.all(:css, 'a.simple', visible: false).size).to eq(2)
|
76
77
|
end
|
77
78
|
|
78
|
-
it
|
79
|
+
it 'should default to Capybara.ignore_hidden_elements' do
|
79
80
|
Capybara.ignore_hidden_elements = true
|
80
|
-
expect(@session.all(:css,
|
81
|
+
expect(@session.all(:css, 'a.simple').size).to eq(1)
|
81
82
|
Capybara.ignore_hidden_elements = false
|
82
|
-
expect(@session.all(:css,
|
83
|
+
expect(@session.all(:css, 'a.simple').size).to eq(2)
|
83
84
|
end
|
84
85
|
|
85
|
-
context
|
86
|
-
it
|
86
|
+
context 'with per session config', requires: [:psc] do
|
87
|
+
it 'should use the sessions ignore_hidden_elements', psc: true do
|
87
88
|
Capybara.ignore_hidden_elements = true
|
88
89
|
@session.config.ignore_hidden_elements = false
|
89
90
|
expect(Capybara.ignore_hidden_elements).to eq(true)
|
90
|
-
expect(@session.all(:css,
|
91
|
+
expect(@session.all(:css, 'a.simple').size).to eq(2)
|
91
92
|
@session.config.ignore_hidden_elements = true
|
92
|
-
expect(@session.all(:css,
|
93
|
+
expect(@session.all(:css, 'a.simple').size).to eq(1)
|
93
94
|
end
|
94
95
|
end
|
95
96
|
end
|
@@ -168,19 +169,19 @@ Capybara::SpecHelper.spec "#all" do
|
|
168
169
|
end
|
169
170
|
end
|
170
171
|
|
171
|
-
context
|
172
|
+
context 'within a scope' do
|
172
173
|
before do
|
173
174
|
@session.visit('/with_scope')
|
174
175
|
end
|
175
176
|
|
176
|
-
it
|
177
|
+
it 'should find any element using the given locator' do
|
177
178
|
@session.within(:xpath, "//div[@id='for_bar']") do
|
178
179
|
expect(@session.all('.//li').size).to eq(2)
|
179
180
|
end
|
180
181
|
end
|
181
182
|
end
|
182
183
|
|
183
|
-
it
|
184
|
+
it 'should have #find_all as an alias' do
|
184
185
|
expect(Capybara::Node::Finders.instance_method(:all)).to eq Capybara::Node::Finders.instance_method(:find_all)
|
185
186
|
expect(@session.find_all('//p').size).to eq(3)
|
186
187
|
end
|
@@ -9,64 +9,64 @@ Capybara::SpecHelper.spec '#ancestor' do
|
|
9
9
|
Capybara::Selector.remove(:monkey)
|
10
10
|
end
|
11
11
|
|
12
|
-
it
|
12
|
+
it 'should find the ancestor element using the given locator' do
|
13
13
|
el = @session.find(:css, '#first_image')
|
14
14
|
expect(el.ancestor('//p')).to have_text('Lorem ipsum dolor')
|
15
|
-
expect(el.ancestor(
|
15
|
+
expect(el.ancestor('//a')[:'aria-label']).to eq('Go to simple')
|
16
16
|
end
|
17
17
|
|
18
|
-
it
|
18
|
+
it 'should find the ancestor element using the given locator and options' do
|
19
19
|
el = @session.find(:css, '#child')
|
20
20
|
expect(el.ancestor('//div', text: "Ancestor\nAncestor\nAncestor")[:id]).to eq('ancestor3')
|
21
21
|
end
|
22
22
|
|
23
|
-
it
|
23
|
+
it 'should raise an error if there are multiple matches' do
|
24
24
|
el = @session.find(:css, '#child')
|
25
25
|
expect { el.ancestor('//div') }.to raise_error(Capybara::Ambiguous)
|
26
26
|
expect { el.ancestor('//div', text: 'Ancestor') }.to raise_error(Capybara::Ambiguous)
|
27
27
|
end
|
28
28
|
|
29
|
-
context
|
30
|
-
it
|
29
|
+
context 'with css selectors' do
|
30
|
+
it 'should find the first element using the given locator' do
|
31
31
|
el = @session.find(:css, '#first_image')
|
32
32
|
expect(el.ancestor(:css, 'p')).to have_text('Lorem ipsum dolor')
|
33
33
|
expect(el.ancestor(:css, 'a')[:'aria-label']).to eq('Go to simple')
|
34
34
|
end
|
35
35
|
|
36
|
-
it
|
36
|
+
it 'should support pseudo selectors' do
|
37
37
|
el = @session.find(:css, '#button_img')
|
38
38
|
expect(el.ancestor(:css, 'button:disabled')[:id]).to eq('ancestor_button')
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
context
|
43
|
-
it
|
42
|
+
context 'with xpath selectors' do
|
43
|
+
it 'should find the first element using the given locator' do
|
44
44
|
el = @session.find(:css, '#first_image')
|
45
45
|
expect(el.ancestor(:xpath, '//p')).to have_text('Lorem ipsum dolor')
|
46
|
-
expect(el.ancestor(:xpath,
|
46
|
+
expect(el.ancestor(:xpath, '//a')[:'aria-label']).to eq('Go to simple')
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
context
|
51
|
-
it
|
50
|
+
context 'with custom selector' do
|
51
|
+
it 'should use the custom selector' do
|
52
52
|
Capybara.add_selector(:level) do
|
53
53
|
xpath { |num| ".//*[@id='ancestor#{num}']" }
|
54
54
|
end
|
55
55
|
el = @session.find(:css, '#child')
|
56
|
-
expect(el.ancestor(:level, 1)[:id]).to eq
|
57
|
-
expect(el.ancestor(:level, 3)[:id]).to eq
|
56
|
+
expect(el.ancestor(:level, 1)[:id]).to eq 'ancestor1'
|
57
|
+
expect(el.ancestor(:level, 3)[:id]).to eq 'ancestor3'
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
it
|
61
|
+
it 'should raise ElementNotFound with a useful default message if nothing was found' do
|
62
62
|
el = @session.find(:css, '#child')
|
63
63
|
expect do
|
64
64
|
el.ancestor(:xpath, '//div[@id="nosuchthing"]')
|
65
|
-
end.to raise_error(Capybara::ElementNotFound,
|
65
|
+
end.to raise_error(Capybara::ElementNotFound, 'Unable to find xpath "//div[@id=\\"nosuchthing\\"]" that is an ancestor of visible css "#child"')
|
66
66
|
end
|
67
67
|
|
68
|
-
context
|
69
|
-
it
|
68
|
+
context 'within a scope' do
|
69
|
+
it 'should limit the ancestors to inside the scope' do
|
70
70
|
@session.within(:css, '#ancestor2') do
|
71
71
|
el = @session.find(:css, '#child')
|
72
72
|
expect(el.ancestor(:css, 'div', text: 'Ancestor')[:id]).to eq('ancestor1')
|
@@ -74,7 +74,7 @@ Capybara::SpecHelper.spec '#ancestor' do
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
it
|
77
|
+
it 'should raise if selector type is unknown' do
|
78
78
|
el = @session.find(:css, '#child')
|
79
79
|
expect do
|
80
80
|
el.ancestor(:unknown, '//h1')
|