capybara 3.3.1 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/spec/rspec/views_spec.rb
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
RSpec.describe
|
6
|
-
it
|
5
|
+
RSpec.describe 'capybara/rspec', type: :view do
|
6
|
+
it 'allows matchers to be used on strings' do
|
7
7
|
html = %(<h1>Test header</h1>)
|
8
|
-
expect(html).to have_css(
|
8
|
+
expect(html).to have_css('h1', text: 'Test header')
|
9
9
|
end
|
10
10
|
|
11
11
|
it "doesn't include RSpecMatcherProxies" do
|
data/spec/rspec_matchers_spec.rb
CHANGED
@@ -3,22 +3,22 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe 'Capybara RSpec Matchers', type: :feature do
|
6
|
-
context
|
7
|
-
it
|
6
|
+
context 'after called on session' do
|
7
|
+
it 'HaveSelector should allow getting a description of the matcher' do
|
8
8
|
visit('/with_html')
|
9
9
|
matcher = have_selector(:css, 'h2.head', minimum: 3)
|
10
10
|
expect(page).to matcher
|
11
11
|
expect { matcher.description }.not_to raise_error
|
12
12
|
end
|
13
13
|
|
14
|
-
it
|
14
|
+
it 'HaveText should allow getting a description' do
|
15
15
|
visit('/with_html')
|
16
|
-
matcher = have_text(
|
16
|
+
matcher = have_text('Lorem')
|
17
17
|
expect(page).to matcher
|
18
18
|
expect { matcher.description }.not_to raise_error
|
19
19
|
end
|
20
20
|
|
21
|
-
it
|
21
|
+
it 'should produce the same error for .to have_no_xxx and .not_to have_xxx' do
|
22
22
|
visit('/with_html')
|
23
23
|
not_to_msg = error_msg_for { expect(page).not_to have_selector(:css, '#referrer') }
|
24
24
|
have_no_msg = error_msg_for { expect(page).to have_no_selector(:css, '#referrer') }
|
@@ -30,8 +30,8 @@ RSpec.describe 'Capybara RSpec Matchers', type: :feature do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
context
|
34
|
-
it
|
33
|
+
context 'after called on element' do
|
34
|
+
it 'HaveSelector should allow getting a description' do
|
35
35
|
visit('/with_html')
|
36
36
|
el = find(:css, '#first')
|
37
37
|
matcher = have_selector(:css, 'a#foo')
|
@@ -39,7 +39,7 @@ RSpec.describe 'Capybara RSpec Matchers', type: :feature do
|
|
39
39
|
expect { matcher.description }.not_to raise_error
|
40
40
|
end
|
41
41
|
|
42
|
-
it
|
42
|
+
it 'MatchSelector should allow getting a description' do
|
43
43
|
visit('/with_html')
|
44
44
|
el = find(:css, '#first')
|
45
45
|
matcher = match_selector(:css, '#first')
|
@@ -47,10 +47,10 @@ RSpec.describe 'Capybara RSpec Matchers', type: :feature do
|
|
47
47
|
expect { matcher.description }.not_to raise_error
|
48
48
|
end
|
49
49
|
|
50
|
-
it
|
50
|
+
it 'HaveText should allow getting a description' do
|
51
51
|
visit('/with_html')
|
52
52
|
el = find(:css, '#first')
|
53
|
-
matcher = have_text(
|
53
|
+
matcher = have_text('Lorem')
|
54
54
|
expect(el).to matcher
|
55
55
|
expect { matcher.description }.not_to raise_error
|
56
56
|
end
|
data/spec/rspec_spec.rb
CHANGED
@@ -3,69 +3,69 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe 'capybara/rspec' do
|
6
|
-
context
|
7
|
-
it
|
6
|
+
context 'Feature', type: :feature do
|
7
|
+
it 'should include Capybara in rspec' do
|
8
8
|
visit('/foo')
|
9
9
|
expect(page.body).to include('Another World')
|
10
10
|
end
|
11
11
|
|
12
|
-
it
|
12
|
+
it 'should include RSpec matcher proxies' do
|
13
13
|
expect(self.class.ancestors).to include Capybara::RSpecMatcherProxies
|
14
14
|
end
|
15
15
|
|
16
|
-
context
|
17
|
-
it
|
16
|
+
context 'resetting session' do
|
17
|
+
it 'sets a cookie in one example...' do
|
18
18
|
visit('/set_cookie')
|
19
19
|
expect(page.body).to include('Cookie set to test_cookie')
|
20
20
|
end
|
21
21
|
|
22
|
-
it
|
22
|
+
it '...then it is not available in the next' do
|
23
23
|
visit('/get_cookie')
|
24
24
|
expect(page.body).not_to include('test_cookie')
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
context
|
29
|
-
it
|
28
|
+
context 'setting the current driver' do
|
29
|
+
it 'sets the current driver in one example...' do
|
30
30
|
Capybara.current_driver = :selenium
|
31
31
|
end
|
32
32
|
|
33
|
-
it
|
33
|
+
it '...then it has returned to the default in the next example' do
|
34
34
|
expect(Capybara.current_driver).to eq(:rack_test)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
it
|
38
|
+
it 'switches to the javascript driver when giving it as metadata', js: true do
|
39
39
|
expect(Capybara.current_driver).to eq(Capybara.javascript_driver)
|
40
40
|
end
|
41
41
|
|
42
|
-
it
|
42
|
+
it 'switches to the given driver when giving it as metadata', driver: :culerity do
|
43
43
|
expect(Capybara.current_driver).to eq(:culerity)
|
44
44
|
end
|
45
45
|
|
46
|
-
context
|
47
|
-
it
|
46
|
+
context '#all' do
|
47
|
+
it 'allows access to the Capybara finder' do
|
48
48
|
visit('/with_html')
|
49
49
|
found = all(:css, 'h2') { |element| element[:class] == 'head' }
|
50
50
|
expect(found.size).to eq(5)
|
51
51
|
end
|
52
52
|
|
53
|
-
it
|
53
|
+
it 'allows access to the RSpec matcher' do
|
54
54
|
visit('/with_html')
|
55
55
|
strings = %w[test1 test2]
|
56
56
|
expect(strings).to all(be_a(String))
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
context
|
61
|
-
it
|
60
|
+
context '#within' do
|
61
|
+
it 'allows access to the Capybara scoper' do
|
62
62
|
visit('/with_html')
|
63
63
|
expect do
|
64
|
-
within(:css,
|
64
|
+
within(:css, '#does_not_exist') { click_link 'Go to simple' }
|
65
65
|
end.to raise_error(Capybara::ElementNotFound)
|
66
66
|
end
|
67
67
|
|
68
|
-
it
|
68
|
+
it 'allows access to the RSpec matcher' do
|
69
69
|
visit('/with_html')
|
70
70
|
# This reads terribly, but must call #within
|
71
71
|
expect(find(:css, 'span.number').text.to_i).to within(1).of(41)
|
@@ -74,7 +74,7 @@ RSpec.describe 'capybara/rspec' do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
context 'Type: Other', type: :other do
|
77
|
-
context
|
77
|
+
context 'when RSpec::Matchers is included after Capybara::DSL' do
|
78
78
|
before do
|
79
79
|
class DSLMatchersTest
|
80
80
|
include Capybara::DSL
|
@@ -84,28 +84,28 @@ RSpec.describe 'capybara/rspec' do
|
|
84
84
|
@test_class_instance = DSLMatchersTest.new
|
85
85
|
end
|
86
86
|
|
87
|
-
context
|
88
|
-
it
|
87
|
+
context '#all' do
|
88
|
+
it 'allows access to the Capybara finder' do
|
89
89
|
@test_class_instance.visit('/with_html')
|
90
90
|
expect(@test_class_instance.all(:css, 'h2.head').size).to eq(5)
|
91
91
|
end
|
92
92
|
|
93
|
-
it
|
93
|
+
it 'allows access to the RSpec matcher' do
|
94
94
|
@test_class_instance.visit('/with_html')
|
95
95
|
strings = %w[test1 test2]
|
96
96
|
expect(strings).to @test_class_instance.all(be_a(String))
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
context
|
101
|
-
it
|
100
|
+
context '#within' do
|
101
|
+
it 'allows access to the Capybara scoper' do
|
102
102
|
@test_class_instance.visit('/with_html')
|
103
103
|
expect do
|
104
|
-
@test_class_instance.within(:css,
|
104
|
+
@test_class_instance.within(:css, '#does_not_exist') { @test_class_instance.click_link 'Go to simple' }
|
105
105
|
end.to raise_error(Capybara::ElementNotFound)
|
106
106
|
end
|
107
107
|
|
108
|
-
it
|
108
|
+
it 'allows access to the RSpec matcher' do
|
109
109
|
@test_class_instance.visit('/with_html')
|
110
110
|
# This reads terribly, but must call #within
|
111
111
|
expect(@test_class_instance.find(:css, 'span.number').text.to_i).to @test_class_instance.within(1).of(41)
|
@@ -113,14 +113,14 @@ RSpec.describe 'capybara/rspec' do
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
it
|
116
|
+
it 'should not include Capybara' do
|
117
117
|
expect { visit('/') }.to raise_error(NoMethodError)
|
118
118
|
end
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
|
-
feature
|
123
|
-
scenario
|
122
|
+
feature 'Feature DSL' do
|
123
|
+
scenario 'is pulled in' do
|
124
124
|
visit('/foo')
|
125
125
|
expect(page.body).to include('Another World')
|
126
126
|
end
|
data/spec/selector_spec.rb
CHANGED
@@ -61,17 +61,17 @@ RSpec.describe Capybara do
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
-
it
|
64
|
+
it 'supports `filter` as an alias for `node_filter`' do
|
65
65
|
expect do
|
66
66
|
Capybara.add_selector :filter_alias_selector do
|
67
|
-
css { |_unused|
|
67
|
+
css { |_unused| 'div' }
|
68
68
|
filter(:something) { |_node, _value| true }
|
69
69
|
end
|
70
70
|
end.not_to raise_error
|
71
71
|
end
|
72
72
|
|
73
|
-
describe
|
74
|
-
it
|
73
|
+
describe 'adding a selector' do
|
74
|
+
it 'can set default visiblity' do
|
75
75
|
Capybara.add_selector :hidden_field do
|
76
76
|
visible :hidden
|
77
77
|
css { |_sel| 'input[type="hidden"]' }
|
@@ -82,8 +82,8 @@ RSpec.describe Capybara do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
describe
|
86
|
-
it
|
85
|
+
describe 'modify_selector' do
|
86
|
+
it 'allows modifying a selector' do
|
87
87
|
el = string.find(:custom_selector, 'a')
|
88
88
|
expect(el.tag_name).to eq 'div'
|
89
89
|
Capybara.modify_selector :custom_selector do
|
@@ -103,21 +103,21 @@ RSpec.describe Capybara do
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
describe
|
107
|
-
context
|
108
|
-
it
|
106
|
+
describe 'builtin selectors' do
|
107
|
+
context 'when locator is nil' do
|
108
|
+
it 'devolves to just finding element types' do
|
109
109
|
selectors = {
|
110
110
|
field: ".//*[self::input | self::textarea | self::select][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'hidden')]",
|
111
|
-
fieldset:
|
112
|
-
link:
|
111
|
+
fieldset: './/fieldset',
|
112
|
+
link: './/a[./@href]',
|
113
113
|
link_or_button: ".//a[./@href] | .//input[./@type = 'submit' or ./@type = 'reset' or ./@type = 'image' or ./@type = 'button'] | .//button",
|
114
114
|
fillable_field: ".//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')]",
|
115
115
|
radio_button: ".//input[./@type = 'radio']",
|
116
116
|
checkbox: ".//input[./@type = 'checkbox']",
|
117
|
-
select:
|
118
|
-
option:
|
117
|
+
select: './/select',
|
118
|
+
option: './/option',
|
119
119
|
file_field: ".//input[./@type = 'file']",
|
120
|
-
table:
|
120
|
+
table: './/table'
|
121
121
|
}
|
122
122
|
selectors.each do |selector, xpath|
|
123
123
|
results = string.all(selector, nil).to_a.map(&:native)
|
@@ -127,53 +127,53 @@ RSpec.describe Capybara do
|
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
130
|
-
context
|
131
|
-
it
|
132
|
-
expect(string.all(:custom_css_selector,
|
133
|
-
expect(string.all(:custom_css_selector,
|
130
|
+
context 'with :id option' do
|
131
|
+
it 'works with compound css selectors' do
|
132
|
+
expect(string.all(:custom_css_selector, 'div, h1', id: 'page').size).to eq 1
|
133
|
+
expect(string.all(:custom_css_selector, 'h1, div', id: 'page').size).to eq 1
|
134
134
|
end
|
135
135
|
|
136
136
|
it "works with 'special' characters" do
|
137
|
-
expect(string.find(:custom_css_selector,
|
138
|
-
expect(string.find(:custom_css_selector,
|
137
|
+
expect(string.find(:custom_css_selector, 'div', id: '#special')[:id]).to eq '#special'
|
138
|
+
expect(string.find(:custom_css_selector, 'input', id: '2checkbox')[:id]).to eq '2checkbox'
|
139
139
|
end
|
140
140
|
|
141
|
-
it
|
141
|
+
it 'accepts XPath expression for xpath based selectors' do
|
142
142
|
expect(string.find(:custom_xpath_selector, './/div', id: XPath.contains('peci'))[:id]).to eq '#special'
|
143
143
|
expect(string.find(:custom_xpath_selector, './/input', id: XPath.ends_with('box'))[:id]).to eq '2checkbox'
|
144
144
|
end
|
145
145
|
|
146
|
-
it
|
147
|
-
expect { string.find(:custom_css_selector,
|
146
|
+
it 'errors XPath expression for CSS based selectors' do
|
147
|
+
expect { string.find(:custom_css_selector, 'div', id: XPath.contains('peci')) }
|
148
148
|
.to raise_error(ArgumentError, /not supported/)
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
152
|
-
context
|
153
|
-
it
|
154
|
-
expect(string.all(:custom_css_selector,
|
155
|
-
expect(string.all(:custom_css_selector,
|
152
|
+
context 'with :class option' do
|
153
|
+
it 'works with compound css selectors' do
|
154
|
+
expect(string.all(:custom_css_selector, 'div, h1', class: 'a').size).to eq 2
|
155
|
+
expect(string.all(:custom_css_selector, 'h1, div', class: 'a').size).to eq 2
|
156
156
|
end
|
157
157
|
|
158
|
-
it
|
159
|
-
expect(string.all(:custom_css_selector,
|
160
|
-
expect(string.all(:custom_css_selector,
|
158
|
+
it 'handles negated classes' do
|
159
|
+
expect(string.all(:custom_css_selector, 'div, p', class: ['b', '!c']).size).to eq 2
|
160
|
+
expect(string.all(:custom_css_selector, 'div, p', class: ['!c', '!d', 'b']).size).to eq 1
|
161
161
|
expect(string.all(:custom_xpath_selector, XPath.descendant(:div, :p), class: ['b', '!c']).size).to eq 2
|
162
162
|
expect(string.all(:custom_xpath_selector, XPath.descendant(:div, :p), class: ['!c', '!d', 'b']).size).to eq 1
|
163
163
|
end
|
164
164
|
|
165
165
|
it "works with 'special' characters" do
|
166
|
-
expect(string.find(:custom_css_selector,
|
167
|
-
expect(string.find(:custom_css_selector,
|
166
|
+
expect(string.find(:custom_css_selector, 'input', class: '.special')[:id]).to eq 'file'
|
167
|
+
expect(string.find(:custom_css_selector, 'input', class: '2checkbox')[:id]).to eq '2checkbox'
|
168
168
|
end
|
169
169
|
|
170
|
-
it
|
170
|
+
it 'accepts XPath expression for xpath based selectors' do
|
171
171
|
expect(string.find(:custom_xpath_selector, './/div', class: XPath.contains('dom wor'))[:id]).to eq 'random_words'
|
172
172
|
expect(string.find(:custom_xpath_selector, './/div', class: XPath.ends_with('words'))[:id]).to eq 'random_words'
|
173
173
|
end
|
174
174
|
|
175
|
-
it
|
176
|
-
expect { string.find(:custom_css_selector,
|
175
|
+
it 'errors XPath expression for CSS based selectors' do
|
176
|
+
expect { string.find(:custom_css_selector, 'div', class: XPath.contains('random')) }
|
177
177
|
.to raise_error(ArgumentError, /not supported/)
|
178
178
|
end
|
179
179
|
end
|
@@ -181,96 +181,96 @@ RSpec.describe Capybara do
|
|
181
181
|
# :css, :xpath, :id, :field, :fieldset, :link, :button, :link_or_button, :fillable_field, :radio_button, :checkbox, :select,
|
182
182
|
# :option, :file_field, :label, :table, :frame
|
183
183
|
|
184
|
-
describe
|
185
|
-
it
|
186
|
-
expect(string.find(:css,
|
184
|
+
describe ':css selector' do
|
185
|
+
it 'finds by CSS locator' do
|
186
|
+
expect(string.find(:css, 'input#my_text_input')[:name]).to eq 'form[my_text_input]'
|
187
187
|
end
|
188
188
|
end
|
189
189
|
|
190
|
-
describe
|
191
|
-
it
|
190
|
+
describe ':xpath selector' do
|
191
|
+
it 'finds by XPath locator' do
|
192
192
|
expect(string.find(:xpath, './/input[@id="my_text_input"]')[:name]).to eq 'form[my_text_input]'
|
193
193
|
end
|
194
194
|
end
|
195
195
|
|
196
|
-
describe
|
197
|
-
it
|
198
|
-
expect(string.find(:id,
|
196
|
+
describe ':id selector' do
|
197
|
+
it 'finds by locator' do
|
198
|
+
expect(string.find(:id, 'my_text_input')[:name]).to eq 'form[my_text_input]'
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
|
-
describe
|
203
|
-
it
|
202
|
+
describe ':field selector' do
|
203
|
+
it 'finds by locator' do
|
204
204
|
expect(string.find(:field, 'My Text Input')[:id]).to eq 'my_text_input'
|
205
205
|
expect(string.find(:field, 'my_text_input')[:id]).to eq 'my_text_input'
|
206
206
|
expect(string.find(:field, 'form[my_text_input]')[:id]).to eq 'my_text_input'
|
207
207
|
end
|
208
208
|
|
209
|
-
it
|
209
|
+
it 'finds by id' do
|
210
210
|
expect(string.find(:field, id: 'my_text_input')[:name]).to eq 'form[my_text_input]'
|
211
211
|
end
|
212
212
|
|
213
|
-
it
|
213
|
+
it 'finds by name' do
|
214
214
|
expect(string.find(:field, name: 'form[my_text_input]')[:id]).to eq 'my_text_input'
|
215
215
|
end
|
216
216
|
|
217
|
-
it
|
217
|
+
it 'finds by placeholder' do
|
218
218
|
expect(string.find(:field, placeholder: 'my text')[:id]).to eq 'my_text_input'
|
219
219
|
end
|
220
220
|
|
221
|
-
it
|
221
|
+
it 'finds by type' do
|
222
222
|
expect(string.find(:field, type: 'file')[:id]).to eq 'file'
|
223
223
|
expect(string.find(:field, type: 'select')[:id]).to eq 'select'
|
224
224
|
end
|
225
225
|
end
|
226
226
|
|
227
|
-
describe
|
228
|
-
it
|
227
|
+
describe ':option selector' do
|
228
|
+
it 'finds disabled options' do
|
229
229
|
expect(string.find(:option, disabled: true).value).to eq 'b'
|
230
230
|
end
|
231
231
|
|
232
|
-
it
|
232
|
+
it 'finds selected options' do
|
233
233
|
expect(string.find(:option, selected: true).value).to eq 'c'
|
234
234
|
end
|
235
235
|
|
236
|
-
it
|
236
|
+
it 'finds not selected and not disabled options' do
|
237
237
|
expect(string.find(:option, disabled: false, selected: false).value).to eq 'a'
|
238
238
|
end
|
239
239
|
end
|
240
240
|
|
241
|
-
describe
|
242
|
-
it
|
241
|
+
describe ':button selector' do
|
242
|
+
it 'finds by value' do
|
243
243
|
expect(string.find(:button, 'click me').value).to eq 'click me'
|
244
244
|
end
|
245
245
|
|
246
|
-
it
|
246
|
+
it 'finds by title' do
|
247
247
|
expect(string.find(:button, 'submit button').value).to eq 'click me'
|
248
248
|
end
|
249
249
|
|
250
|
-
it
|
250
|
+
it 'includes non-matching parameters in failure message' do
|
251
251
|
expect { string.find(:button, 'click me', title: 'click me') }.to raise_error(/with title click me/)
|
252
252
|
end
|
253
253
|
end
|
254
254
|
|
255
|
-
describe
|
256
|
-
it
|
255
|
+
describe ':element selector' do
|
256
|
+
it 'finds by any attributes' do
|
257
257
|
expect(string.find(:element, 'input', type: 'submit').value).to eq 'click me'
|
258
258
|
end
|
259
259
|
|
260
|
-
it
|
260
|
+
it 'still works with system keys' do
|
261
261
|
expect { string.all(:element, 'input', type: 'submit', count: 1) }.not_to raise_error
|
262
262
|
end
|
263
263
|
|
264
|
-
it
|
264
|
+
it 'includes wildcarded keys in description' do
|
265
265
|
expect { string.find(:element, 'input', not_there: 'bad', count: 1) }
|
266
266
|
.to(raise_error do |e|
|
267
267
|
expect(e).to be_a(Capybara::ElementNotFound)
|
268
|
-
expect(e.message).to include
|
269
|
-
expect(e.message).not_to include
|
268
|
+
expect(e.message).to include 'not_there => bad'
|
269
|
+
expect(e.message).not_to include 'count 1'
|
270
270
|
end)
|
271
271
|
end
|
272
272
|
|
273
|
-
it
|
273
|
+
it 'accepts XPath::Expression' do
|
274
274
|
expect(string.find(:element, 'input', type: XPath.starts_with('subm')).value).to eq 'click me'
|
275
275
|
expect(string.find(:element, 'input', type: XPath.ends_with('ext'))[:type]).to eq 'text'
|
276
276
|
expect(string.find(:element, 'input', type: XPath.contains('ckb'))[:type]).to eq 'checkbox'
|