capybara 3.32.2
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 +7 -0
- data/.yardopts +1 -0
- data/History.md +1813 -0
- data/License.txt +22 -0
- data/README.md +1099 -0
- data/lib/capybara.rb +511 -0
- data/lib/capybara/config.rb +94 -0
- data/lib/capybara/cucumber.rb +27 -0
- data/lib/capybara/driver/base.rb +170 -0
- data/lib/capybara/driver/node.rb +139 -0
- data/lib/capybara/dsl.rb +65 -0
- data/lib/capybara/helpers.rb +108 -0
- data/lib/capybara/minitest.rb +386 -0
- data/lib/capybara/minitest/spec.rb +264 -0
- data/lib/capybara/node/actions.rb +420 -0
- data/lib/capybara/node/base.rb +143 -0
- data/lib/capybara/node/document.rb +48 -0
- data/lib/capybara/node/document_matchers.rb +67 -0
- data/lib/capybara/node/element.rb +606 -0
- data/lib/capybara/node/finders.rb +325 -0
- data/lib/capybara/node/matchers.rb +883 -0
- data/lib/capybara/node/simple.rb +208 -0
- data/lib/capybara/queries/ancestor_query.rb +27 -0
- data/lib/capybara/queries/base_query.rb +106 -0
- data/lib/capybara/queries/current_path_query.rb +51 -0
- data/lib/capybara/queries/match_query.rb +26 -0
- data/lib/capybara/queries/selector_query.rb +710 -0
- data/lib/capybara/queries/sibling_query.rb +26 -0
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +110 -0
- data/lib/capybara/queries/title_query.rb +39 -0
- data/lib/capybara/rack_test/browser.rb +140 -0
- data/lib/capybara/rack_test/css_handlers.rb +13 -0
- data/lib/capybara/rack_test/driver.rb +109 -0
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +127 -0
- data/lib/capybara/rack_test/node.rb +325 -0
- data/lib/capybara/rails.rb +16 -0
- data/lib/capybara/registrations/drivers.rb +36 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
- data/lib/capybara/registrations/servers.rb +44 -0
- data/lib/capybara/result.rb +190 -0
- data/lib/capybara/rspec.rb +29 -0
- data/lib/capybara/rspec/features.rb +23 -0
- data/lib/capybara/rspec/matcher_proxies.rb +82 -0
- data/lib/capybara/rspec/matchers.rb +201 -0
- data/lib/capybara/rspec/matchers/base.rb +111 -0
- data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
- data/lib/capybara/rspec/matchers/compound.rb +88 -0
- data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
- data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
- data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
- data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
- data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/lib/capybara/rspec/matchers/have_text.rb +33 -0
- data/lib/capybara/rspec/matchers/have_title.rb +29 -0
- data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
- data/lib/capybara/rspec/matchers/match_style.rb +38 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/selector.rb +233 -0
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
- data/lib/capybara/selector/css.rb +102 -0
- data/lib/capybara/selector/definition.rb +276 -0
- data/lib/capybara/selector/definition/button.rb +51 -0
- data/lib/capybara/selector/definition/checkbox.rb +26 -0
- data/lib/capybara/selector/definition/css.rb +10 -0
- data/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/lib/capybara/selector/definition/element.rb +27 -0
- data/lib/capybara/selector/definition/field.rb +40 -0
- data/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/lib/capybara/selector/definition/file_field.rb +13 -0
- data/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/lib/capybara/selector/definition/frame.rb +17 -0
- data/lib/capybara/selector/definition/id.rb +6 -0
- data/lib/capybara/selector/definition/label.rb +62 -0
- data/lib/capybara/selector/definition/link.rb +46 -0
- data/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/lib/capybara/selector/definition/option.rb +27 -0
- data/lib/capybara/selector/definition/radio_button.rb +27 -0
- data/lib/capybara/selector/definition/select.rb +81 -0
- data/lib/capybara/selector/definition/table.rb +109 -0
- data/lib/capybara/selector/definition/table_row.rb +21 -0
- data/lib/capybara/selector/definition/xpath.rb +5 -0
- data/lib/capybara/selector/filter.rb +5 -0
- data/lib/capybara/selector/filter_set.rb +124 -0
- data/lib/capybara/selector/filters/base.rb +77 -0
- data/lib/capybara/selector/filters/expression_filter.rb +22 -0
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +31 -0
- data/lib/capybara/selector/regexp_disassembler.rb +214 -0
- data/lib/capybara/selector/selector.rb +147 -0
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
- data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
- data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
- data/lib/capybara/selenium/driver.rb +496 -0
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +110 -0
- data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +78 -0
- data/lib/capybara/selenium/logger_suppressor.rb +34 -0
- data/lib/capybara/selenium/node.rb +610 -0
- data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +131 -0
- data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
- data/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +47 -0
- data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
- data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/lib/capybara/server.rb +126 -0
- data/lib/capybara/server/animation_disabler.rb +58 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +69 -0
- data/lib/capybara/session.rb +942 -0
- data/lib/capybara/session/config.rb +124 -0
- data/lib/capybara/session/matchers.rb +87 -0
- data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
- data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- data/lib/capybara/spec/fixtures/test_file.txt +1 -0
- data/lib/capybara/spec/public/jquery-ui.js +13 -0
- data/lib/capybara/spec/public/jquery.js +5 -0
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +268 -0
- data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
- data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
- data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
- data/lib/capybara/spec/session/all_spec.rb +278 -0
- data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
- data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
- data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
- data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
- data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
- data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
- data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
- data/lib/capybara/spec/session/body_spec.rb +23 -0
- data/lib/capybara/spec/session/check_spec.rb +235 -0
- data/lib/capybara/spec/session/choose_spec.rb +121 -0
- data/lib/capybara/spec/session/click_button_spec.rb +506 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
- data/lib/capybara/spec/session/click_link_spec.rb +229 -0
- data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
- data/lib/capybara/spec/session/current_url_spec.rb +115 -0
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
- data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
- data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
- data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
- data/lib/capybara/spec/session/find_button_spec.rb +74 -0
- data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
- data/lib/capybara/spec/session/find_field_spec.rb +113 -0
- data/lib/capybara/spec/session/find_link_spec.rb +70 -0
- data/lib/capybara/spec/session/find_spec.rb +531 -0
- data/lib/capybara/spec/session/first_spec.rb +156 -0
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
- data/lib/capybara/spec/session/go_back_spec.rb +12 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
- data/lib/capybara/spec/session/has_button_spec.rb +69 -0
- data/lib/capybara/spec/session/has_css_spec.rb +374 -0
- data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
- data/lib/capybara/spec/session/has_field_spec.rb +349 -0
- data/lib/capybara/spec/session/has_link_spec.rb +39 -0
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
- data/lib/capybara/spec/session/has_select_spec.rb +310 -0
- data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +198 -0
- data/lib/capybara/spec/session/has_text_spec.rb +394 -0
- data/lib/capybara/spec/session/has_title_spec.rb +71 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
- data/lib/capybara/spec/session/headers_spec.rb +8 -0
- data/lib/capybara/spec/session/html_spec.rb +47 -0
- data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +1292 -0
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +33 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
- data/lib/capybara/spec/session/response_code_spec.rb +8 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
- data/lib/capybara/spec/session/save_page_spec.rb +110 -0
- data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
- data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
- data/lib/capybara/spec/session/scroll_spec.rb +117 -0
- data/lib/capybara/spec/session/select_spec.rb +229 -0
- data/lib/capybara/spec/session/selectors_spec.rb +98 -0
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/session/text_spec.rb +74 -0
- data/lib/capybara/spec/session/title_spec.rb +29 -0
- data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
- data/lib/capybara/spec/session/unselect_spec.rb +116 -0
- data/lib/capybara/spec/session/visit_spec.rb +204 -0
- data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
- data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
- data/lib/capybara/spec/session/window/window_spec.rb +203 -0
- data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
- data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
- data/lib/capybara/spec/session/within_spec.rb +199 -0
- data/lib/capybara/spec/spec_helper.rb +134 -0
- data/lib/capybara/spec/test_app.rb +226 -0
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/buttons.erb +5 -0
- data/lib/capybara/spec/views/fieldsets.erb +30 -0
- data/lib/capybara/spec/views/form.erb +685 -0
- data/lib/capybara/spec/views/frame_child.erb +18 -0
- data/lib/capybara/spec/views/frame_one.erb +10 -0
- data/lib/capybara/spec/views/frame_parent.erb +9 -0
- data/lib/capybara/spec/views/frame_two.erb +9 -0
- data/lib/capybara/spec/views/header_links.erb +8 -0
- data/lib/capybara/spec/views/host_links.erb +13 -0
- data/lib/capybara/spec/views/initial_alert.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +32 -0
- data/lib/capybara/spec/views/path.erb +13 -0
- data/lib/capybara/spec/views/popup_one.erb +9 -0
- data/lib/capybara/spec/views/popup_two.erb +9 -0
- data/lib/capybara/spec/views/postback.erb +14 -0
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +20 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +130 -0
- data/lib/capybara/spec/views/with_animation.erb +74 -0
- data/lib/capybara/spec/views/with_base_tag.erb +11 -0
- data/lib/capybara/spec/views/with_count.erb +8 -0
- data/lib/capybara/spec/views/with_dragula.erb +22 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +24 -0
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +208 -0
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_html_entities.erb +2 -0
- data/lib/capybara/spec/views/with_js.erb +160 -0
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +20 -0
- data/lib/capybara/spec/views/with_scope.erb +42 -0
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_simple_html.erb +2 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_title.erb +5 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
- data/lib/capybara/spec/views/with_windows.erb +54 -0
- data/lib/capybara/spec/views/within_frames.erb +15 -0
- data/lib/capybara/version.rb +5 -0
- data/lib/capybara/window.rb +146 -0
- data/spec/basic_node_spec.rb +154 -0
- data/spec/capybara_spec.rb +112 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +276 -0
- data/spec/filter_set_spec.rb +46 -0
- data/spec/fixtures/capybara.csv +1 -0
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
- data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
- data/spec/minitest_spec.rb +163 -0
- data/spec/minitest_spec_spec.rb +162 -0
- data/spec/per_session_config_spec.rb +68 -0
- data/spec/rack_test_spec.rb +268 -0
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +196 -0
- data/spec/rspec/features_spec.rb +99 -0
- data/spec/rspec/scenarios_spec.rb +19 -0
- data/spec/rspec/shared_spec_matchers.rb +947 -0
- data/spec/rspec/views_spec.rb +14 -0
- data/spec/rspec_matchers_spec.rb +62 -0
- data/spec/rspec_spec.rb +145 -0
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +513 -0
- data/spec/selenium_spec_chrome.rb +188 -0
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +47 -0
- data/spec/selenium_spec_firefox.rb +208 -0
- data/spec/selenium_spec_firefox_remote.rb +80 -0
- data/spec/selenium_spec_ie.rb +150 -0
- data/spec/selenium_spec_safari.rb +148 -0
- data/spec/server_spec.rb +292 -0
- data/spec/session_spec.rb +91 -0
- data/spec/shared_selenium_node.rb +83 -0
- data/spec/shared_selenium_session.rb +476 -0
- data/spec/spec_helper.rb +100 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +753 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
|
5
|
+
<title>with_jstree</title>
|
|
6
|
+
</head>
|
|
7
|
+
<body id="with_jstree">
|
|
8
|
+
<div id="container">
|
|
9
|
+
<ul>
|
|
10
|
+
<li>Child node A</li>
|
|
11
|
+
<li>Child node B</li>
|
|
12
|
+
<li>Child node C</li>
|
|
13
|
+
</ul>
|
|
14
|
+
</div>
|
|
15
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
|
|
16
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.8/jstree.min.js"></script>
|
|
17
|
+
<script>
|
|
18
|
+
$(function () {
|
|
19
|
+
$('#container').jstree({
|
|
20
|
+
"core" : { "check_callback" : true }, // so that operations work
|
|
21
|
+
"plugins" : ["dnd"]
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
</script>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
2
|
+
<head>
|
|
3
|
+
<title>Namespace</title>
|
|
4
|
+
</head>
|
|
5
|
+
<body id="body">
|
|
6
|
+
<div>
|
|
7
|
+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
|
|
8
|
+
viewBox="0 0 100 100" preserveAspectRatio="xMidYMid slice"
|
|
9
|
+
style="width:100%; height:100%; position:absolute; top:0; left:0; z-index:-1;">
|
|
10
|
+
<linearGradient id="gradient">
|
|
11
|
+
<stop class="begin" offset="0%"/>
|
|
12
|
+
<stop class="end" offset="100%"/>
|
|
13
|
+
</linearGradient>
|
|
14
|
+
<rect x="0" y="0" width="100" height="100" style="fill:url(#gradient)" />
|
|
15
|
+
<rect x="150" y="150" width="25" height="25" style="fill:url(#gradient)" />
|
|
16
|
+
<circle cx="50" cy="50" r="30" style="fill:url(#gradient)" />
|
|
17
|
+
</svg>
|
|
18
|
+
<div>
|
|
19
|
+
</body>
|
|
20
|
+
</html>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
|
|
2
|
+
<h1>This page is used for testing various scopes</h1>
|
|
3
|
+
|
|
4
|
+
<p id="for_foo">
|
|
5
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
|
|
6
|
+
incididunt ut labore et dolore magna aliqua. Ut enim ad minim venia.
|
|
7
|
+
<a href="/redirect">Go</a>
|
|
8
|
+
<input name="disabled" disabled="disabled"/>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<div id="for_bar">
|
|
12
|
+
<ul>
|
|
13
|
+
<li>With Simple HTML: <a href="/with_simple_html">Go</a>
|
|
14
|
+
<form action="/redirect" method="post" accept-charset="utf-8">
|
|
15
|
+
<p>
|
|
16
|
+
<label for="simple_first_name">First Name</label>
|
|
17
|
+
<input type="text" name="first_name" value="John" id="simple_first_name"/>
|
|
18
|
+
</p>
|
|
19
|
+
<p><input type="submit" value="Go"/></p>
|
|
20
|
+
</form>
|
|
21
|
+
</li>
|
|
22
|
+
<li>Bar: <a href="/foo">Go</a>
|
|
23
|
+
<form action="/form" method="post" accept-charset="utf-8">
|
|
24
|
+
<p>
|
|
25
|
+
<label for="bar_first_name">First Name</label>
|
|
26
|
+
<input type="text" name="form[first_name]" value="Peter" id="bar_first_name"/>
|
|
27
|
+
</p>
|
|
28
|
+
<p>
|
|
29
|
+
<label for="bar_other_name">Other Name</label>
|
|
30
|
+
<input type="text" name="form[other_name]" value="James" id="bar_other_name" disabled="disabled"/>
|
|
31
|
+
</p>
|
|
32
|
+
<p><input type="submit" value="Go"/></p>
|
|
33
|
+
</form>
|
|
34
|
+
</li>
|
|
35
|
+
</ul>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div id="another_foo">
|
|
39
|
+
<ul>
|
|
40
|
+
<li>With Simple HTML: <a href="/">Go</a>
|
|
41
|
+
</ul>
|
|
42
|
+
</div>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<html>
|
|
2
|
+
<head>
|
|
3
|
+
<script>
|
|
4
|
+
function delay_unload() {
|
|
5
|
+
var start = new Date();
|
|
6
|
+
var i = 0;
|
|
7
|
+
while ((new Date()) - start < 1000){ i = i + 1; };
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
window.onbeforeunload = delay_unload;
|
|
11
|
+
window.onunload = delay_unload;
|
|
12
|
+
</script>
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<div>This delays unload by 2 seconds</div>
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
|
2
|
+
<head>
|
|
3
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
|
4
|
+
<title>with_sortable_js</title>
|
|
5
|
+
<script src="https://sortablejs.github.io/Sortable/Sortable.js" type="text/javascript"></script>
|
|
6
|
+
</head>
|
|
7
|
+
|
|
8
|
+
<body id="with_sortable_js">
|
|
9
|
+
<div id="sortable">
|
|
10
|
+
<div class="item1">Item 1</div>
|
|
11
|
+
<div class="item2">Item 2</div>
|
|
12
|
+
<div class="item3">Item 3</div>
|
|
13
|
+
<div class="item4">Item 4</div>
|
|
14
|
+
<div class="item5">Item 5</div>
|
|
15
|
+
</div>
|
|
16
|
+
<script>
|
|
17
|
+
new Sortable(document.getElementById("sortable"));
|
|
18
|
+
</script>
|
|
19
|
+
</body>
|
|
20
|
+
</html>
|
|
21
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>With Windows</title>
|
|
5
|
+
<script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
|
|
6
|
+
<script language="javascript" type="text/javascript">
|
|
7
|
+
$(document).ready(function(){
|
|
8
|
+
$('#openWindow').click(function(){
|
|
9
|
+
window.open('/popup_one', 'firstPopup');
|
|
10
|
+
return false;
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
$('#openWindowWithTimeout').click(function(){
|
|
14
|
+
setTimeout(function(){
|
|
15
|
+
window.open('/popup_one', 'timeoutPopup');
|
|
16
|
+
}, 600);
|
|
17
|
+
return false;
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
$('#openWindowWithLongerTimeout').click(function(){
|
|
21
|
+
setTimeout(function(){
|
|
22
|
+
window.open('/popup_one', 'longerTimeoutPopup');
|
|
23
|
+
}, 1400);
|
|
24
|
+
return false;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
$('#openTwoWindows').click(function() {
|
|
28
|
+
window.open('/popup_one', 'firstPopup');
|
|
29
|
+
window.open('/popup_two', 'secondPopup');
|
|
30
|
+
return false;
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
$('body').addClass('loaded');
|
|
34
|
+
});
|
|
35
|
+
</script>
|
|
36
|
+
</head>
|
|
37
|
+
<body>
|
|
38
|
+
<button id="openWindow">Open new window</button>
|
|
39
|
+
|
|
40
|
+
<button id="openWindowWithTimeout">Open new window with timeout</button>
|
|
41
|
+
|
|
42
|
+
<button id="openWindowWithLongerTimeout">Open new window with longer timeout</button>
|
|
43
|
+
|
|
44
|
+
<button id="openTwoWindows">Open two windows</button>
|
|
45
|
+
|
|
46
|
+
<button id="doesNotOpenWindows">Does not open windows</button>
|
|
47
|
+
|
|
48
|
+
<iframe src="/frame_one" id="frameOne"></iframe>
|
|
49
|
+
|
|
50
|
+
<div id="scope">
|
|
51
|
+
<span>My scoped content</span>
|
|
52
|
+
</div>
|
|
53
|
+
</body>
|
|
54
|
+
</html>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>With Frames</title>
|
|
5
|
+
</head>
|
|
6
|
+
<body>
|
|
7
|
+
<div id="divInMainWindow">
|
|
8
|
+
This is the text for divInMainWindow
|
|
9
|
+
<iframe src="/frame_parent" id="innerParentFrame"></iframe>
|
|
10
|
+
</div>
|
|
11
|
+
<iframe src="/frame_one" id="frameOne" name="my frame one"></iframe>
|
|
12
|
+
<iframe src="/frame_two" id="frameTwo"></iframe>
|
|
13
|
+
<iframe src="/frame_parent" id="parentFrame"></iframe>
|
|
14
|
+
</body>
|
|
15
|
+
</html>
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Capybara
|
|
4
|
+
##
|
|
5
|
+
# The {Window} class represents a browser window.
|
|
6
|
+
#
|
|
7
|
+
# You can get an instance of the class by calling either of:
|
|
8
|
+
#
|
|
9
|
+
# * {Capybara::Session#windows}
|
|
10
|
+
# * {Capybara::Session#current_window}
|
|
11
|
+
# * {Capybara::Session#window_opened_by}
|
|
12
|
+
# * {Capybara::Session#switch_to_window}
|
|
13
|
+
#
|
|
14
|
+
# Note that some drivers (e.g. Selenium) support getting size of/resizing/closing only
|
|
15
|
+
# current window. So if you invoke such method for:
|
|
16
|
+
#
|
|
17
|
+
# * window that is current, Capybara will make 2 Selenium method invocations
|
|
18
|
+
# (get handle of current window + get size/resize/close).
|
|
19
|
+
# * window that is not current, Capybara will make 4 Selenium method invocations
|
|
20
|
+
# (get handle of current window + switch to given handle + get size/resize/close + switch to original handle)
|
|
21
|
+
#
|
|
22
|
+
class Window
|
|
23
|
+
# @return [String] a string that uniquely identifies window within session
|
|
24
|
+
attr_reader :handle
|
|
25
|
+
|
|
26
|
+
# @return [Capybara::Session] session that this window belongs to
|
|
27
|
+
attr_reader :session
|
|
28
|
+
|
|
29
|
+
# @api private
|
|
30
|
+
def initialize(session, handle)
|
|
31
|
+
@session = session
|
|
32
|
+
@driver = session.driver
|
|
33
|
+
@handle = handle
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# @return [Boolean] whether the window is not closed
|
|
38
|
+
def exists?
|
|
39
|
+
@driver.window_handles.include?(@handle)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
##
|
|
43
|
+
# @return [Boolean] whether the window is closed
|
|
44
|
+
def closed?
|
|
45
|
+
!exists?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
##
|
|
49
|
+
# @return [Boolean] whether this window is the window in which commands are being executed
|
|
50
|
+
def current?
|
|
51
|
+
@driver.current_window_handle == @handle
|
|
52
|
+
rescue @driver.no_such_window_error
|
|
53
|
+
false
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
##
|
|
57
|
+
# Close window.
|
|
58
|
+
#
|
|
59
|
+
# If this method was called for window that is current, then after calling this method
|
|
60
|
+
# future invocations of other Capybara methods should raise
|
|
61
|
+
# {Capybara::Driver::Base#no_such_window_error session.driver.no_such_window_error} until another window will be switched to.
|
|
62
|
+
#
|
|
63
|
+
# @!macro about_current
|
|
64
|
+
# If this method was called for window that is not current, then after calling this method
|
|
65
|
+
# current window should remain the same as it was before calling this method.
|
|
66
|
+
#
|
|
67
|
+
def close
|
|
68
|
+
@driver.close_window(handle)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
##
|
|
72
|
+
# Get window size.
|
|
73
|
+
#
|
|
74
|
+
# @macro about_current
|
|
75
|
+
# @return [Array<(Integer, Integer)>] an array with width and height
|
|
76
|
+
#
|
|
77
|
+
def size
|
|
78
|
+
@driver.window_size(handle)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
##
|
|
82
|
+
# Resize window.
|
|
83
|
+
#
|
|
84
|
+
# @macro about_current
|
|
85
|
+
# @param width [String] the new window width in pixels
|
|
86
|
+
# @param height [String] the new window height in pixels
|
|
87
|
+
#
|
|
88
|
+
def resize_to(width, height)
|
|
89
|
+
wait_for_stable_size { @driver.resize_window_to(handle, width, height) }
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
##
|
|
93
|
+
# Maximize window.
|
|
94
|
+
#
|
|
95
|
+
# If a particular driver (e.g. headless driver) doesn't have concept of maximizing it
|
|
96
|
+
# may not support this method.
|
|
97
|
+
#
|
|
98
|
+
# @macro about_current
|
|
99
|
+
#
|
|
100
|
+
def maximize
|
|
101
|
+
wait_for_stable_size { @driver.maximize_window(handle) }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
##
|
|
105
|
+
# Fullscreen window.
|
|
106
|
+
#
|
|
107
|
+
# If a particular driver doesn't have concept of fullscreen it may not support this method.
|
|
108
|
+
#
|
|
109
|
+
# @macro about_current
|
|
110
|
+
#
|
|
111
|
+
def fullscreen
|
|
112
|
+
@driver.fullscreen_window(handle)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def eql?(other)
|
|
116
|
+
other.is_a?(self.class) && @session == other.session && @handle == other.handle
|
|
117
|
+
end
|
|
118
|
+
alias_method :==, :eql?
|
|
119
|
+
|
|
120
|
+
def hash
|
|
121
|
+
@session.hash ^ @handle.hash
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def inspect
|
|
125
|
+
"#<Window @handle=#{@handle.inspect}>"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
private
|
|
129
|
+
|
|
130
|
+
def wait_for_stable_size(seconds = session.config.default_max_wait_time)
|
|
131
|
+
res = yield if block_given?
|
|
132
|
+
timer = Capybara::Helpers.timer(expire_in: seconds)
|
|
133
|
+
loop do
|
|
134
|
+
prev_size = size
|
|
135
|
+
sleep 0.025
|
|
136
|
+
return res if prev_size == size
|
|
137
|
+
break if timer.expired?
|
|
138
|
+
end
|
|
139
|
+
raise Capybara::WindowError, "Window size not stable within #{seconds} seconds."
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def raise_unless_current(what)
|
|
143
|
+
raise Capybara::WindowError, "#{what} not current window is not possible." unless current?
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
RSpec.describe Capybara do
|
|
6
|
+
describe '.string' do
|
|
7
|
+
let :string do
|
|
8
|
+
described_class.string <<-STRING
|
|
9
|
+
<html>
|
|
10
|
+
<head>
|
|
11
|
+
<title>simple_node</title>
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<svg><title>not document title</title></svg>
|
|
15
|
+
<div id="page">
|
|
16
|
+
<div id="content">
|
|
17
|
+
<h1 data="fantastic">Totally awesome</h1>
|
|
18
|
+
<p>Yes it is</p>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<form>
|
|
22
|
+
<input type="text" name="bleh" disabled="disabled"/>
|
|
23
|
+
<input type="text" name="meh"/>
|
|
24
|
+
</form>
|
|
25
|
+
|
|
26
|
+
<div id="footer">
|
|
27
|
+
<p>c2010</p>
|
|
28
|
+
<p>Jonas Nicklas</p>
|
|
29
|
+
<input type="text" name="foo" value="bar"/>
|
|
30
|
+
<select name="animal">
|
|
31
|
+
<option>Monkey</option>
|
|
32
|
+
<option selected="selected">Capybara</option>
|
|
33
|
+
</select>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div id="hidden" style="display: none">
|
|
37
|
+
<p id="secret">Secret</p>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<section>
|
|
41
|
+
<div class="subsection"></div>
|
|
42
|
+
</section>
|
|
43
|
+
</div>
|
|
44
|
+
</body>
|
|
45
|
+
</html>
|
|
46
|
+
STRING
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it 'allows using matchers' do
|
|
50
|
+
expect(string).to have_css('#page')
|
|
51
|
+
expect(string).not_to have_css('#does-not-exist')
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'allows using custom matchers' do
|
|
55
|
+
described_class.add_selector :lifeform do
|
|
56
|
+
xpath { |name| ".//option[contains(.,'#{name}')]" }
|
|
57
|
+
end
|
|
58
|
+
expect(string).to have_selector(:id, 'page')
|
|
59
|
+
expect(string).not_to have_selector(:id, 'does-not-exist')
|
|
60
|
+
expect(string).to have_selector(:lifeform, 'Monkey')
|
|
61
|
+
expect(string).not_to have_selector(:lifeform, 'Gorilla')
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'allows custom matcher using css' do
|
|
65
|
+
described_class.add_selector :section do
|
|
66
|
+
css { |css_class| "section .#{css_class}" }
|
|
67
|
+
end
|
|
68
|
+
expect(string).to have_selector(:section, 'subsection')
|
|
69
|
+
expect(string).not_to have_selector(:section, 'section_8')
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'allows using matchers with text option' do
|
|
73
|
+
expect(string).to have_css('h1', text: 'Totally awesome')
|
|
74
|
+
expect(string).not_to have_css('h1', text: 'Not so awesome')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'allows finding only visible nodes' do
|
|
78
|
+
expect(string.all(:css, '#secret', visible: true)).to be_empty
|
|
79
|
+
expect(string.all(:css, '#secret', visible: false).size).to eq(1)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it 'allows finding elements and extracting text from them' do
|
|
83
|
+
expect(string.find('//h1').text).to eq('Totally awesome')
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'allows finding elements and extracting attributes from them' do
|
|
87
|
+
expect(string.find('//h1')[:data]).to eq('fantastic')
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'allows finding elements and extracting the tag name from them' do
|
|
91
|
+
expect(string.find('//h1').tag_name).to eq('h1')
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it 'allows finding elements and extracting the path' do
|
|
95
|
+
expect(string.find('//h1').path).to eq('/html/body/div/div[1]/h1')
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it 'allows finding elements and extracting the value' do
|
|
99
|
+
expect(string.find('//div/input').value).to eq('bar')
|
|
100
|
+
expect(string.find('//select').value).to eq('Capybara')
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it 'allows finding elements and checking if they are visible' do
|
|
104
|
+
expect(string.find('//h1')).to be_visible
|
|
105
|
+
expect(string.find(:css, '#secret', visible: false)).not_to be_visible
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'allows finding elements and checking if they are disabled' do
|
|
109
|
+
expect(string.find('//form/input[@name="bleh"]')).to be_disabled
|
|
110
|
+
expect(string.find('//form/input[@name="meh"]')).not_to be_disabled
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'drops illegal fragments when using gumbo' do
|
|
114
|
+
skip 'libxml is less strict than Gumbo' unless Nokogiri.respond_to?(:HTML5)
|
|
115
|
+
expect(described_class.string('<td>1</td>')).not_to have_css('td')
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it 'can disable use of gumbo' do
|
|
119
|
+
skip "Test doesn't make sense unlesss nokogumbo is loaded" unless Nokogiri.respond_to?(:HTML5)
|
|
120
|
+
described_class.allow_gumbo = false
|
|
121
|
+
expect(described_class.string('<td>1</td>')).to have_css('td')
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
describe '#title' do
|
|
125
|
+
it 'returns the page title' do
|
|
126
|
+
expect(string.title).to eq('simple_node')
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
describe '#has_title?' do
|
|
131
|
+
it 'returns whether the page has the given title' do
|
|
132
|
+
expect(string.has_title?('simple_node')).to be_truthy
|
|
133
|
+
expect(string.has_title?('monkey')).to be_falsey
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it 'allows regexp matches' do
|
|
137
|
+
expect(string.has_title?(/s[a-z]+_node/)).to be_truthy
|
|
138
|
+
expect(string.has_title?(/monkey/)).to be_falsey
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
describe '#has_no_title?' do
|
|
143
|
+
it 'returns whether the page does not have the given title' do
|
|
144
|
+
expect(string.has_no_title?('simple_node')).to be_falsey
|
|
145
|
+
expect(string.has_no_title?('monkey')).to be_truthy
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it 'allows regexp matches' do
|
|
149
|
+
expect(string.has_no_title?(/s[a-z]+_node/)).to be_falsey
|
|
150
|
+
expect(string.has_no_title?(/monkey/)).to be_truthy
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|