capybara 2.5.0 → 2.18.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 +5 -5
- data/.yard/templates_custom/default/class/html/selectors.erb +38 -0
- data/.yard/templates_custom/default/class/html/setup.rb +17 -0
- data/.yard/yard_extensions.rb +78 -0
- data/.yardopts +1 -0
- data/History.md +413 -10
- data/License.txt +1 -1
- data/README.md +237 -130
- data/lib/capybara/config.rb +132 -0
- data/lib/capybara/cucumber.rb +3 -1
- data/lib/capybara/driver/base.rb +27 -6
- data/lib/capybara/driver/node.rb +14 -5
- data/lib/capybara/dsl.rb +2 -3
- data/lib/capybara/helpers.rb +13 -65
- data/lib/capybara/minitest/spec.rb +177 -0
- data/lib/capybara/minitest.rb +278 -0
- data/lib/capybara/node/actions.rb +180 -24
- data/lib/capybara/node/base.rb +17 -5
- data/lib/capybara/node/document.rb +5 -0
- data/lib/capybara/node/document_matchers.rb +15 -14
- data/lib/capybara/node/element.rb +55 -7
- data/lib/capybara/node/finders.rb +179 -67
- data/lib/capybara/node/matchers.rb +301 -105
- data/lib/capybara/node/simple.rb +15 -4
- data/lib/capybara/queries/ancestor_query.rb +25 -0
- data/lib/capybara/queries/base_query.rb +69 -3
- data/lib/capybara/queries/current_path_query.rb +17 -8
- data/lib/capybara/queries/match_query.rb +19 -0
- data/lib/capybara/queries/selector_query.rb +251 -0
- data/lib/capybara/queries/sibling_query.rb +25 -0
- data/lib/capybara/queries/text_query.rb +67 -16
- data/lib/capybara/queries/title_query.rb +4 -2
- data/lib/capybara/query.rb +3 -131
- data/lib/capybara/rack_test/browser.rb +14 -5
- data/lib/capybara/rack_test/css_handlers.rb +1 -0
- data/lib/capybara/rack_test/driver.rb +15 -8
- data/lib/capybara/rack_test/form.rb +34 -12
- data/lib/capybara/rack_test/node.rb +29 -12
- data/lib/capybara/rails.rb +3 -3
- data/lib/capybara/result.rb +104 -9
- data/lib/capybara/rspec/compound.rb +95 -0
- data/lib/capybara/rspec/features.rb +17 -6
- data/lib/capybara/rspec/matcher_proxies.rb +45 -0
- data/lib/capybara/rspec/matchers.rb +199 -80
- data/lib/capybara/rspec.rb +4 -2
- data/lib/capybara/selector/css.rb +30 -0
- data/lib/capybara/selector/filter.rb +20 -0
- data/lib/capybara/selector/filter_set.rb +74 -0
- data/lib/capybara/selector/filters/base.rb +33 -0
- data/lib/capybara/selector/filters/expression_filter.rb +40 -0
- data/lib/capybara/selector/filters/node_filter.rb +27 -0
- data/lib/capybara/selector/selector.rb +276 -0
- data/lib/capybara/selector.rb +452 -157
- data/lib/capybara/selenium/driver.rb +282 -81
- data/lib/capybara/selenium/node.rb +144 -46
- data/lib/capybara/server.rb +59 -16
- data/lib/capybara/session/config.rb +114 -0
- data/lib/capybara/session/matchers.rb +29 -19
- data/lib/capybara/session.rb +378 -143
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- data/lib/capybara/spec/public/jquery-ui.js +13 -791
- data/lib/capybara/spec/public/jquery.js +4 -9045
- data/lib/capybara/spec/public/test.js +45 -11
- data/lib/capybara/spec/session/accept_alert_spec.rb +30 -7
- data/lib/capybara/spec/session/accept_confirm_spec.rb +14 -2
- data/lib/capybara/spec/session/accept_prompt_spec.rb +35 -6
- data/lib/capybara/spec/session/all_spec.rb +45 -32
- data/lib/capybara/spec/session/ancestor_spec.rb +85 -0
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +110 -0
- data/lib/capybara/spec/session/assert_current_path.rb +15 -2
- data/lib/capybara/spec/session/assert_selector.rb +29 -28
- data/lib/capybara/spec/session/assert_text.rb +59 -20
- data/lib/capybara/spec/session/assert_title.rb +25 -11
- data/lib/capybara/spec/session/attach_file_spec.rb +42 -4
- data/lib/capybara/spec/session/body_spec.rb +1 -0
- data/lib/capybara/spec/session/check_spec.rb +90 -14
- data/lib/capybara/spec/session/choose_spec.rb +31 -5
- data/lib/capybara/spec/session/click_button_spec.rb +20 -9
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +15 -9
- data/lib/capybara/spec/session/click_link_spec.rb +39 -15
- data/lib/capybara/spec/session/current_scope_spec.rb +2 -1
- data/lib/capybara/spec/session/current_url_spec.rb +12 -3
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +6 -5
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +4 -3
- data/lib/capybara/spec/session/element/assert_match_selector.rb +36 -0
- data/lib/capybara/spec/session/element/match_css_spec.rb +23 -0
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +23 -0
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +106 -0
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +22 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +23 -1
- data/lib/capybara/spec/session/execute_script_spec.rb +22 -3
- data/lib/capybara/spec/session/fill_in_spec.rb +50 -32
- data/lib/capybara/spec/session/find_button_spec.rb +43 -2
- data/lib/capybara/spec/session/find_by_id_spec.rb +3 -2
- data/lib/capybara/spec/session/find_field_spec.rb +42 -6
- data/lib/capybara/spec/session/find_link_spec.rb +22 -3
- data/lib/capybara/spec/session/find_spec.rb +103 -57
- data/lib/capybara/spec/session/first_spec.rb +34 -18
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +103 -0
- data/lib/capybara/spec/session/{within_frame_spec.rb → frame/within_frame_spec.rb} +44 -2
- data/lib/capybara/spec/session/go_back_spec.rb +2 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/lib/capybara/spec/session/has_button_spec.rb +17 -8
- data/lib/capybara/spec/session/has_css_spec.rb +85 -73
- data/lib/capybara/spec/session/has_current_path_spec.rb +91 -7
- data/lib/capybara/spec/session/has_field_spec.rb +93 -58
- data/lib/capybara/spec/session/has_link_spec.rb +9 -8
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +76 -0
- data/lib/capybara/spec/session/has_select_spec.rb +159 -59
- data/lib/capybara/spec/session/has_selector_spec.rb +64 -28
- data/lib/capybara/spec/session/has_table_spec.rb +1 -0
- data/lib/capybara/spec/session/has_text_spec.rb +27 -12
- data/lib/capybara/spec/session/has_title_spec.rb +22 -4
- data/lib/capybara/spec/session/has_xpath_spec.rb +32 -29
- data/lib/capybara/spec/session/headers.rb +2 -1
- data/lib/capybara/spec/session/html_spec.rb +4 -3
- data/lib/capybara/spec/session/node_spec.rb +198 -38
- data/lib/capybara/spec/session/refresh_spec.rb +28 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +46 -5
- data/lib/capybara/spec/session/response_code.rb +2 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -5
- data/lib/capybara/spec/session/save_page_spec.rb +34 -2
- data/lib/capybara/spec/session/save_screenshot_spec.rb +31 -1
- data/lib/capybara/spec/session/screenshot_spec.rb +4 -2
- data/lib/capybara/spec/session/select_spec.rb +34 -32
- data/lib/capybara/spec/session/selectors_spec.rb +65 -0
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/text_spec.rb +4 -4
- data/lib/capybara/spec/session/title_spec.rb +2 -1
- data/lib/capybara/spec/session/uncheck_spec.rb +42 -2
- data/lib/capybara/spec/session/unselect_spec.rb +17 -16
- data/lib/capybara/spec/session/visit_spec.rb +77 -2
- data/lib/capybara/spec/session/window/become_closed_spec.rb +12 -11
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +16 -11
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +7 -4
- data/lib/capybara/spec/session/window/window_spec.rb +36 -29
- data/lib/capybara/spec/session/window/windows_spec.rb +1 -0
- data/lib/capybara/spec/session/window/within_window_spec.rb +31 -7
- data/lib/capybara/spec/session/within_spec.rb +14 -6
- data/lib/capybara/spec/spec_helper.rb +37 -4
- data/lib/capybara/spec/test_app.rb +15 -3
- data/lib/capybara/spec/views/buttons.erb +1 -0
- data/lib/capybara/spec/views/fieldsets.erb +2 -1
- data/lib/capybara/spec/views/form.erb +169 -9
- data/lib/capybara/spec/views/frame_child.erb +10 -2
- data/lib/capybara/spec/views/frame_one.erb +2 -1
- data/lib/capybara/spec/views/frame_parent.erb +3 -2
- data/lib/capybara/spec/views/frame_two.erb +2 -1
- data/lib/capybara/spec/views/header_links.erb +1 -0
- data/lib/capybara/spec/views/host_links.erb +1 -0
- data/lib/capybara/spec/views/initial_alert.erb +10 -0
- data/lib/capybara/spec/views/path.erb +1 -0
- data/lib/capybara/spec/views/popup_one.erb +1 -0
- data/lib/capybara/spec/views/popup_two.erb +1 -0
- data/lib/capybara/spec/views/postback.erb +2 -1
- data/lib/capybara/spec/views/tables.erb +1 -0
- data/lib/capybara/spec/views/with_base_tag.erb +1 -0
- data/lib/capybara/spec/views/with_count.erb +2 -1
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +7 -1
- data/lib/capybara/spec/views/with_html.erb +40 -2
- data/lib/capybara/spec/views/with_html_entities.erb +1 -0
- data/lib/capybara/spec/views/with_js.erb +32 -1
- data/lib/capybara/spec/views/with_scope.erb +1 -0
- data/lib/capybara/spec/views/with_simple_html.erb +2 -1
- data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
- data/lib/capybara/spec/views/with_title.erb +2 -1
- data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
- data/lib/capybara/spec/views/with_windows.erb +7 -0
- data/lib/capybara/spec/views/within_frames.erb +3 -2
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +20 -3
- data/lib/capybara.rb +189 -93
- data/spec/basic_node_spec.rb +7 -6
- data/spec/capybara_spec.rb +90 -4
- data/spec/dsl_spec.rb +3 -1
- data/spec/filter_set_spec.rb +28 -0
- data/spec/fixtures/capybara.csv +1 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +5 -1
- data/spec/minitest_spec.rb +130 -0
- data/spec/minitest_spec_spec.rb +135 -0
- data/spec/per_session_config_spec.rb +67 -0
- data/spec/rack_test_spec.rb +50 -7
- data/spec/result_spec.rb +76 -0
- data/spec/rspec/features_spec.rb +21 -8
- data/spec/rspec/scenarios_spec.rb +21 -0
- data/spec/rspec/{matchers_spec.rb → shared_spec_matchers.rb} +160 -54
- data/spec/rspec/views_spec.rb +5 -0
- data/spec/rspec_matchers_spec.rb +46 -0
- data/spec/rspec_spec.rb +79 -1
- data/spec/selector_spec.rb +199 -0
- data/spec/selenium_spec_chrome.rb +54 -9
- data/spec/selenium_spec_firefox.rb +68 -0
- data/spec/selenium_spec_marionette.rb +127 -0
- data/spec/server_spec.rb +102 -14
- data/spec/session_spec.rb +54 -0
- data/spec/shared_selenium_session.rb +215 -0
- data/spec/spec_helper.rb +7 -0
- metadata +140 -15
- data/spec/selenium_spec.rb +0 -128
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
Capybara::SpecHelper.spec "#uncheck" do
|
|
2
3
|
before do
|
|
3
4
|
@session.visit('/form')
|
|
@@ -26,15 +27,54 @@ Capybara::SpecHelper.spec "#uncheck" do
|
|
|
26
27
|
|
|
27
28
|
context "with :exact option" do
|
|
28
29
|
it "should accept partial matches when false" do
|
|
29
|
-
@session.uncheck('Ham', :
|
|
30
|
+
@session.uncheck('Ham', exact: false)
|
|
30
31
|
@session.click_button('awesome')
|
|
31
32
|
expect(extract_results(@session)['pets']).not_to include('hamster')
|
|
32
33
|
end
|
|
33
34
|
|
|
34
35
|
it "should not accept partial matches when true" do
|
|
35
36
|
expect do
|
|
36
|
-
@session.uncheck('Ham', :
|
|
37
|
+
@session.uncheck('Ham', exact: true)
|
|
37
38
|
end.to raise_error(Capybara::ElementNotFound)
|
|
38
39
|
end
|
|
39
40
|
end
|
|
41
|
+
|
|
42
|
+
context "when checkbox hidden" do
|
|
43
|
+
context "with Capybara.automatic_label_click == true" do
|
|
44
|
+
around do |spec|
|
|
45
|
+
old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
|
|
46
|
+
spec.run
|
|
47
|
+
Capybara.automatic_label_click = old_click_label
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should uncheck via clicking the label with :for attribute if possible" do
|
|
51
|
+
expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be
|
|
52
|
+
@session.uncheck('form_cars_jaguar')
|
|
53
|
+
@session.click_button('awesome')
|
|
54
|
+
expect(extract_results(@session)['cars']).not_to include('jaguar')
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should uncheck via clicking the wrapping label if possible" do
|
|
58
|
+
expect(@session.find(:checkbox, 'form_cars_koenigsegg', checked: true, visible: :hidden)).to be
|
|
59
|
+
@session.uncheck('form_cars_koenigsegg')
|
|
60
|
+
@session.click_button('awesome')
|
|
61
|
+
expect(extract_results(@session)['cars']).not_to include('koenigsegg')
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should not click the label if unneeded" do
|
|
65
|
+
expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be
|
|
66
|
+
@session.uncheck('form_cars_tesla')
|
|
67
|
+
@session.click_button('awesome')
|
|
68
|
+
expect(extract_results(@session)['cars']).not_to include('tesla')
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "should raise original error when no label available" do
|
|
72
|
+
expect { @session.uncheck('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_ariel" that is not disabled')
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "should raise error if not allowed to click label" do
|
|
76
|
+
expect{@session.uncheck('form_cars_jaguar', allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_jaguar" that is not disabled')
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
40
80
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
Capybara::SpecHelper.spec "#unselect" do
|
|
2
3
|
before do
|
|
3
4
|
@session.visit('/form')
|
|
@@ -5,7 +6,7 @@ Capybara::SpecHelper.spec "#unselect" do
|
|
|
5
6
|
|
|
6
7
|
context "with multiple select" do
|
|
7
8
|
it "should unselect an option from a select box by id" do
|
|
8
|
-
@session.unselect('Commando', :
|
|
9
|
+
@session.unselect('Commando', from: 'form_underwear')
|
|
9
10
|
@session.click_button('awesome')
|
|
10
11
|
expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
|
|
11
12
|
expect(extract_results(@session)['underwear']).not_to include('Commando')
|
|
@@ -19,27 +20,27 @@ Capybara::SpecHelper.spec "#unselect" do
|
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
it "should unselect an option from a select box by label" do
|
|
22
|
-
@session.unselect('Commando', :
|
|
23
|
+
@session.unselect('Commando', from: 'Underwear')
|
|
23
24
|
@session.click_button('awesome')
|
|
24
25
|
expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
|
|
25
26
|
expect(extract_results(@session)['underwear']).not_to include('Commando')
|
|
26
27
|
end
|
|
27
28
|
|
|
28
29
|
it "should favour exact matches to option labels" do
|
|
29
|
-
@session.unselect("Briefs", :
|
|
30
|
+
@session.unselect("Briefs", from: 'Underwear')
|
|
30
31
|
@session.click_button('awesome')
|
|
31
32
|
expect(extract_results(@session)['underwear']).to include('Commando', 'Boxerbriefs')
|
|
32
33
|
expect(extract_results(@session)['underwear']).not_to include('Briefs')
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
it "should escape quotes" do
|
|
36
|
-
@session.unselect("Frenchman's Pantalons", :
|
|
37
|
+
@session.unselect("Frenchman's Pantalons", from: 'Underwear')
|
|
37
38
|
@session.click_button('awesome')
|
|
38
39
|
expect(extract_results(@session)['underwear']).not_to include("Frenchman's Pantalons")
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
it "casts to string" do
|
|
42
|
-
@session.unselect(:"Briefs", :
|
|
43
|
+
@session.unselect(:"Briefs", from: :'Underwear')
|
|
43
44
|
@session.click_button('awesome')
|
|
44
45
|
expect(extract_results(@session)['underwear']).to include('Commando', 'Boxerbriefs')
|
|
45
46
|
expect(extract_results(@session)['underwear']).not_to include('Briefs')
|
|
@@ -48,24 +49,24 @@ Capybara::SpecHelper.spec "#unselect" do
|
|
|
48
49
|
|
|
49
50
|
context "with single select" do
|
|
50
51
|
it "should raise an error" do
|
|
51
|
-
expect { @session.unselect("English", :
|
|
52
|
+
expect { @session.unselect("English", from: 'form_locale') }.to raise_error(Capybara::UnselectNotAllowed)
|
|
52
53
|
end
|
|
53
54
|
end
|
|
54
55
|
|
|
55
56
|
context "with a locator that doesn't exist" do
|
|
56
57
|
it "should raise an error" do
|
|
57
|
-
msg = "Unable to find select box \"does not exist\""
|
|
58
|
+
msg = "Unable to find visible select box \"does not exist\" that is not disabled"
|
|
58
59
|
expect do
|
|
59
|
-
@session.unselect('foo', :
|
|
60
|
+
@session.unselect('foo', from: 'does not exist')
|
|
60
61
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
61
62
|
end
|
|
62
63
|
end
|
|
63
64
|
|
|
64
65
|
context "with an option that doesn't exist" do
|
|
65
66
|
it "should raise an error" do
|
|
66
|
-
msg =
|
|
67
|
+
msg = /^Unable to find visible option "Does not Exist" within/
|
|
67
68
|
expect do
|
|
68
|
-
@session.unselect('Does not Exist', :
|
|
69
|
+
@session.unselect('Does not Exist', from: 'form_underwear')
|
|
69
70
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
70
71
|
end
|
|
71
72
|
end
|
|
@@ -73,19 +74,19 @@ Capybara::SpecHelper.spec "#unselect" do
|
|
|
73
74
|
context "with :exact option" do
|
|
74
75
|
context "when `false`" do
|
|
75
76
|
it "can match select box approximately" do
|
|
76
|
-
@session.unselect("Boxerbriefs", :
|
|
77
|
+
@session.unselect("Boxerbriefs", from: "Under", exact: false)
|
|
77
78
|
@session.click_button("awesome")
|
|
78
79
|
expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
|
|
79
80
|
end
|
|
80
81
|
|
|
81
82
|
it "can match option approximately" do
|
|
82
|
-
@session.unselect("Boxerbr", :
|
|
83
|
+
@session.unselect("Boxerbr", from: "Underwear", exact: false)
|
|
83
84
|
@session.click_button("awesome")
|
|
84
85
|
expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
|
|
85
86
|
end
|
|
86
87
|
|
|
87
88
|
it "can match option approximately when :from not given" do
|
|
88
|
-
@session.unselect("Boxerbr", :
|
|
89
|
+
@session.unselect("Boxerbr", exact: false)
|
|
89
90
|
@session.click_button("awesome")
|
|
90
91
|
expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
|
|
91
92
|
end
|
|
@@ -94,19 +95,19 @@ Capybara::SpecHelper.spec "#unselect" do
|
|
|
94
95
|
context "when `true`" do
|
|
95
96
|
it "can match select box approximately" do
|
|
96
97
|
expect do
|
|
97
|
-
@session.unselect("Boxerbriefs", :
|
|
98
|
+
@session.unselect("Boxerbriefs", from: "Under", exact: true)
|
|
98
99
|
end.to raise_error(Capybara::ElementNotFound)
|
|
99
100
|
end
|
|
100
101
|
|
|
101
102
|
it "can match option approximately" do
|
|
102
103
|
expect do
|
|
103
|
-
@session.unselect("Boxerbr", :
|
|
104
|
+
@session.unselect("Boxerbr", from: "Underwear", exact: true)
|
|
104
105
|
end.to raise_error(Capybara::ElementNotFound)
|
|
105
106
|
end
|
|
106
107
|
|
|
107
108
|
it "can match option approximately when :from not given" do
|
|
108
109
|
expect do
|
|
109
|
-
@session.unselect("Boxerbr", :
|
|
110
|
+
@session.unselect("Boxerbr", exact: true)
|
|
110
111
|
end.to raise_error(Capybara::ElementNotFound)
|
|
111
112
|
end
|
|
112
113
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
Capybara::SpecHelper.spec '#visit' do
|
|
2
3
|
it "should fetch a response from the driver with a relative url" do
|
|
3
4
|
@session.visit('/')
|
|
@@ -26,7 +27,7 @@ Capybara::SpecHelper.spec '#visit' do
|
|
|
26
27
|
expect(@session).to have_content('Hello world!')
|
|
27
28
|
end
|
|
28
29
|
|
|
29
|
-
it "raises any errors caught inside the server", :
|
|
30
|
+
it "raises any errors caught inside the server", requires: [:server] do
|
|
30
31
|
quietly { @session.visit("/error") }
|
|
31
32
|
expect do
|
|
32
33
|
@session.visit("/")
|
|
@@ -62,9 +63,59 @@ Capybara::SpecHelper.spec '#visit' do
|
|
|
62
63
|
expect(URI.parse(@session.current_url).port).to eq(root_uri.port)
|
|
63
64
|
expect(@session).to have_content('Another World')
|
|
64
65
|
end
|
|
66
|
+
|
|
67
|
+
it "should add the server port to a visited url if no port specified", requires: [:server] do
|
|
68
|
+
expect(@session.driver).to receive(:visit).with("http://www.example.com:#{@session.server.port}")
|
|
69
|
+
@session.visit("http://www.example.com")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "should not override the visit specified port even if default for scheme", requires: [:server] do
|
|
73
|
+
expect(@session.driver).to receive(:visit).with("http://www.example.com:80")
|
|
74
|
+
@session.visit('http://www.example.com:80')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should give preference to app_host port if specified", requires: [:server] do
|
|
78
|
+
Capybara.app_host = "http://www.example.com:6666"
|
|
79
|
+
expect(@session.driver).to receive(:visit).with("http://www.example.com:6666/random")
|
|
80
|
+
@session.visit('/random')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "shouldn't override port if no server", requires: [:server] do
|
|
84
|
+
session = Capybara::Session.new(@session.mode, nil)
|
|
85
|
+
expect(session.driver).to receive(:visit).with("http://www.google.com")
|
|
86
|
+
session.visit("http://www.google.com")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "shouldn't override port if no server but app_host is set", requires: [:server] do
|
|
90
|
+
session = Capybara::Session.new(@session.mode, nil)
|
|
91
|
+
Capybara.app_host = "http://www.example.com:6666"
|
|
92
|
+
expect(session.driver).to receive(:visit).with("http://www.google.com")
|
|
93
|
+
session.visit("http://www.google.com")
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "when Capybara.always_include_port is false" do
|
|
98
|
+
before(:each) do
|
|
99
|
+
Capybara.always_include_port = false
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "shouldn't overwrite port if app_host is set", requires: [:server] do
|
|
103
|
+
session = Capybara::Session.new(@session.mode, nil)
|
|
104
|
+
Capybara.app_host = "http://www.example.com:6666"
|
|
105
|
+
expect(session.driver).to receive(:visit).with("http://www.google.com")
|
|
106
|
+
session.visit("http://www.google.com")
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "shouldn't overwrite port if port specfified", requires: [:server] do
|
|
110
|
+
session = Capybara::Session.new(@session.mode, nil)
|
|
111
|
+
Capybara.app_host = "http://www.example.com:6666"
|
|
112
|
+
expect(session.driver).to receive(:visit).with("http://www.google.com:99")
|
|
113
|
+
session.visit("http://www.google.com:99")
|
|
114
|
+
end
|
|
65
115
|
end
|
|
66
116
|
|
|
67
|
-
|
|
117
|
+
|
|
118
|
+
context "without a server", requires: [:server] do
|
|
68
119
|
it "should respect `app_host`" do
|
|
69
120
|
serverless_session = Capybara::Session.new(@session.mode, nil)
|
|
70
121
|
Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
|
|
@@ -79,6 +130,30 @@ Capybara::SpecHelper.spec '#visit' do
|
|
|
79
130
|
end
|
|
80
131
|
end
|
|
81
132
|
|
|
133
|
+
context "with Capybara.app_host set" do
|
|
134
|
+
it "should override server", requires: [:server] do
|
|
135
|
+
another_session = Capybara::Session.new(@session.mode, @session.app.dup)
|
|
136
|
+
Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
|
|
137
|
+
another_session.visit('/foo')
|
|
138
|
+
expect(another_session).to have_content("Another World")
|
|
139
|
+
expect(another_session.current_url).to start_with(Capybara.app_host)
|
|
140
|
+
expect(URI.parse(another_session.current_url).port).not_to eq another_session.server.port
|
|
141
|
+
expect(URI.parse(another_session.current_url).port).to eq @session.server.port
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "should append relative path", requires: [:server] do
|
|
145
|
+
Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/redirect/0"
|
|
146
|
+
@session.visit('/times')
|
|
147
|
+
expect(@session).to have_content('redirection complete')
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it "should work if `app_host` has a trailing /", requires: [:server] do
|
|
151
|
+
Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/"
|
|
152
|
+
@session.visit('/')
|
|
153
|
+
expect(@session).to have_content('Hello world!')
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
82
157
|
it "should send no referer when visiting a page" do
|
|
83
158
|
@session.visit '/get_referer'
|
|
84
159
|
expect(@session).to have_content 'No referer'
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
|
|
2
3
|
before(:each) do
|
|
3
4
|
@window = @session.current_window
|
|
@@ -20,18 +21,18 @@ Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
|
|
|
20
21
|
@session.execute_script('setTimeout(function(){ window.close(); }, 500);')
|
|
21
22
|
end
|
|
22
23
|
Capybara.using_wait_time 0.1 do
|
|
23
|
-
expect(@other_window).to become_closed(wait:
|
|
24
|
+
expect(@other_window).to become_closed(wait: 5)
|
|
24
25
|
end
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
it 'should raise error if value of :wait is less than timeout' do
|
|
28
29
|
@session.within_window @other_window do
|
|
29
|
-
@session.execute_script('setTimeout(function(){ window.close(); },
|
|
30
|
+
@session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
|
|
30
31
|
end
|
|
31
32
|
Capybara.using_wait_time 2 do
|
|
32
33
|
expect do
|
|
33
|
-
expect(@other_window).to become_closed(wait: 0.
|
|
34
|
-
end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.
|
|
34
|
+
expect(@other_window).to become_closed(wait: 0.2)
|
|
35
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.2 seconds\Z/)
|
|
35
36
|
end
|
|
36
37
|
end
|
|
37
38
|
end
|
|
@@ -41,7 +42,7 @@ Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
|
|
|
41
42
|
@session.within_window @other_window do
|
|
42
43
|
@session.execute_script('setTimeout(function(){ window.close(); }, 500);')
|
|
43
44
|
end
|
|
44
|
-
Capybara.using_wait_time
|
|
45
|
+
Capybara.using_wait_time 5 do
|
|
45
46
|
expect(@other_window).to become_closed
|
|
46
47
|
end
|
|
47
48
|
end
|
|
@@ -59,25 +60,25 @@ Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
|
|
|
59
60
|
end
|
|
60
61
|
|
|
61
62
|
context 'with not_to' do
|
|
62
|
-
it
|
|
63
|
+
it "should not raise error if window doesn't close before default_max_wait_time" do
|
|
63
64
|
@session.within_window @other_window do
|
|
64
|
-
@session.execute_script('setTimeout(function(){ window.close(); },
|
|
65
|
+
@session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
|
|
65
66
|
end
|
|
66
|
-
Capybara.using_wait_time 0.
|
|
67
|
+
Capybara.using_wait_time 0.3 do
|
|
67
68
|
expect do
|
|
68
69
|
expect(@other_window).not_to become_closed
|
|
69
70
|
end
|
|
70
71
|
end
|
|
71
72
|
end
|
|
72
73
|
|
|
73
|
-
it 'should raise error if
|
|
74
|
+
it 'should raise error if window closes before default_max_wait_time' do
|
|
74
75
|
@session.within_window @other_window do
|
|
75
76
|
@session.execute_script('setTimeout(function(){ window.close(); }, 700);')
|
|
76
77
|
end
|
|
77
|
-
Capybara.using_wait_time
|
|
78
|
+
Capybara.using_wait_time 3.1 do
|
|
78
79
|
expect do
|
|
79
80
|
expect(@other_window).not_to become_closed
|
|
80
|
-
end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> not to become closed after
|
|
81
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> not to become closed after 3.1 seconds\Z/)
|
|
81
82
|
end
|
|
82
83
|
end
|
|
83
84
|
end
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
|
|
2
3
|
before(:each) do
|
|
3
4
|
@window = @session.current_window
|
|
4
5
|
@session.visit('/with_windows')
|
|
6
|
+
expect(@session).to have_css('body.loaded')
|
|
5
7
|
end
|
|
8
|
+
|
|
6
9
|
after(:each) do
|
|
7
10
|
(@session.windows - [@window]).each do |w|
|
|
8
11
|
@session.switch_to_window w
|
|
@@ -46,7 +49,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
|
|
|
46
49
|
context "with block" do
|
|
47
50
|
before(:each) do
|
|
48
51
|
@session.find(:css, '#openTwoWindows').click
|
|
49
|
-
sleep(
|
|
52
|
+
sleep(1) # wait for the windows to open
|
|
50
53
|
end
|
|
51
54
|
|
|
52
55
|
it "should be able to switch to current window" do
|
|
@@ -76,7 +79,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
|
|
|
76
79
|
@session.within(:css, '#doesNotOpenWindows') do
|
|
77
80
|
@session.switch_to_window { @session.title == 'With Windows' }
|
|
78
81
|
end
|
|
79
|
-
end.to raise_error(Capybara::ScopeError,
|
|
82
|
+
end.to raise_error(Capybara::ScopeError, /`switch_to_window` is not supposed to be invoked/)
|
|
80
83
|
end
|
|
81
84
|
|
|
82
85
|
it "should raise error when invoked inside `within_frame` as it's nonsense" do
|
|
@@ -84,16 +87,18 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
|
|
|
84
87
|
@session.within_frame('frameOne') do
|
|
85
88
|
@session.switch_to_window { @session.title == 'With Windows' }
|
|
86
89
|
end
|
|
87
|
-
end.to raise_error(Capybara::ScopeError,
|
|
90
|
+
end.to raise_error(Capybara::ScopeError, /`switch_to_window` is not supposed to be invoked from/)
|
|
88
91
|
end
|
|
89
92
|
|
|
90
|
-
it "should
|
|
91
|
-
|
|
92
|
-
expect
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
it "should allow to be called inside within_window and within_window will still return to original" do
|
|
94
|
+
other_windows = (@session.windows - [@window])
|
|
95
|
+
expect(@session.current_window).to eq(@window)
|
|
96
|
+
@session.within_window other_windows[0] do
|
|
97
|
+
expect(@session.current_window).to eq(other_windows[0])
|
|
98
|
+
@session.switch_to_window other_windows[1]
|
|
99
|
+
expect(@session.current_window).to eq(other_windows[1])
|
|
100
|
+
end
|
|
101
|
+
expect(@session.current_window).to eq(@window)
|
|
97
102
|
end
|
|
98
103
|
|
|
99
104
|
it "should raise error if window matching block wasn't found" do
|
|
@@ -116,7 +121,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
|
|
|
116
121
|
it "should wait for window to appear" do
|
|
117
122
|
@session.find(:css, '#openWindowWithTimeout').click
|
|
118
123
|
expect do
|
|
119
|
-
@session.switch_to_window { @session.title == 'Title of the first popup'}
|
|
124
|
+
@session.switch_to_window(wait: 5) { @session.title == 'Title of the first popup'}
|
|
120
125
|
end.not_to raise_error
|
|
121
126
|
end
|
|
122
127
|
end
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
|
|
2
3
|
before(:each) do
|
|
3
4
|
@window = @session.current_window
|
|
4
5
|
@session.visit('/with_windows')
|
|
6
|
+
expect(@session).to have_css('body.loaded')
|
|
5
7
|
end
|
|
6
8
|
after(:each) do
|
|
7
9
|
(@session.windows - [@window]).each do |w|
|
|
@@ -20,12 +22,12 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
|
|
|
20
22
|
Capybara.using_wait_time 2 do
|
|
21
23
|
button=@session.find(:css, '#openWindowWithLongerTimeout')
|
|
22
24
|
expect do
|
|
23
|
-
@session.window_opened_by(wait: 0.
|
|
25
|
+
@session.window_opened_by(wait: 0.3) do
|
|
24
26
|
button.click
|
|
25
27
|
end
|
|
26
28
|
end.to raise_error(Capybara::WindowError, zero_windows_message)
|
|
27
29
|
end
|
|
28
|
-
@session.document.synchronize(
|
|
30
|
+
@session.document.synchronize(5, errors: [Capybara::CapybaraError]) do
|
|
29
31
|
raise Capybara::CapybaraError if @session.windows.size != 2
|
|
30
32
|
end
|
|
31
33
|
end
|
|
@@ -44,7 +46,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
|
|
|
44
46
|
context 'without :wait option' do
|
|
45
47
|
it 'should raise error if default_max_wait_time is less than timeout' do
|
|
46
48
|
button = @session.find(:css, '#openWindowWithTimeout')
|
|
47
|
-
Capybara.using_wait_time 0.
|
|
49
|
+
Capybara.using_wait_time 0.1 do
|
|
48
50
|
expect do
|
|
49
51
|
@session.window_opened_by do
|
|
50
52
|
button.click
|
|
@@ -58,7 +60,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
|
|
|
58
60
|
|
|
59
61
|
it 'should find window if default_max_wait_time is more than timeout' do
|
|
60
62
|
button = @session.find(:css, '#openWindowWithTimeout')
|
|
61
|
-
Capybara.using_wait_time
|
|
63
|
+
Capybara.using_wait_time 5 do
|
|
62
64
|
window = @session.window_opened_by do
|
|
63
65
|
button.click
|
|
64
66
|
end
|
|
@@ -72,6 +74,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
|
|
|
72
74
|
expect do
|
|
73
75
|
@session.window_opened_by do
|
|
74
76
|
button.click
|
|
77
|
+
sleep 1 # It's possible for window_opened_by to be fullfilled before the second window opens
|
|
75
78
|
end
|
|
76
79
|
end.to raise_error(Capybara::WindowError, two_windows_message)
|
|
77
80
|
@session.document.synchronize(2, errors: [Capybara::CapybaraError]) do
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
|
|
2
3
|
before(:each) do
|
|
3
4
|
@window = @session.current_window
|
|
@@ -85,22 +86,22 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
|
|
|
85
86
|
end
|
|
86
87
|
|
|
87
88
|
describe '#size' do
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
def win_size
|
|
90
|
+
@session.evaluate_script("[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]")
|
|
91
|
+
end
|
|
90
92
|
|
|
91
|
-
|
|
93
|
+
it 'should return size of whole window', requires: [:windows, :js] do
|
|
94
|
+
expect(@session.current_window.size).to eq win_size
|
|
92
95
|
end
|
|
93
96
|
|
|
94
97
|
it 'should switch to original window if invoked not for current window' do
|
|
95
|
-
skip "Chromedriver returns a size larger than outerWidth, outerHeight???" if ENV['TRAVIS'] && @session.respond_to?(:mode) && (@session.mode == :selenium_chrome)
|
|
96
|
-
|
|
97
98
|
@other_window = @session.window_opened_by do
|
|
98
99
|
@session.find(:css, '#openWindow').click
|
|
99
100
|
end
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
sleep 1
|
|
102
|
+
size = @session.within_window(@other_window) do
|
|
103
|
+
win_size
|
|
104
|
+
end
|
|
104
105
|
expect(@other_window.size).to eq(size)
|
|
105
106
|
expect(@session.current_window).to eq(@window)
|
|
106
107
|
end
|
|
@@ -108,10 +109,10 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
|
|
|
108
109
|
|
|
109
110
|
describe '#resize_to' do
|
|
110
111
|
it 'should be able to resize window', requires: [:windows, :js] do
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
expect(@session.
|
|
112
|
+
width, height = @session.current_window.size
|
|
113
|
+
@session.current_window.resize_to(width-100, height-100)
|
|
114
|
+
sleep 1
|
|
115
|
+
expect(@session.current_window.size).to eq([width-100, height-100])
|
|
115
116
|
end
|
|
116
117
|
|
|
117
118
|
it 'should stay on current window if invoked not for current window', requires: [:windows, :js] do
|
|
@@ -123,40 +124,46 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
|
|
|
123
124
|
expect(@session.current_window).to eq(@window)
|
|
124
125
|
|
|
125
126
|
# #size returns values larger than availWidth, availHeight with Chromedriver
|
|
126
|
-
# expect(@other_window.size).to eq([400, 300])
|
|
127
127
|
@session.within_window(@other_window) do
|
|
128
|
-
expect(@session.
|
|
128
|
+
expect(@session.current_window.size).to eq([400,300])
|
|
129
|
+
# expect(@session.evaluate_script("[window.outerWidth, window.outerHeight]")).to eq([400,300])
|
|
129
130
|
end
|
|
130
131
|
end
|
|
131
132
|
end
|
|
132
133
|
|
|
133
134
|
describe '#maximize' do
|
|
134
135
|
it 'should be able to maximize window', requires: [:windows, :js] do
|
|
135
|
-
|
|
136
|
+
start_width, start_height = 400, 300
|
|
137
|
+
@session.current_window.resize_to(start_width, start_height)
|
|
138
|
+
sleep 0.5
|
|
136
139
|
|
|
137
|
-
|
|
138
|
-
window = @session.current_window
|
|
139
|
-
window.resize_to(screen_width-100, screen_height-100)
|
|
140
|
-
expect(@session.evaluate_script("[window.outerWidth, window.outerHeight];")).to eq([screen_width-100, screen_height-100])
|
|
141
|
-
window.maximize
|
|
140
|
+
@session.current_window.maximize
|
|
142
141
|
sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
|
|
143
|
-
|
|
142
|
+
|
|
143
|
+
max_width, max_height = @session.current_window.size
|
|
144
|
+
|
|
145
|
+
#maximize behavior is window manage dependant, so just make sure it increases in size
|
|
146
|
+
expect(max_width).to be > start_width
|
|
147
|
+
expect(max_height).to be > start_height
|
|
144
148
|
end
|
|
145
149
|
|
|
146
150
|
it 'should stay on current window if invoked not for current window', requires: [:windows, :js] do
|
|
147
|
-
|
|
148
|
-
|
|
151
|
+
cur_window_size = @session.current_window.size
|
|
149
152
|
@other_window = @session.window_opened_by do
|
|
150
153
|
@session.find(:css, '#openWindow').click
|
|
151
154
|
end
|
|
155
|
+
|
|
156
|
+
@other_window.resize_to(400,300)
|
|
157
|
+
sleep 0.5
|
|
152
158
|
@other_window.maximize
|
|
153
159
|
sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
|
|
160
|
+
|
|
154
161
|
expect(@session.current_window).to eq(@window)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
@
|
|
158
|
-
|
|
159
|
-
|
|
162
|
+
expect(@session.current_window.size).to eq(cur_window_size)
|
|
163
|
+
|
|
164
|
+
ow_width, ow_height = @other_window.size
|
|
165
|
+
expect(ow_width).to be > 400
|
|
166
|
+
expect(ow_height).to be > 300
|
|
160
167
|
end
|
|
161
168
|
end
|
|
162
169
|
end
|