mega-max-rb 0.0.1
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/capybara-3.40.0/History.md +2043 -0
- data/capybara-3.40.0/License.txt +22 -0
- data/capybara-3.40.0/README.md +1264 -0
- data/capybara-3.40.0/lib/capybara/config.rb +104 -0
- data/capybara-3.40.0/lib/capybara/cucumber.rb +27 -0
- data/capybara-3.40.0/lib/capybara/driver/base.rb +178 -0
- data/capybara-3.40.0/lib/capybara/driver/node.rb +143 -0
- data/capybara-3.40.0/lib/capybara/dsl.rb +59 -0
- data/capybara-3.40.0/lib/capybara/helpers.rb +127 -0
- data/capybara-3.40.0/lib/capybara/minitest/spec.rb +279 -0
- data/capybara-3.40.0/lib/capybara/minitest.rb +398 -0
- data/capybara-3.40.0/lib/capybara/node/actions.rb +420 -0
- data/capybara-3.40.0/lib/capybara/node/base.rb +144 -0
- data/capybara-3.40.0/lib/capybara/node/document.rb +48 -0
- data/capybara-3.40.0/lib/capybara/node/document_matchers.rb +67 -0
- data/capybara-3.40.0/lib/capybara/node/element.rb +613 -0
- data/capybara-3.40.0/lib/capybara/node/finders.rb +335 -0
- data/capybara-3.40.0/lib/capybara/node/matchers.rb +908 -0
- data/capybara-3.40.0/lib/capybara/node/simple.rb +216 -0
- data/capybara-3.40.0/lib/capybara/node/whitespace_normalizer.rb +81 -0
- data/capybara-3.40.0/lib/capybara/queries/active_element_query.rb +18 -0
- data/capybara-3.40.0/lib/capybara/queries/ancestor_query.rb +28 -0
- data/capybara-3.40.0/lib/capybara/queries/base_query.rb +106 -0
- data/capybara-3.40.0/lib/capybara/queries/current_path_query.rb +61 -0
- data/capybara-3.40.0/lib/capybara/queries/match_query.rb +26 -0
- data/capybara-3.40.0/lib/capybara/queries/selector_query.rb +761 -0
- data/capybara-3.40.0/lib/capybara/queries/sibling_query.rb +27 -0
- data/capybara-3.40.0/lib/capybara/queries/style_query.rb +45 -0
- data/capybara-3.40.0/lib/capybara/queries/text_query.rb +116 -0
- data/capybara-3.40.0/lib/capybara/queries/title_query.rb +39 -0
- data/capybara-3.40.0/lib/capybara/rack_test/browser.rb +200 -0
- data/capybara-3.40.0/lib/capybara/rack_test/css_handlers.rb +13 -0
- data/capybara-3.40.0/lib/capybara/rack_test/driver.rb +110 -0
- data/capybara-3.40.0/lib/capybara/rack_test/errors.rb +6 -0
- data/capybara-3.40.0/lib/capybara/rack_test/form.rb +149 -0
- data/capybara-3.40.0/lib/capybara/rack_test/node.rb +324 -0
- data/capybara-3.40.0/lib/capybara/rails.rb +16 -0
- data/capybara-3.40.0/lib/capybara/registration_container.rb +41 -0
- data/capybara-3.40.0/lib/capybara/registrations/drivers.rb +42 -0
- data/capybara-3.40.0/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
- data/capybara-3.40.0/lib/capybara/registrations/servers.rb +66 -0
- data/capybara-3.40.0/lib/capybara/result.rb +186 -0
- data/capybara-3.40.0/lib/capybara/rspec/features.rb +23 -0
- data/capybara-3.40.0/lib/capybara/rspec/matcher_proxies.rb +82 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/base.rb +113 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/become_closed.rb +33 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/compound.rb +88 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/have_selector.rb +69 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/have_text.rb +33 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/have_title.rb +29 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/match_selector.rb +27 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/match_style.rb +43 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/capybara-3.40.0/lib/capybara/rspec/matchers.rb +207 -0
- data/capybara-3.40.0/lib/capybara/rspec.rb +31 -0
- data/capybara-3.40.0/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/capybara-3.40.0/lib/capybara/selector/builders/xpath_builder.rb +71 -0
- data/capybara-3.40.0/lib/capybara/selector/css.rb +102 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/button.rb +68 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/checkbox.rb +26 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/css.rb +10 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/element.rb +28 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/field.rb +40 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/file_field.rb +13 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/frame.rb +17 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/id.rb +6 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/label.rb +62 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/link.rb +55 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/option.rb +27 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/radio_button.rb +27 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/select.rb +81 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/table.rb +109 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/table_row.rb +21 -0
- data/capybara-3.40.0/lib/capybara/selector/definition/xpath.rb +5 -0
- data/capybara-3.40.0/lib/capybara/selector/definition.rb +280 -0
- data/capybara-3.40.0/lib/capybara/selector/filter.rb +5 -0
- data/capybara-3.40.0/lib/capybara/selector/filter_set.rb +121 -0
- data/capybara-3.40.0/lib/capybara/selector/filters/base.rb +77 -0
- data/capybara-3.40.0/lib/capybara/selector/filters/expression_filter.rb +22 -0
- data/capybara-3.40.0/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/capybara-3.40.0/lib/capybara/selector/filters/node_filter.rb +31 -0
- data/capybara-3.40.0/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/capybara-3.40.0/lib/capybara/selector/selector.rb +159 -0
- data/capybara-3.40.0/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/capybara-3.40.0/lib/capybara/selector.rb +494 -0
- data/capybara-3.40.0/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
- data/capybara-3.40.0/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
- data/capybara-3.40.0/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
- data/capybara-3.40.0/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
- data/capybara-3.40.0/lib/capybara/selenium/driver.rb +517 -0
- data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
- data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
- data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/capybara-3.40.0/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/capybara-3.40.0/lib/capybara/selenium/extensions/find.rb +110 -0
- data/capybara-3.40.0/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
- data/capybara-3.40.0/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/capybara-3.40.0/lib/capybara/selenium/extensions/scroll.rb +76 -0
- data/capybara-3.40.0/lib/capybara/selenium/node.rb +636 -0
- data/capybara-3.40.0/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
- data/capybara-3.40.0/lib/capybara/selenium/nodes/edge_node.rb +110 -0
- data/capybara-3.40.0/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
- data/capybara-3.40.0/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/capybara-3.40.0/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/capybara-3.40.0/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/capybara-3.40.0/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/capybara-3.40.0/lib/capybara/selenium/patches/logs.rb +45 -0
- data/capybara-3.40.0/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
- data/capybara-3.40.0/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/capybara-3.40.0/lib/capybara/server/animation_disabler.rb +80 -0
- data/capybara-3.40.0/lib/capybara/server/checker.rb +44 -0
- data/capybara-3.40.0/lib/capybara/server/middleware.rb +71 -0
- data/capybara-3.40.0/lib/capybara/server.rb +126 -0
- data/capybara-3.40.0/lib/capybara/session/config.rb +128 -0
- data/capybara-3.40.0/lib/capybara/session/matchers.rb +87 -0
- data/capybara-3.40.0/lib/capybara/session.rb +951 -0
- data/capybara-3.40.0/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
- data/capybara-3.40.0/lib/capybara/spec/fixtures/capybara.jpg +3 -0
- data/capybara-3.40.0/lib/capybara/spec/fixtures/no_extension +1 -0
- data/capybara-3.40.0/lib/capybara/spec/fixtures/test_file.txt +1 -0
- data/capybara-3.40.0/lib/capybara/spec/public/jquery-ui.js +13 -0
- data/capybara-3.40.0/lib/capybara/spec/public/jquery.js +5 -0
- data/capybara-3.40.0/lib/capybara/spec/public/offset.js +6 -0
- data/capybara-3.40.0/lib/capybara/spec/public/test.js +284 -0
- data/capybara-3.40.0/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
- data/capybara-3.40.0/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
- data/capybara-3.40.0/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
- data/capybara-3.40.0/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/capybara-3.40.0/lib/capybara/spec/session/all_spec.rb +274 -0
- data/capybara-3.40.0/lib/capybara/spec/session/ancestor_spec.rb +88 -0
- data/capybara-3.40.0/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
- data/capybara-3.40.0/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
- data/capybara-3.40.0/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
- data/capybara-3.40.0/lib/capybara/spec/session/assert_style_spec.rb +26 -0
- data/capybara-3.40.0/lib/capybara/spec/session/assert_text_spec.rb +258 -0
- data/capybara-3.40.0/lib/capybara/spec/session/assert_title_spec.rb +93 -0
- data/capybara-3.40.0/lib/capybara/spec/session/attach_file_spec.rb +222 -0
- data/capybara-3.40.0/lib/capybara/spec/session/body_spec.rb +23 -0
- data/capybara-3.40.0/lib/capybara/spec/session/check_spec.rb +251 -0
- data/capybara-3.40.0/lib/capybara/spec/session/choose_spec.rb +127 -0
- data/capybara-3.40.0/lib/capybara/spec/session/click_button_spec.rb +517 -0
- data/capybara-3.40.0/lib/capybara/spec/session/click_link_or_button_spec.rb +138 -0
- data/capybara-3.40.0/lib/capybara/spec/session/click_link_spec.rb +240 -0
- data/capybara-3.40.0/lib/capybara/spec/session/current_scope_spec.rb +31 -0
- data/capybara-3.40.0/lib/capybara/spec/session/current_url_spec.rb +125 -0
- data/capybara-3.40.0/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
- data/capybara-3.40.0/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
- data/capybara-3.40.0/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
- data/capybara-3.40.0/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
- data/capybara-3.40.0/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
- data/capybara-3.40.0/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
- data/capybara-3.40.0/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
- data/capybara-3.40.0/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
- data/capybara-3.40.0/lib/capybara/spec/session/execute_script_spec.rb +28 -0
- data/capybara-3.40.0/lib/capybara/spec/session/fill_in_spec.rb +292 -0
- data/capybara-3.40.0/lib/capybara/spec/session/find_button_spec.rb +74 -0
- data/capybara-3.40.0/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
- data/capybara-3.40.0/lib/capybara/spec/session/find_field_spec.rb +113 -0
- data/capybara-3.40.0/lib/capybara/spec/session/find_link_spec.rb +80 -0
- data/capybara-3.40.0/lib/capybara/spec/session/find_spec.rb +545 -0
- data/capybara-3.40.0/lib/capybara/spec/session/first_spec.rb +156 -0
- data/capybara-3.40.0/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
- data/capybara-3.40.0/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
- data/capybara-3.40.0/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
- data/capybara-3.40.0/lib/capybara/spec/session/frame/within_frame_spec.rb +114 -0
- data/capybara-3.40.0/lib/capybara/spec/session/go_back_spec.rb +12 -0
- data/capybara-3.40.0/lib/capybara/spec/session/go_forward_spec.rb +14 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_button_spec.rb +150 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_css_spec.rb +375 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_current_path_spec.rb +151 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_field_spec.rb +389 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_link_spec.rb +79 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_select_spec.rb +316 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_selector_spec.rb +217 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_table_spec.rb +209 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_text_spec.rb +375 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_title_spec.rb +71 -0
- data/capybara-3.40.0/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
- data/capybara-3.40.0/lib/capybara/spec/session/headers_spec.rb +8 -0
- data/capybara-3.40.0/lib/capybara/spec/session/html_spec.rb +47 -0
- data/capybara-3.40.0/lib/capybara/spec/session/matches_style_spec.rb +37 -0
- data/capybara-3.40.0/lib/capybara/spec/session/node_spec.rb +1399 -0
- data/capybara-3.40.0/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/capybara-3.40.0/lib/capybara/spec/session/refresh_spec.rb +34 -0
- data/capybara-3.40.0/lib/capybara/spec/session/reset_session_spec.rb +161 -0
- data/capybara-3.40.0/lib/capybara/spec/session/response_code_spec.rb +8 -0
- data/capybara-3.40.0/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
- data/capybara-3.40.0/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
- data/capybara-3.40.0/lib/capybara/spec/session/save_page_spec.rb +110 -0
- data/capybara-3.40.0/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
- data/capybara-3.40.0/lib/capybara/spec/session/screenshot_spec.rb +18 -0
- data/capybara-3.40.0/lib/capybara/spec/session/scroll_spec.rb +119 -0
- data/capybara-3.40.0/lib/capybara/spec/session/select_spec.rb +229 -0
- data/capybara-3.40.0/lib/capybara/spec/session/selectors_spec.rb +98 -0
- data/capybara-3.40.0/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/capybara-3.40.0/lib/capybara/spec/session/text_spec.rb +74 -0
- data/capybara-3.40.0/lib/capybara/spec/session/title_spec.rb +29 -0
- data/capybara-3.40.0/lib/capybara/spec/session/uncheck_spec.rb +100 -0
- data/capybara-3.40.0/lib/capybara/spec/session/unselect_spec.rb +116 -0
- data/capybara-3.40.0/lib/capybara/spec/session/visit_spec.rb +224 -0
- data/capybara-3.40.0/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
- data/capybara-3.40.0/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
- data/capybara-3.40.0/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
- data/capybara-3.40.0/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
- data/capybara-3.40.0/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
- data/capybara-3.40.0/lib/capybara/spec/session/window/window_spec.rb +203 -0
- data/capybara-3.40.0/lib/capybara/spec/session/window/windows_spec.rb +34 -0
- data/capybara-3.40.0/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
- data/capybara-3.40.0/lib/capybara/spec/session/within_spec.rb +212 -0
- data/capybara-3.40.0/lib/capybara/spec/spec_helper.rb +141 -0
- data/capybara-3.40.0/lib/capybara/spec/test_app.rb +305 -0
- data/capybara-3.40.0/lib/capybara/spec/views/animated.erb +49 -0
- data/capybara-3.40.0/lib/capybara/spec/views/buttons.erb +5 -0
- data/capybara-3.40.0/lib/capybara/spec/views/fieldsets.erb +30 -0
- data/capybara-3.40.0/lib/capybara/spec/views/form.erb +738 -0
- data/capybara-3.40.0/lib/capybara/spec/views/frame_child.erb +18 -0
- data/capybara-3.40.0/lib/capybara/spec/views/frame_one.erb +10 -0
- data/capybara-3.40.0/lib/capybara/spec/views/frame_parent.erb +9 -0
- data/capybara-3.40.0/lib/capybara/spec/views/frame_two.erb +9 -0
- data/capybara-3.40.0/lib/capybara/spec/views/header_links.erb +8 -0
- data/capybara-3.40.0/lib/capybara/spec/views/host_links.erb +13 -0
- data/capybara-3.40.0/lib/capybara/spec/views/initial_alert.erb +11 -0
- data/capybara-3.40.0/lib/capybara/spec/views/layout.erb +10 -0
- data/capybara-3.40.0/lib/capybara/spec/views/obscured.erb +47 -0
- data/capybara-3.40.0/lib/capybara/spec/views/offset.erb +33 -0
- data/capybara-3.40.0/lib/capybara/spec/views/path.erb +13 -0
- data/capybara-3.40.0/lib/capybara/spec/views/popup_one.erb +9 -0
- data/capybara-3.40.0/lib/capybara/spec/views/popup_two.erb +9 -0
- data/capybara-3.40.0/lib/capybara/spec/views/postback.erb +14 -0
- data/capybara-3.40.0/lib/capybara/spec/views/react.erb +45 -0
- data/capybara-3.40.0/lib/capybara/spec/views/scroll.erb +21 -0
- data/capybara-3.40.0/lib/capybara/spec/views/spatial.erb +31 -0
- data/capybara-3.40.0/lib/capybara/spec/views/tables.erb +130 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_animation.erb +81 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_base_tag.erb +11 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_count.erb +8 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_dragula.erb +24 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_fixed_header_footer.erb +18 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_hover.erb +24 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_html.erb +210 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_html_entities.erb +2 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_js.erb +162 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_namespace.erb +21 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_scope.erb +42 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_shadow.erb +31 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_simple_html.erb +2 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_slow_unload.erb +18 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_unload_alert.erb +15 -0
- data/capybara-3.40.0/lib/capybara/spec/views/with_windows.erb +54 -0
- data/capybara-3.40.0/lib/capybara/spec/views/within_frames.erb +15 -0
- data/capybara-3.40.0/lib/capybara/version.rb +5 -0
- data/capybara-3.40.0/lib/capybara/window.rb +142 -0
- data/capybara-3.40.0/lib/capybara.rb +521 -0
- data/capybara-3.40.0/spec/basic_node_spec.rb +168 -0
- data/capybara-3.40.0/spec/capybara_spec.rb +124 -0
- data/capybara-3.40.0/spec/counter_spec.rb +35 -0
- data/capybara-3.40.0/spec/css_builder_spec.rb +101 -0
- data/capybara-3.40.0/spec/css_splitter_spec.rb +38 -0
- data/capybara-3.40.0/spec/dsl_spec.rb +291 -0
- data/capybara-3.40.0/spec/filter_set_spec.rb +46 -0
- data/capybara-3.40.0/spec/fixtures/capybara.csv +1 -0
- data/capybara-3.40.0/spec/fixtures/certificate.pem +25 -0
- data/capybara-3.40.0/spec/fixtures/key.pem +27 -0
- data/capybara-3.40.0/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
- data/capybara-3.40.0/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
- data/capybara-3.40.0/spec/minitest_spec.rb +175 -0
- data/capybara-3.40.0/spec/minitest_spec_spec.rb +166 -0
- data/capybara-3.40.0/spec/per_session_config_spec.rb +68 -0
- data/capybara-3.40.0/spec/rack_test_spec.rb +297 -0
- data/capybara-3.40.0/spec/regexp_dissassembler_spec.rb +250 -0
- data/capybara-3.40.0/spec/result_spec.rb +202 -0
- data/capybara-3.40.0/spec/rspec/features_spec.rb +101 -0
- data/capybara-3.40.0/spec/rspec/scenarios_spec.rb +23 -0
- data/capybara-3.40.0/spec/rspec/shared_spec_matchers.rb +983 -0
- data/capybara-3.40.0/spec/rspec/views_spec.rb +14 -0
- data/capybara-3.40.0/spec/rspec_matchers_spec.rb +87 -0
- data/capybara-3.40.0/spec/rspec_spec.rb +149 -0
- data/capybara-3.40.0/spec/sauce_spec_chrome.rb +43 -0
- data/capybara-3.40.0/spec/selector_spec.rb +528 -0
- data/capybara-3.40.0/spec/selenium_spec_chrome.rb +209 -0
- data/capybara-3.40.0/spec/selenium_spec_chrome_remote.rb +96 -0
- data/capybara-3.40.0/spec/selenium_spec_edge.rb +60 -0
- data/capybara-3.40.0/spec/selenium_spec_firefox.rb +228 -0
- data/capybara-3.40.0/spec/selenium_spec_firefox_remote.rb +94 -0
- data/capybara-3.40.0/spec/selenium_spec_ie.rb +149 -0
- data/capybara-3.40.0/spec/selenium_spec_safari.rb +162 -0
- data/capybara-3.40.0/spec/server_spec.rb +315 -0
- data/capybara-3.40.0/spec/session_spec.rb +91 -0
- data/capybara-3.40.0/spec/shared_selenium_node.rb +79 -0
- data/capybara-3.40.0/spec/shared_selenium_session.rb +566 -0
- data/capybara-3.40.0/spec/spec_helper.rb +133 -0
- data/capybara-3.40.0/spec/whitespace_normalizer_spec.rb +54 -0
- data/capybara-3.40.0/spec/xpath_builder_spec.rb +93 -0
- data/mega-max-rb.gemspec +12 -0
- metadata +358 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Capybara
|
|
4
|
+
module RSpecMatchers
|
|
5
|
+
module SpatialSugar
|
|
6
|
+
def above(el)
|
|
7
|
+
options[:above] = el
|
|
8
|
+
self
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def below(el)
|
|
12
|
+
options[:below] = el
|
|
13
|
+
self
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def left_of(el)
|
|
17
|
+
options[:left_of] = el
|
|
18
|
+
self
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def right_of(el)
|
|
22
|
+
options[:right_of] = el
|
|
23
|
+
self
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def near(el)
|
|
27
|
+
options[:near] = el
|
|
28
|
+
self
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def options
|
|
34
|
+
# (@args.last.is_a?(Hash) ? @args : @args.push({})).last
|
|
35
|
+
@kw_args
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'capybara/rspec/matchers/have_selector'
|
|
4
|
+
require 'capybara/rspec/matchers/have_ancestor'
|
|
5
|
+
require 'capybara/rspec/matchers/have_sibling'
|
|
6
|
+
require 'capybara/rspec/matchers/match_selector'
|
|
7
|
+
require 'capybara/rspec/matchers/have_current_path'
|
|
8
|
+
require 'capybara/rspec/matchers/match_style'
|
|
9
|
+
require 'capybara/rspec/matchers/have_text'
|
|
10
|
+
require 'capybara/rspec/matchers/have_title'
|
|
11
|
+
require 'capybara/rspec/matchers/become_closed'
|
|
12
|
+
|
|
13
|
+
module Capybara
|
|
14
|
+
module RSpecMatchers
|
|
15
|
+
# RSpec matcher for whether the element(s) matching a given selector exist.
|
|
16
|
+
#
|
|
17
|
+
# @see Capybara::Node::Matchers#assert_selector
|
|
18
|
+
def have_selector(...)
|
|
19
|
+
Matchers::HaveSelector.new(...)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# RSpec matcher for whether the element(s) matching a group of selectors exist.
|
|
23
|
+
#
|
|
24
|
+
# @see Capybara::Node::Matchers#assert_all_of_selectors
|
|
25
|
+
def have_all_of_selectors(...)
|
|
26
|
+
Matchers::HaveAllSelectors.new(...)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# RSpec matcher for whether no element(s) matching a group of selectors exist.
|
|
30
|
+
#
|
|
31
|
+
# @see Capybara::Node::Matchers#assert_none_of_selectors
|
|
32
|
+
def have_none_of_selectors(...)
|
|
33
|
+
Matchers::HaveNoSelectors.new(...)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# RSpec matcher for whether the element(s) matching any of a group of selectors exist.
|
|
37
|
+
#
|
|
38
|
+
# @see Capybara::Node::Matchers#assert_any_of_selectors
|
|
39
|
+
def have_any_of_selectors(...)
|
|
40
|
+
Matchers::HaveAnySelectors.new(...)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# RSpec matcher for whether the current element matches a given selector.
|
|
44
|
+
#
|
|
45
|
+
# @see Capybara::Node::Matchers#assert_matches_selector
|
|
46
|
+
def match_selector(...)
|
|
47
|
+
Matchers::MatchSelector.new(...)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
%i[css xpath].each do |selector|
|
|
51
|
+
define_method "have_#{selector}" do |expr, **options, &optional_filter_block|
|
|
52
|
+
Matchers::HaveSelector.new(selector, expr, **options, &optional_filter_block)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
define_method "match_#{selector}" do |expr, **options, &optional_filter_block|
|
|
56
|
+
Matchers::MatchSelector.new(selector, expr, **options, &optional_filter_block)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# @!method have_xpath(xpath, **options, &optional_filter_block)
|
|
61
|
+
# RSpec matcher for whether elements(s) matching a given xpath selector exist.
|
|
62
|
+
#
|
|
63
|
+
# @see Capybara::Node::Matchers#has_xpath?
|
|
64
|
+
|
|
65
|
+
# @!method have_css(css, **options, &optional_filter_block)
|
|
66
|
+
# RSpec matcher for whether elements(s) matching a given css selector exist
|
|
67
|
+
#
|
|
68
|
+
# @see Capybara::Node::Matchers#has_css?
|
|
69
|
+
|
|
70
|
+
# @!method match_xpath(xpath, **options, &optional_filter_block)
|
|
71
|
+
# RSpec matcher for whether the current element matches a given xpath selector.
|
|
72
|
+
#
|
|
73
|
+
# @see Capybara::Node::Matchers#matches_xpath?
|
|
74
|
+
|
|
75
|
+
# @!method match_css(css, **options, &optional_filter_block)
|
|
76
|
+
# RSpec matcher for whether the current element matches a given css selector.
|
|
77
|
+
#
|
|
78
|
+
# @see Capybara::Node::Matchers#matches_css?
|
|
79
|
+
|
|
80
|
+
%i[link button field select table element].each do |selector|
|
|
81
|
+
define_method "have_#{selector}" do |locator = nil, **options, &optional_filter_block|
|
|
82
|
+
Matchers::HaveSelector.new(selector, locator, **options, &optional_filter_block)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# @!method have_element(locator = nil, **options, &optional_filter_block)
|
|
87
|
+
# RSpec matcher for elements.
|
|
88
|
+
#
|
|
89
|
+
# @see Capybara::Node::Matchers#has_element?
|
|
90
|
+
|
|
91
|
+
# @!method have_link(locator = nil, **options, &optional_filter_block)
|
|
92
|
+
# RSpec matcher for links.
|
|
93
|
+
#
|
|
94
|
+
# @see Capybara::Node::Matchers#has_link?
|
|
95
|
+
|
|
96
|
+
# @!method have_button(locator = nil, **options, &optional_filter_block)
|
|
97
|
+
# RSpec matcher for buttons.
|
|
98
|
+
#
|
|
99
|
+
# @see Capybara::Node::Matchers#has_button?
|
|
100
|
+
|
|
101
|
+
# @!method have_field(locator = nil, **options, &optional_filter_block)
|
|
102
|
+
# RSpec matcher for form fields.
|
|
103
|
+
#
|
|
104
|
+
# @see Capybara::Node::Matchers#has_field?
|
|
105
|
+
|
|
106
|
+
# @!method have_select(locator = nil, **options, &optional_filter_block)
|
|
107
|
+
# RSpec matcher for select elements.
|
|
108
|
+
#
|
|
109
|
+
# @see Capybara::Node::Matchers#has_select?
|
|
110
|
+
|
|
111
|
+
# @!method have_table(locator = nil, **options, &optional_filter_block)
|
|
112
|
+
# RSpec matcher for table elements.
|
|
113
|
+
#
|
|
114
|
+
# @see Capybara::Node::Matchers#has_table?
|
|
115
|
+
|
|
116
|
+
%i[checked unchecked].each do |state|
|
|
117
|
+
define_method "have_#{state}_field" do |locator = nil, **options, &optional_filter_block|
|
|
118
|
+
Matchers::HaveSelector.new(:field, locator, **options.merge(state => true), &optional_filter_block)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# @!method have_checked_field(locator = nil, **options, &optional_filter_block)
|
|
123
|
+
# RSpec matcher for checked fields.
|
|
124
|
+
#
|
|
125
|
+
# @see Capybara::Node::Matchers#has_checked_field?
|
|
126
|
+
|
|
127
|
+
# @!method have_unchecked_field(locator = nil, **options, &optional_filter_block)
|
|
128
|
+
# RSpec matcher for unchecked fields.
|
|
129
|
+
#
|
|
130
|
+
# @see Capybara::Node::Matchers#has_unchecked_field?
|
|
131
|
+
|
|
132
|
+
# RSpec matcher for text content.
|
|
133
|
+
#
|
|
134
|
+
# @see Capybara::Node::Matchers#assert_text
|
|
135
|
+
def have_text(text_or_type, *args, **options)
|
|
136
|
+
Matchers::HaveText.new(text_or_type, *args, **options)
|
|
137
|
+
end
|
|
138
|
+
alias_method :have_content, :have_text
|
|
139
|
+
|
|
140
|
+
def have_title(title, **options)
|
|
141
|
+
Matchers::HaveTitle.new(title, **options)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# RSpec matcher for the current path.
|
|
145
|
+
#
|
|
146
|
+
# @see Capybara::SessionMatchers#assert_current_path
|
|
147
|
+
def have_current_path(path, **options, &optional_filter_block)
|
|
148
|
+
Matchers::HaveCurrentPath.new(path, **options, &optional_filter_block)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# RSpec matcher for element style.
|
|
152
|
+
#
|
|
153
|
+
# @see Capybara::Node::Matchers#matches_style?
|
|
154
|
+
def match_style(styles = nil, **options)
|
|
155
|
+
styles, options = options, {} if styles.nil?
|
|
156
|
+
Matchers::MatchStyle.new(styles, **options)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
##
|
|
160
|
+
# @deprecated
|
|
161
|
+
#
|
|
162
|
+
def have_style(styles = nil, **options)
|
|
163
|
+
Capybara::Helpers.warn "DEPRECATED: have_style is deprecated, please use match_style : #{Capybara::Helpers.filter_backtrace(caller)}"
|
|
164
|
+
match_style(styles, **options)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
%w[selector css xpath text title current_path link button
|
|
168
|
+
field checked_field unchecked_field select table
|
|
169
|
+
sibling ancestor element].each do |matcher_type|
|
|
170
|
+
define_method "have_no_#{matcher_type}" do |*args, **kw_args, &optional_filter_block|
|
|
171
|
+
Matchers::NegatedMatcher.new(send("have_#{matcher_type}", *args, **kw_args, &optional_filter_block))
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
alias_method :have_no_content, :have_no_text
|
|
175
|
+
|
|
176
|
+
%w[selector css xpath].each do |matcher_type|
|
|
177
|
+
define_method "not_match_#{matcher_type}" do |*args, **kw_args, &optional_filter_block|
|
|
178
|
+
Matchers::NegatedMatcher.new(send("match_#{matcher_type}", *args, **kw_args, &optional_filter_block))
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# RSpec matcher for whether sibling element(s) matching a given selector exist.
|
|
183
|
+
#
|
|
184
|
+
# @see Capybara::Node::Matchers#assert_sibling
|
|
185
|
+
def have_sibling(...)
|
|
186
|
+
Matchers::HaveSibling.new(...)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# RSpec matcher for whether ancestor element(s) matching a given selector exist.
|
|
190
|
+
#
|
|
191
|
+
# @see Capybara::Node::Matchers#assert_ancestor
|
|
192
|
+
def have_ancestor(...)
|
|
193
|
+
Matchers::HaveAncestor.new(...)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
##
|
|
197
|
+
# Wait for window to become closed.
|
|
198
|
+
#
|
|
199
|
+
# @example
|
|
200
|
+
# expect(window).to become_closed(wait: 0.8)
|
|
201
|
+
#
|
|
202
|
+
# @option options [Numeric] :wait Maximum wait time. Defaults to {Capybara.configure default_max_wait_time}
|
|
203
|
+
def become_closed(**options)
|
|
204
|
+
Matchers::BecomeClosed.new(options)
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rspec/core'
|
|
4
|
+
require 'capybara/dsl'
|
|
5
|
+
require 'capybara/rspec/matchers'
|
|
6
|
+
require 'capybara/rspec/features'
|
|
7
|
+
require 'capybara/rspec/matcher_proxies'
|
|
8
|
+
|
|
9
|
+
RSpec.configure do |config|
|
|
10
|
+
config.include Capybara::DSL, type: :feature
|
|
11
|
+
config.include Capybara::RSpecMatchers, type: :feature
|
|
12
|
+
config.include Capybara::DSL, type: :system
|
|
13
|
+
config.include Capybara::RSpecMatchers, type: :system
|
|
14
|
+
config.include Capybara::RSpecMatchers, type: :view
|
|
15
|
+
|
|
16
|
+
# The before and after blocks must run instantaneously, because Capybara
|
|
17
|
+
# might not actually be used in all examples where it's included.
|
|
18
|
+
config.after do
|
|
19
|
+
if self.class.include?(Capybara::DSL)
|
|
20
|
+
Capybara.reset_sessions!
|
|
21
|
+
Capybara.use_default_driver
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
config.before do |example|
|
|
26
|
+
if self.class.include?(Capybara::DSL)
|
|
27
|
+
Capybara.current_driver = Capybara.javascript_driver if example.metadata[:js]
|
|
28
|
+
Capybara.current_driver = example.metadata[:driver] if example.metadata[:driver]
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'xpath'
|
|
4
|
+
|
|
5
|
+
module Capybara
|
|
6
|
+
class Selector
|
|
7
|
+
# @api private
|
|
8
|
+
class CSSBuilder
|
|
9
|
+
def initialize(expression)
|
|
10
|
+
@expression = expression || ''
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :expression
|
|
14
|
+
|
|
15
|
+
def add_attribute_conditions(**attributes)
|
|
16
|
+
@expression = attributes.inject(expression) do |css, (name, value)|
|
|
17
|
+
conditions = if name == :class
|
|
18
|
+
class_conditions(value)
|
|
19
|
+
elsif value.is_a? Regexp
|
|
20
|
+
regexp_conditions(name, value)
|
|
21
|
+
else
|
|
22
|
+
[attribute_conditions(name => value)]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
::Capybara::Selector::CSS.split(css).map do |sel|
|
|
26
|
+
next sel if conditions.empty?
|
|
27
|
+
|
|
28
|
+
conditions.map { |cond| sel + cond }.join(', ')
|
|
29
|
+
end.join(', ')
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def regexp_conditions(name, value)
|
|
36
|
+
Selector::RegexpDisassembler.new(value).alternated_substrings.map do |strs|
|
|
37
|
+
strs.map do |str|
|
|
38
|
+
"[#{name}*='#{str}'#{' i' if value.casefold?}]"
|
|
39
|
+
end.join
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def attribute_conditions(attributes)
|
|
44
|
+
attributes.map do |attribute, value|
|
|
45
|
+
case value
|
|
46
|
+
when XPath::Expression
|
|
47
|
+
raise ArgumentError, "XPath expressions are not supported for the :#{attribute} filter with CSS based selectors"
|
|
48
|
+
when Regexp
|
|
49
|
+
Selector::RegexpDisassembler.new(value).substrings.map do |str|
|
|
50
|
+
"[#{attribute}*='#{str}'#{' i' if value.casefold?}]"
|
|
51
|
+
end.join
|
|
52
|
+
when true
|
|
53
|
+
"[#{attribute}]"
|
|
54
|
+
when false
|
|
55
|
+
':not([attribute])'
|
|
56
|
+
else
|
|
57
|
+
if attribute == :id
|
|
58
|
+
"##{::Capybara::Selector::CSS.escape(value)}"
|
|
59
|
+
else
|
|
60
|
+
"[#{attribute}='#{value}']"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end.join
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def class_conditions(classes)
|
|
67
|
+
case classes
|
|
68
|
+
when XPath::Expression
|
|
69
|
+
raise ArgumentError, 'XPath expressions are not supported for the :class filter with CSS based selectors'
|
|
70
|
+
when Regexp
|
|
71
|
+
Selector::RegexpDisassembler.new(classes).alternated_substrings.map do |strs|
|
|
72
|
+
strs.map do |str|
|
|
73
|
+
"[class*='#{str}'#{' i' if classes.casefold?}]"
|
|
74
|
+
end.join
|
|
75
|
+
end
|
|
76
|
+
else
|
|
77
|
+
cls = Array(classes).reject { |c| c.is_a? Regexp }.group_by { |cl| cl.match?(/^!(?!!!)/) }
|
|
78
|
+
[(cls[false].to_a.map { |cl| ".#{Capybara::Selector::CSS.escape(cl.sub(/^!!/, ''))}" } +
|
|
79
|
+
cls[true].to_a.map { |cl| ":not(.#{Capybara::Selector::CSS.escape(cl.slice(1..))})" }).join]
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'xpath'
|
|
4
|
+
|
|
5
|
+
module Capybara
|
|
6
|
+
class Selector
|
|
7
|
+
# @api private
|
|
8
|
+
class XPathBuilder
|
|
9
|
+
def initialize(expression)
|
|
10
|
+
@expression = expression || ''
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :expression
|
|
14
|
+
|
|
15
|
+
def add_attribute_conditions(**conditions)
|
|
16
|
+
@expression = conditions.inject(expression) do |xp, (name, value)|
|
|
17
|
+
conditions = name == :class ? class_conditions(value) : attribute_conditions(name => value)
|
|
18
|
+
return xp if conditions.nil?
|
|
19
|
+
|
|
20
|
+
if xp.is_a? XPath::Expression
|
|
21
|
+
xp[conditions]
|
|
22
|
+
else
|
|
23
|
+
"(#{xp})[#{conditions}]"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def attribute_conditions(attributes)
|
|
31
|
+
attributes.map do |attribute, value|
|
|
32
|
+
case value
|
|
33
|
+
when XPath::Expression
|
|
34
|
+
XPath.attr(attribute)[value]
|
|
35
|
+
when Regexp
|
|
36
|
+
XPath.attr(attribute)[regexp_to_xpath_conditions(value)]
|
|
37
|
+
when true
|
|
38
|
+
XPath.attr(attribute)
|
|
39
|
+
when false, nil
|
|
40
|
+
!XPath.attr(attribute)
|
|
41
|
+
else
|
|
42
|
+
XPath.attr(attribute) == value.to_s
|
|
43
|
+
end
|
|
44
|
+
end.reduce(:&)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def class_conditions(classes)
|
|
48
|
+
case classes
|
|
49
|
+
when XPath::Expression, Regexp
|
|
50
|
+
attribute_conditions(class: classes)
|
|
51
|
+
else
|
|
52
|
+
Array(classes).reject { |c| c.is_a? Regexp }.map do |klass|
|
|
53
|
+
if klass.match?(/^!(?!!!)/)
|
|
54
|
+
!XPath.attr(:class).contains_word(klass.slice(1..))
|
|
55
|
+
else
|
|
56
|
+
XPath.attr(:class).contains_word(klass.sub(/^!!/, ''))
|
|
57
|
+
end
|
|
58
|
+
end.reduce(:&)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def regexp_to_xpath_conditions(regexp)
|
|
63
|
+
condition = XPath.current
|
|
64
|
+
condition = condition.uppercase if regexp.casefold?
|
|
65
|
+
Selector::RegexpDisassembler.new(regexp).alternated_substrings.map do |strs|
|
|
66
|
+
strs.map { |str| condition.contains(str) }.reduce(:&)
|
|
67
|
+
end.reduce(:|)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'capybara/selector/selector'
|
|
4
|
+
|
|
5
|
+
module Capybara
|
|
6
|
+
class Selector
|
|
7
|
+
class CSS
|
|
8
|
+
def self.escape(str)
|
|
9
|
+
value = str.dup
|
|
10
|
+
out = +''
|
|
11
|
+
out << value.slice!(0...1) if value.match?(/^[-_]/)
|
|
12
|
+
out << (value[0].match?(NMSTART) ? value.slice!(0...1) : escape_char(value.slice!(0...1)))
|
|
13
|
+
out << value.gsub(/[^a-zA-Z0-9_-]/) { |char| escape_char char }
|
|
14
|
+
out
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.escape_char(char)
|
|
18
|
+
char.match?(%r{[ -/:-~]}) ? "\\#{char}" : format('\\%06<hex>x', hex: char.ord)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.split(css)
|
|
22
|
+
Splitter.new.split(css)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
S = '\u{80}-\u{D7FF}\u{E000}-\u{FFFD}\u{10000}-\u{10FFFF}'
|
|
26
|
+
H = /[0-9a-fA-F]/
|
|
27
|
+
UNICODE = /\\#{H}{1,6}[ \t\r\n\f]?/
|
|
28
|
+
NONASCII = /[#{S}]/
|
|
29
|
+
ESCAPE = /#{UNICODE}|\\[ -~#{S}]/
|
|
30
|
+
NMSTART = /[_a-zA-Z]|#{NONASCII}|#{ESCAPE}/
|
|
31
|
+
|
|
32
|
+
class Splitter
|
|
33
|
+
def split(css)
|
|
34
|
+
selectors = []
|
|
35
|
+
StringIO.open(css.to_s) do |str|
|
|
36
|
+
selector = +''
|
|
37
|
+
while (char = str.getc)
|
|
38
|
+
case char
|
|
39
|
+
when '['
|
|
40
|
+
selector << parse_square(str)
|
|
41
|
+
when '('
|
|
42
|
+
selector << parse_paren(str)
|
|
43
|
+
when '"', "'"
|
|
44
|
+
selector << parse_string(char, str)
|
|
45
|
+
when '\\'
|
|
46
|
+
selector << (char + str.getc)
|
|
47
|
+
when ','
|
|
48
|
+
selectors << selector.strip
|
|
49
|
+
selector.clear
|
|
50
|
+
else
|
|
51
|
+
selector << char
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
selectors << selector.strip
|
|
55
|
+
end
|
|
56
|
+
selectors
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def parse_square(strio)
|
|
62
|
+
parse_block('[', ']', strio)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def parse_paren(strio)
|
|
66
|
+
parse_block('(', ')', strio)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def parse_block(start, final, strio)
|
|
70
|
+
block = start
|
|
71
|
+
while (char = strio.getc)
|
|
72
|
+
case char
|
|
73
|
+
when final
|
|
74
|
+
return block + char
|
|
75
|
+
when '\\'
|
|
76
|
+
block += char + strio.getc
|
|
77
|
+
when '"', "'"
|
|
78
|
+
block += parse_string(char, strio)
|
|
79
|
+
else
|
|
80
|
+
block += char
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
raise ArgumentError, "Invalid CSS Selector - Block end '#{final}' not found"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def parse_string(quote, strio)
|
|
87
|
+
string = quote
|
|
88
|
+
while (char = strio.getc)
|
|
89
|
+
string += char
|
|
90
|
+
case char
|
|
91
|
+
when quote
|
|
92
|
+
return string
|
|
93
|
+
when '\\'
|
|
94
|
+
string += strio.getc
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
raise ArgumentError, 'Invalid CSS Selector - string end not found'
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara.add_selector(:button, locator_type: [String, Symbol]) do
|
|
4
|
+
xpath(:value, :title, :type, :name) do |locator, **options|
|
|
5
|
+
input_btn_xpath = XPath.descendant(:input)[XPath.attr(:type).one_of('submit', 'reset', 'image', 'button')]
|
|
6
|
+
btn_xpath = XPath.descendant(:button)
|
|
7
|
+
aria_btn_xpath = XPath.descendant[XPath.attr(:role).equals('button')]
|
|
8
|
+
image_btn_xpath = XPath.descendant(:input)[XPath.attr(:type) == 'image']
|
|
9
|
+
|
|
10
|
+
unless locator.nil?
|
|
11
|
+
locator = locator.to_s
|
|
12
|
+
locator_matchers = combine_locators(locator, config: self)
|
|
13
|
+
btn_matchers = locator_matchers |
|
|
14
|
+
XPath.string.n.is(locator) |
|
|
15
|
+
XPath.descendant(:img)[XPath.attr(:alt).is(locator)]
|
|
16
|
+
|
|
17
|
+
label_contains_xpath = locate_label(locator).descendant[labellable_elements]
|
|
18
|
+
input_btn_xpath = input_btn_xpath[locator_matchers]
|
|
19
|
+
btn_xpath = btn_xpath[btn_matchers]
|
|
20
|
+
aria_btn_xpath = aria_btn_xpath[btn_matchers]
|
|
21
|
+
|
|
22
|
+
alt_matches = XPath.attr(:alt).is(locator)
|
|
23
|
+
alt_matches |= XPath.attr(:'aria-label').is(locator) if enable_aria_label
|
|
24
|
+
image_btn_xpath = image_btn_xpath[alt_matches]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
btn_xpaths = [input_btn_xpath, btn_xpath, image_btn_xpath, label_contains_xpath].compact
|
|
28
|
+
btn_xpaths << aria_btn_xpath if enable_aria_role
|
|
29
|
+
|
|
30
|
+
%i[value title type].inject(btn_xpaths.inject(&:union)) do |memo, ef|
|
|
31
|
+
memo.where(find_by_attr(ef, options[ef]))
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
node_filter(:disabled, :boolean, default: false, skip_if: :all) { |node, value| !(value ^ node.disabled?) }
|
|
36
|
+
expression_filter(:disabled) { |xpath, val| val ? xpath : xpath[~XPath.attr(:disabled)] }
|
|
37
|
+
|
|
38
|
+
node_filter(:name) { |node, value| !value.is_a?(Regexp) || value.match?(node[:name]) }
|
|
39
|
+
expression_filter(:name) do |xpath, val|
|
|
40
|
+
builder(xpath).add_attribute_conditions(name: val)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe_expression_filters do |disabled: nil, **options|
|
|
44
|
+
desc = +''
|
|
45
|
+
desc << ' that is not disabled' if disabled == false
|
|
46
|
+
desc << describe_all_expression_filters(**options)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe_node_filters do |disabled: nil, **|
|
|
50
|
+
' that is disabled' if disabled == true
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def combine_locators(locator, config:)
|
|
54
|
+
[
|
|
55
|
+
XPath.attr(:id).equals(locator),
|
|
56
|
+
XPath.attr(:name).equals(locator),
|
|
57
|
+
XPath.attr(:value).is(locator),
|
|
58
|
+
XPath.attr(:title).is(locator),
|
|
59
|
+
(XPath.attr(:id) == XPath.anywhere(:label)[XPath.string.n.is(locator)].attr(:for)),
|
|
60
|
+
(XPath.attr(:'aria-label').is(locator) if config.enable_aria_label),
|
|
61
|
+
(XPath.attr(config.test_id) == locator if config.test_id)
|
|
62
|
+
].compact.inject(&:|)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def labellable_elements
|
|
66
|
+
(XPath.self(:input) & XPath.attr(:type).one_of('submit', 'reset', 'image', 'button')) | XPath.self(:button)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara.add_selector(:checkbox, locator_type: [String, Symbol]) do
|
|
4
|
+
xpath do |locator, allow_self: nil, **options|
|
|
5
|
+
xpath = XPath.axis(allow_self ? :'descendant-or-self' : :descendant, :input)[
|
|
6
|
+
XPath.attr(:type) == 'checkbox'
|
|
7
|
+
]
|
|
8
|
+
locate_field(xpath, locator, **options)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
filter_set(:_field, %i[checked unchecked disabled name])
|
|
12
|
+
|
|
13
|
+
node_filter(%i[option with]) do |node, value|
|
|
14
|
+
val = node.value
|
|
15
|
+
(value.is_a?(Regexp) ? value.match?(val) : val == value.to_s).tap do |res|
|
|
16
|
+
add_error("Expected value to be #{value.inspect} but it was #{val.inspect}") unless res
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe_node_filters do |option: nil, with: nil, **|
|
|
21
|
+
desc = +''
|
|
22
|
+
desc << " with value #{option.inspect}" if option
|
|
23
|
+
desc << " with value #{with.inspect}" if with
|
|
24
|
+
desc
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara.add_selector(:css, locator_type: [String, Symbol], raw_locator: true) do
|
|
4
|
+
css do |css|
|
|
5
|
+
if css.is_a? Symbol
|
|
6
|
+
Capybara::Helpers.warn "DEPRECATED: Passing a symbol (#{css.inspect}) as the CSS locator is deprecated - please pass a string instead : #{Capybara::Helpers.filter_backtrace(caller)}"
|
|
7
|
+
end
|
|
8
|
+
css
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara.add_selector(:datalist_input, locator_type: [String, Symbol]) do
|
|
4
|
+
label 'input box with datalist completion'
|
|
5
|
+
|
|
6
|
+
xpath do |locator, **options|
|
|
7
|
+
xpath = XPath.descendant(:input)[XPath.attr(:list)]
|
|
8
|
+
locate_field(xpath, locator, **options)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
filter_set(:_field, %i[disabled name placeholder])
|
|
12
|
+
|
|
13
|
+
node_filter(:options) do |node, options|
|
|
14
|
+
actual = node.find("//datalist[@id=#{node[:list]}]", visible: :all).all(:datalist_option, wait: false).map(&:value)
|
|
15
|
+
(options.sort == actual.sort).tap do |res|
|
|
16
|
+
add_error("Expected #{options.inspect} options found #{actual.inspect}") unless res
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
expression_filter(:with_options) do |expr, options|
|
|
21
|
+
options.inject(expr) do |xpath, option|
|
|
22
|
+
xpath.where(XPath.attr(:list) == XPath.anywhere(:datalist)[expression_for(:datalist_option, option)].attr(:id))
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe_expression_filters do |with_options: nil, **|
|
|
27
|
+
desc = +''
|
|
28
|
+
desc << " with at least options #{with_options.inspect}" if with_options
|
|
29
|
+
desc
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe_node_filters do |options: nil, **|
|
|
33
|
+
" with options #{options.inspect}" if options
|
|
34
|
+
end
|
|
35
|
+
end
|