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,324 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'capybara/rack_test/errors'
|
|
4
|
+
require 'capybara/node/whitespace_normalizer'
|
|
5
|
+
|
|
6
|
+
class Capybara::RackTest::Node < Capybara::Driver::Node
|
|
7
|
+
include Capybara::Node::WhitespaceNormalizer
|
|
8
|
+
|
|
9
|
+
BLOCK_ELEMENTS = %w[p h1 h2 h3 h4 h5 h6 ol ul pre address blockquote dl div fieldset form hr noscript table].freeze
|
|
10
|
+
|
|
11
|
+
def all_text
|
|
12
|
+
normalize_spacing(native.text)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def visible_text
|
|
16
|
+
normalize_visible_spacing(displayed_text)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def [](name)
|
|
20
|
+
string_node[name]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def style(_styles)
|
|
24
|
+
raise NotImplementedError, 'The rack_test driver does not process CSS'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def value
|
|
28
|
+
string_node.value
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def set(value, **options)
|
|
32
|
+
return if disabled? || readonly?
|
|
33
|
+
|
|
34
|
+
warn "Options passed to Node#set but the RackTest driver doesn't support any - ignoring" unless options.empty?
|
|
35
|
+
|
|
36
|
+
if value.is_a?(Array) && !multiple?
|
|
37
|
+
raise TypeError, "Value cannot be an Array when 'multiple' attribute is not present. Not a #{value.class}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if radio? then set_radio(value)
|
|
41
|
+
elsif checkbox? then set_checkbox(value)
|
|
42
|
+
elsif range? then set_range(value)
|
|
43
|
+
elsif input_field? then set_input(value)
|
|
44
|
+
elsif textarea? then native['_capybara_raw_value'] = value.to_s
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def select_option
|
|
49
|
+
return if disabled?
|
|
50
|
+
|
|
51
|
+
deselect_options unless select_node.multiple?
|
|
52
|
+
native['selected'] = 'selected'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def unselect_option
|
|
56
|
+
raise Capybara::UnselectNotAllowed, 'Cannot unselect option from single select box.' unless select_node.multiple?
|
|
57
|
+
|
|
58
|
+
native.remove_attribute('selected')
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def click(keys = [], **options)
|
|
62
|
+
options.delete(:offset)
|
|
63
|
+
raise ArgumentError, 'The RackTest driver does not support click options' unless keys.empty? && options.empty?
|
|
64
|
+
|
|
65
|
+
if link?
|
|
66
|
+
follow_link
|
|
67
|
+
elsif submits?
|
|
68
|
+
associated_form = form
|
|
69
|
+
Capybara::RackTest::Form.new(driver, associated_form).submit(self) if associated_form
|
|
70
|
+
elsif checkable?
|
|
71
|
+
set(!checked?)
|
|
72
|
+
elsif tag_name == 'label'
|
|
73
|
+
click_label
|
|
74
|
+
elsif (details = native.xpath('.//ancestor-or-self::details').last)
|
|
75
|
+
toggle_details(details)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def tag_name
|
|
80
|
+
native.node_name
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def visible?
|
|
84
|
+
string_node.visible?
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def checked?
|
|
88
|
+
string_node.checked?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def selected?
|
|
92
|
+
string_node.selected?
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def disabled?
|
|
96
|
+
return true if string_node.disabled?
|
|
97
|
+
|
|
98
|
+
if %w[option optgroup].include? tag_name
|
|
99
|
+
find_xpath(OPTION_OWNER_XPATH)[0].disabled?
|
|
100
|
+
else
|
|
101
|
+
!find_xpath(DISABLED_BY_FIELDSET_XPATH).empty?
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def readonly?
|
|
106
|
+
# readonly attribute not valid on these input types
|
|
107
|
+
return false if input_field? && %w[hidden range color checkbox radio file submit image reset button].include?(type)
|
|
108
|
+
|
|
109
|
+
super
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def path
|
|
113
|
+
native.path
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def find_xpath(locator, **_hints)
|
|
117
|
+
native.xpath(locator).map { |el| self.class.new(driver, el) }
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def find_css(locator, **_hints)
|
|
121
|
+
native.css(locator, Capybara::RackTest::CSSHandlers.new).map { |el| self.class.new(driver, el) }
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
public_instance_methods(false).each do |meth_name|
|
|
125
|
+
alias_method "unchecked_#{meth_name}", meth_name
|
|
126
|
+
private "unchecked_#{meth_name}" # rubocop:disable Style/AccessModifierDeclarations
|
|
127
|
+
|
|
128
|
+
class_eval <<~METHOD, __FILE__, __LINE__ + 1
|
|
129
|
+
def #{meth_name}(...)
|
|
130
|
+
stale_check
|
|
131
|
+
method(:"unchecked_#{meth_name}").call(...)
|
|
132
|
+
end
|
|
133
|
+
METHOD
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
protected
|
|
137
|
+
|
|
138
|
+
# @api private
|
|
139
|
+
def displayed_text(check_ancestor: true)
|
|
140
|
+
if !string_node.visible?(check_ancestor)
|
|
141
|
+
''
|
|
142
|
+
elsif native.text?
|
|
143
|
+
native
|
|
144
|
+
.text
|
|
145
|
+
.delete(REMOVED_CHARACTERS)
|
|
146
|
+
.tr(SQUEEZED_SPACES, ' ')
|
|
147
|
+
.squeeze(' ')
|
|
148
|
+
elsif native.element?
|
|
149
|
+
text = native.children.map do |child|
|
|
150
|
+
Capybara::RackTest::Node.new(driver, child).displayed_text(check_ancestor: false)
|
|
151
|
+
end.join || ''
|
|
152
|
+
text = "\n#{text}\n" if BLOCK_ELEMENTS.include?(tag_name)
|
|
153
|
+
text
|
|
154
|
+
else # rubocop:disable Lint/DuplicateBranch
|
|
155
|
+
''
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
private
|
|
160
|
+
|
|
161
|
+
def stale_check
|
|
162
|
+
raise Capybara::RackTest::Errors::StaleElementReferenceError unless native.document == driver.dom
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def deselect_options
|
|
166
|
+
select_node.find_xpath('.//option[@selected]').each { |node| node.native.remove_attribute('selected') }
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def string_node
|
|
170
|
+
@string_node ||= Capybara::Node::Simple.new(native)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# a reference to the select node if this is an option node
|
|
174
|
+
def select_node
|
|
175
|
+
find_xpath('./ancestor::select[1]').first
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def type
|
|
179
|
+
native[:type]
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def form
|
|
183
|
+
if native[:form]
|
|
184
|
+
native.xpath("//form[@id='#{native[:form]}']")
|
|
185
|
+
else
|
|
186
|
+
native.ancestors('form')
|
|
187
|
+
end.first
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def set_radio(_value) # rubocop:disable Naming/AccessorMethodName
|
|
191
|
+
other_radios_xpath = XPath.generate { |xp| xp.anywhere(:input)[xp.attr(:name) == self[:name]] }.to_s
|
|
192
|
+
driver.dom.xpath(other_radios_xpath).each { |node| node.remove_attribute('checked') }
|
|
193
|
+
native['checked'] = 'checked'
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def set_checkbox(value) # rubocop:disable Naming/AccessorMethodName
|
|
197
|
+
if value && !native['checked']
|
|
198
|
+
native['checked'] = 'checked'
|
|
199
|
+
elsif !value && native['checked']
|
|
200
|
+
native.remove_attribute('checked')
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def set_range(value) # rubocop:disable Naming/AccessorMethodName
|
|
205
|
+
min, max, step = (native['min'] || 0).to_f, (native['max'] || 100).to_f, (native['step'] || 1).to_f
|
|
206
|
+
value = value.to_f
|
|
207
|
+
value = value.clamp(min, max)
|
|
208
|
+
value = (((value - min) / step).round * step) + min
|
|
209
|
+
native['value'] = value.clamp(min, max)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def set_input(value) # rubocop:disable Naming/AccessorMethodName
|
|
213
|
+
if text_or_password? && attribute_is_not_blank?(:maxlength)
|
|
214
|
+
# Browser behavior for maxlength="0" is inconsistent, so we stick with
|
|
215
|
+
# Firefox, allowing no input
|
|
216
|
+
value = value.to_s[0...self[:maxlength].to_i]
|
|
217
|
+
end
|
|
218
|
+
if value.is_a?(Array) # Assert multiple attribute is present
|
|
219
|
+
value.each do |val|
|
|
220
|
+
new_native = native.clone
|
|
221
|
+
new_native.remove_attribute('value')
|
|
222
|
+
native.add_next_sibling(new_native)
|
|
223
|
+
new_native['value'] = val.to_s
|
|
224
|
+
end
|
|
225
|
+
native.remove
|
|
226
|
+
else
|
|
227
|
+
value.to_s.tap do |set_value|
|
|
228
|
+
if set_value.end_with?("\n") && form&.css('input, textarea')&.count == 1
|
|
229
|
+
native['value'] = set_value.to_s.chop
|
|
230
|
+
Capybara::RackTest::Form.new(driver, form).submit(self)
|
|
231
|
+
else
|
|
232
|
+
native['value'] = set_value
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def attribute_is_not_blank?(attribute)
|
|
239
|
+
self[attribute] && !self[attribute].empty?
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def follow_link
|
|
243
|
+
method = self['data-method'] || self['data-turbo-method'] if driver.options[:respect_data_method]
|
|
244
|
+
method ||= :get
|
|
245
|
+
driver.follow(method, self[:href].to_s)
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def click_label
|
|
249
|
+
labelled_control = if native[:for]
|
|
250
|
+
find_xpath("//input[@id='#{native[:for]}']")
|
|
251
|
+
else
|
|
252
|
+
find_xpath('.//input')
|
|
253
|
+
end.first
|
|
254
|
+
|
|
255
|
+
labelled_control.set(!labelled_control.checked?) if checkbox_or_radio?(labelled_control)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def toggle_details(details = nil)
|
|
259
|
+
details ||= native.xpath('.//ancestor-or-self::details').last
|
|
260
|
+
return unless details
|
|
261
|
+
|
|
262
|
+
if details.has_attribute?('open')
|
|
263
|
+
details.remove_attribute('open')
|
|
264
|
+
else
|
|
265
|
+
details.set_attribute('open', 'open')
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def link?
|
|
270
|
+
tag_name == 'a' && !self[:href].nil?
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def submits?
|
|
274
|
+
(tag_name == 'input' && %w[submit image].include?(type)) || (tag_name == 'button' && [nil, 'submit'].include?(type))
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def checkable?
|
|
278
|
+
tag_name == 'input' && %w[checkbox radio].include?(type)
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
protected
|
|
282
|
+
|
|
283
|
+
def checkbox_or_radio?(field = self)
|
|
284
|
+
field&.checkbox? || field&.radio?
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def checkbox?
|
|
288
|
+
input_field? && type == 'checkbox'
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
def radio?
|
|
292
|
+
input_field? && type == 'radio'
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def text_or_password?
|
|
296
|
+
input_field? && (type == 'text' || type == 'password')
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def input_field?
|
|
300
|
+
tag_name == 'input'
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def textarea?
|
|
304
|
+
tag_name == 'textarea'
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def range?
|
|
308
|
+
input_field? && type == 'range'
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
OPTION_OWNER_XPATH = XPath.parent(:optgroup, :select, :datalist).to_s.freeze
|
|
312
|
+
DISABLED_BY_FIELDSET_XPATH = XPath.generate do |x|
|
|
313
|
+
x.parent(:fieldset)[
|
|
314
|
+
XPath.attr(:disabled)
|
|
315
|
+
] + x.ancestor[
|
|
316
|
+
~x.self(:legend) |
|
|
317
|
+
x.preceding_sibling(:legend)
|
|
318
|
+
][
|
|
319
|
+
x.parent(:fieldset)[
|
|
320
|
+
x.attr(:disabled)
|
|
321
|
+
]
|
|
322
|
+
]
|
|
323
|
+
end.to_s.freeze
|
|
324
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'capybara/dsl'
|
|
4
|
+
|
|
5
|
+
Capybara.app = Rack::Builder.new do
|
|
6
|
+
map '/' do
|
|
7
|
+
run Rails.application
|
|
8
|
+
end
|
|
9
|
+
end.to_app
|
|
10
|
+
|
|
11
|
+
Capybara.save_path = Rails.root.join('tmp/capybara')
|
|
12
|
+
|
|
13
|
+
# Override default rack_test driver to respect data-method attributes.
|
|
14
|
+
Capybara.register_driver :rack_test do |app|
|
|
15
|
+
Capybara::RackTest::Driver.new(app, respect_data_method: true)
|
|
16
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Capybara
|
|
4
|
+
# @api private
|
|
5
|
+
class RegistrationContainer
|
|
6
|
+
def names
|
|
7
|
+
@registered.keys
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def [](name)
|
|
11
|
+
@registered[name]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def []=(name, value)
|
|
15
|
+
Capybara::Helpers.warn 'DEPRECATED: Directly setting drivers/servers is deprecated, please use Capybara.register_driver/register_server instead'
|
|
16
|
+
@registered[name] = value
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def method_missing(method_name, ...)
|
|
20
|
+
if @registered.respond_to?(method_name)
|
|
21
|
+
Capybara::Helpers.warn "DEPRECATED: Calling '#{method_name}' on the drivers/servers container is deprecated without replacement"
|
|
22
|
+
return @registered.public_send(method_name, ...)
|
|
23
|
+
end
|
|
24
|
+
super
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def respond_to_missing?(method_name, include_all)
|
|
28
|
+
@registered.respond_to?(method_name) || super
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def initialize
|
|
34
|
+
@registered = {}
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def register(name, block)
|
|
38
|
+
@registered[name] = block
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara.register_driver :rack_test do |app|
|
|
4
|
+
Capybara::RackTest::Driver.new(app)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Capybara.register_driver :selenium do |app|
|
|
8
|
+
Capybara::Selenium::Driver.new(app)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
Capybara.register_driver :selenium_headless do |app|
|
|
12
|
+
version = Capybara::Selenium::Driver.load_selenium
|
|
13
|
+
options_key = Capybara::Selenium::Driver::CAPS_VERSION.satisfied_by?(version) ? :capabilities : :options
|
|
14
|
+
browser_options = Selenium::WebDriver::Firefox::Options.new.tap do |opts|
|
|
15
|
+
opts.add_argument '-headless'
|
|
16
|
+
end
|
|
17
|
+
Capybara::Selenium::Driver.new(app, **{ :browser => :firefox, options_key => browser_options })
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
Capybara.register_driver :selenium_chrome do |app|
|
|
21
|
+
version = Capybara::Selenium::Driver.load_selenium
|
|
22
|
+
options_key = Capybara::Selenium::Driver::CAPS_VERSION.satisfied_by?(version) ? :capabilities : :options
|
|
23
|
+
browser_options = Selenium::WebDriver::Chrome::Options.new.tap do |opts|
|
|
24
|
+
# Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
|
|
25
|
+
opts.add_argument('--disable-site-isolation-trials')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
Capybara::Selenium::Driver.new(app, **{ :browser => :chrome, options_key => browser_options })
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
Capybara.register_driver :selenium_chrome_headless do |app|
|
|
32
|
+
version = Capybara::Selenium::Driver.load_selenium
|
|
33
|
+
options_key = Capybara::Selenium::Driver::CAPS_VERSION.satisfied_by?(version) ? :capabilities : :options
|
|
34
|
+
browser_options = Selenium::WebDriver::Chrome::Options.new.tap do |opts|
|
|
35
|
+
opts.add_argument('--headless=new')
|
|
36
|
+
opts.add_argument('--disable-gpu') if Gem.win_platform?
|
|
37
|
+
# Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
|
|
38
|
+
opts.add_argument('--disable-site-isolation-trials')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
Capybara::Selenium::Driver.new(app, **{ :browser => :chrome, options_key => browser_options })
|
|
42
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Puma
|
|
4
|
+
module MiniSSL
|
|
5
|
+
class Socket
|
|
6
|
+
def read_nonblock(size, *_)
|
|
7
|
+
wait_states = %i[wait_readable wait_writable]
|
|
8
|
+
|
|
9
|
+
loop do
|
|
10
|
+
output = engine_read_all
|
|
11
|
+
return output if output
|
|
12
|
+
|
|
13
|
+
data = @socket.read_nonblock(size, exception: false)
|
|
14
|
+
raise IO::EAGAINWaitReadable if wait_states.include? data
|
|
15
|
+
return nil if data.nil?
|
|
16
|
+
|
|
17
|
+
@engine.inject(data)
|
|
18
|
+
output = engine_read_all
|
|
19
|
+
|
|
20
|
+
return output if output
|
|
21
|
+
|
|
22
|
+
while (neg_data = @engine.extract)
|
|
23
|
+
@socket.write neg_data
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara.register_server :default do |app, port, _host|
|
|
4
|
+
Capybara.run_default_server(app, port)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Capybara.register_server :webrick do |app, port, host, **options|
|
|
8
|
+
base_class = begin
|
|
9
|
+
require 'rack/handler/webrick'
|
|
10
|
+
Rack
|
|
11
|
+
rescue LoadError
|
|
12
|
+
# Rack 3 separated out the webrick handle - no way test currently in Capybaras automated
|
|
13
|
+
# tests due to Sinatra not yet supporting Rack 3 - experimental
|
|
14
|
+
require 'rackup/handler/webrick'
|
|
15
|
+
Rackup
|
|
16
|
+
end
|
|
17
|
+
options = { Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log.new(nil, 0) }.merge(options)
|
|
18
|
+
base_class::Handler::WEBrick.run(app, **options)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
Capybara.register_server :puma do |app, port, host, **options| # rubocop:disable Metrics/BlockLength
|
|
22
|
+
begin
|
|
23
|
+
require 'rackup'
|
|
24
|
+
rescue LoadError # rubocop:disable Lint/SuppressedException
|
|
25
|
+
end
|
|
26
|
+
begin
|
|
27
|
+
require 'rack/handler/puma'
|
|
28
|
+
rescue LoadError
|
|
29
|
+
raise LoadError, 'Capybara is unable to load `puma` for its server, please add `puma` to your project or specify a different server via something like `Capybara.server = :webrick`.'
|
|
30
|
+
end
|
|
31
|
+
puma_rack_handler = defined?(Rackup::Handler::Puma) ? Rackup::Handler::Puma : Rack::Handler::Puma
|
|
32
|
+
|
|
33
|
+
unless puma_rack_handler.respond_to?(:config)
|
|
34
|
+
raise LoadError, 'Capybara requires `puma` version 3.8.0 or higher, please upgrade `puma` or register and specify your own server block'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# If we just run the Puma Rack handler it installs signal handlers which prevent us from being able to interrupt tests.
|
|
38
|
+
# Therefore construct and run the Server instance ourselves.
|
|
39
|
+
# puma_rack_handler.run(app, { Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false }.merge(options))
|
|
40
|
+
default_options = { Host: host, Port: port, Threads: '0:4', workers: 0, daemon: false }
|
|
41
|
+
options = default_options.merge(options)
|
|
42
|
+
|
|
43
|
+
conf = puma_rack_handler.config(app, options)
|
|
44
|
+
conf.clamp
|
|
45
|
+
|
|
46
|
+
puma_ver = Gem::Version.new(Puma::Const::PUMA_VERSION)
|
|
47
|
+
require_relative 'patches/puma_ssl' if Gem::Requirement.new('>=4.0.0', '< 4.1.0').satisfied_by?(puma_ver)
|
|
48
|
+
|
|
49
|
+
logger = (defined?(Puma::LogWriter) ? Puma::LogWriter : Puma::Events).then do |cls|
|
|
50
|
+
conf.options[:Silent] ? cls.strings : cls.stdio
|
|
51
|
+
end
|
|
52
|
+
conf.options[:log_writer] = logger
|
|
53
|
+
|
|
54
|
+
logger.log 'Capybara starting Puma...'
|
|
55
|
+
logger.log "* Version #{Puma::Const::PUMA_VERSION}, codename: #{Puma::Const::CODE_NAME}"
|
|
56
|
+
logger.log "* Min threads: #{conf.options[:min_threads]}, max threads: #{conf.options[:max_threads]}"
|
|
57
|
+
|
|
58
|
+
Puma::Server.new(
|
|
59
|
+
conf.app,
|
|
60
|
+
defined?(Puma::LogWriter) ? nil : logger,
|
|
61
|
+
conf.options
|
|
62
|
+
).tap do |s|
|
|
63
|
+
s.binder.parse conf.options[:binds], (s.log_writer rescue s.events) # rubocop:disable Style/RescueModifier
|
|
64
|
+
s.min_threads, s.max_threads = conf.options[:min_threads], conf.options[:max_threads] if s.respond_to? :min_threads=
|
|
65
|
+
end.run.join
|
|
66
|
+
end
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'forwardable'
|
|
4
|
+
|
|
5
|
+
module Capybara
|
|
6
|
+
##
|
|
7
|
+
# A {Capybara::Result} represents a collection of {Capybara::Node::Element} on the page. It is possible to interact with this
|
|
8
|
+
# collection similar to an Array because it implements Enumerable and offers the following Array methods through delegation:
|
|
9
|
+
#
|
|
10
|
+
# * \[\]
|
|
11
|
+
# * each()
|
|
12
|
+
# * at()
|
|
13
|
+
# * size()
|
|
14
|
+
# * count()
|
|
15
|
+
# * length()
|
|
16
|
+
# * first()
|
|
17
|
+
# * last()
|
|
18
|
+
# * empty?()
|
|
19
|
+
# * values_at()
|
|
20
|
+
# * sample()
|
|
21
|
+
#
|
|
22
|
+
# @see Capybara::Node::Element
|
|
23
|
+
#
|
|
24
|
+
class Result
|
|
25
|
+
include Enumerable
|
|
26
|
+
extend Forwardable
|
|
27
|
+
|
|
28
|
+
def initialize(elements, query)
|
|
29
|
+
@elements = elements
|
|
30
|
+
@result_cache = []
|
|
31
|
+
@filter_errors = []
|
|
32
|
+
@results_enum = lazy_select_elements { |node| query.matches_filters?(node, @filter_errors) }
|
|
33
|
+
@query = query
|
|
34
|
+
@allow_reload = false
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def_delegators :full_results, :size, :length, :last, :values_at, :inspect, :sample, :to_ary
|
|
38
|
+
|
|
39
|
+
alias index find_index
|
|
40
|
+
|
|
41
|
+
def each(&block)
|
|
42
|
+
return enum_for(:each) unless block
|
|
43
|
+
|
|
44
|
+
@result_cache.each(&block)
|
|
45
|
+
loop do
|
|
46
|
+
next_result = @results_enum.next
|
|
47
|
+
add_to_cache(next_result)
|
|
48
|
+
yield next_result
|
|
49
|
+
end
|
|
50
|
+
self
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def [](*args)
|
|
54
|
+
idx, length = args
|
|
55
|
+
max_idx = case idx
|
|
56
|
+
when Integer
|
|
57
|
+
if idx.negative?
|
|
58
|
+
nil
|
|
59
|
+
else
|
|
60
|
+
length.nil? ? idx : idx + length - 1
|
|
61
|
+
end
|
|
62
|
+
when Range
|
|
63
|
+
# idx.max is broken with beginless ranges
|
|
64
|
+
# idx.end && idx.max # endless range will have end == nil
|
|
65
|
+
max = idx.end
|
|
66
|
+
max = nil if max&.negative?
|
|
67
|
+
max -= 1 if max && idx.exclude_end?
|
|
68
|
+
max
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
if max_idx.nil?
|
|
72
|
+
full_results[*args]
|
|
73
|
+
else
|
|
74
|
+
load_up_to(max_idx + 1)
|
|
75
|
+
@result_cache[*args]
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
alias :at :[]
|
|
79
|
+
|
|
80
|
+
def empty?
|
|
81
|
+
!any?
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def compare_count
|
|
85
|
+
return 0 unless @query
|
|
86
|
+
|
|
87
|
+
count, min, max, between = @query.options.values_at(:count, :minimum, :maximum, :between)
|
|
88
|
+
|
|
89
|
+
# Only check filters for as many elements as necessary to determine result
|
|
90
|
+
if count && (count = Integer(count))
|
|
91
|
+
return load_up_to(count + 1) <=> count
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
return -1 if min && (min = Integer(min)) && (load_up_to(min) < min)
|
|
95
|
+
|
|
96
|
+
return 1 if max && (max = Integer(max)) && (load_up_to(max + 1) > max)
|
|
97
|
+
|
|
98
|
+
if between
|
|
99
|
+
min, max = (between.begin && between.min) || 1, between.end
|
|
100
|
+
max -= 1 if max && between.exclude_end?
|
|
101
|
+
|
|
102
|
+
size = load_up_to(max ? max + 1 : min)
|
|
103
|
+
return size <=> min unless between.include?(size)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
0
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def matches_count?
|
|
110
|
+
compare_count.zero?
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def failure_message
|
|
114
|
+
message = @query.failure_message
|
|
115
|
+
if count.zero?
|
|
116
|
+
message << ' but there were no matches'
|
|
117
|
+
else
|
|
118
|
+
message << ", found #{count} #{Capybara::Helpers.declension('match', 'matches', count)}: " \
|
|
119
|
+
<< full_results.map { |r| r.text.inspect }.join(', ')
|
|
120
|
+
end
|
|
121
|
+
unless rest.empty?
|
|
122
|
+
elements = rest.map { |el| el.text rescue '<<ERROR>>' }.map(&:inspect).join(', ') # rubocop:disable Style/RescueModifier
|
|
123
|
+
message << '. Also found ' << elements << ', which matched the selector but not all filters. '
|
|
124
|
+
message << @filter_errors.join('. ') if (rest.size == 1) && count.zero?
|
|
125
|
+
end
|
|
126
|
+
message
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def negative_failure_message
|
|
130
|
+
failure_message.sub(/(to find)/, 'not \1')
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def unfiltered_size
|
|
134
|
+
@elements.length
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
##
|
|
138
|
+
# @api private
|
|
139
|
+
#
|
|
140
|
+
def allow_reload!
|
|
141
|
+
@allow_reload = true
|
|
142
|
+
self
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
private
|
|
146
|
+
|
|
147
|
+
def add_to_cache(elem)
|
|
148
|
+
elem.allow_reload!(@result_cache.size) if @allow_reload
|
|
149
|
+
@result_cache << elem
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def load_up_to(num)
|
|
153
|
+
loop do
|
|
154
|
+
break if @result_cache.size >= num
|
|
155
|
+
|
|
156
|
+
add_to_cache(@results_enum.next)
|
|
157
|
+
end
|
|
158
|
+
@result_cache.size
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def full_results
|
|
162
|
+
loop { @result_cache << @results_enum.next }
|
|
163
|
+
@result_cache
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def rest
|
|
167
|
+
@rest ||= @elements - full_results
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
if RUBY_PLATFORM == 'java'
|
|
171
|
+
# JRuby < 9.2.8.0 has an issue with lazy enumerators which
|
|
172
|
+
# causes a concurrency issue with network requests here
|
|
173
|
+
# https://github.com/jruby/jruby/issues/4212
|
|
174
|
+
# while JRuby >= 9.2.8.0 leaks threads when using lazy enumerators
|
|
175
|
+
# https://github.com/teamcapybara/capybara/issues/2349
|
|
176
|
+
# so disable the use and JRuby users will need to pay a performance penalty
|
|
177
|
+
def lazy_select_elements(&block)
|
|
178
|
+
@elements.select(&block).to_enum # non-lazy evaluation
|
|
179
|
+
end
|
|
180
|
+
else
|
|
181
|
+
def lazy_select_elements(&block)
|
|
182
|
+
@elements.lazy.select(&block)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|