watir 1.4.1 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.document +4 -0
- data/.github/ISSUE_TEMPLATE.md +16 -0
- data/.github/workflows/chrome.yml +55 -0
- data/.github/workflows/edge.yml +44 -0
- data/.github/workflows/firefox.yml +55 -0
- data/.github/workflows/ie.yml +30 -0
- data/.github/workflows/safari.yml +38 -0
- data/.github/workflows/unit.yml +60 -0
- data/.gitignore +21 -0
- data/.rubocop.yml +114 -0
- data/.rubocop_todo.yml +17 -0
- data/CHANGES.md +2212 -0
- data/Gemfile +15 -0
- data/LICENSE +24 -0
- data/README.md +113 -0
- data/Rakefile +173 -0
- data/lib/watir/adjacent.rb +128 -0
- data/lib/watir/after_hooks.rb +135 -0
- data/lib/watir/alert.rb +113 -0
- data/lib/watir/aliases.rb +8 -0
- data/lib/watir/attribute_helper.rb +97 -0
- data/lib/watir/browser.rb +323 -0
- data/lib/watir/capabilities.rb +179 -0
- data/lib/watir/cell_container.rb +25 -0
- data/lib/watir/container.rb +33 -0
- data/lib/watir/cookies.rb +130 -0
- data/lib/watir/element_collection.rb +223 -0
- data/lib/watir/elements/button.rb +28 -0
- data/lib/watir/elements/cell.rb +18 -0
- data/lib/watir/elements/checkbox.rb +56 -0
- data/lib/watir/elements/date_field.rb +42 -0
- data/lib/watir/elements/date_time_field.rb +42 -0
- data/lib/watir/elements/dlist.rb +12 -0
- data/lib/watir/elements/element.rb +807 -0
- data/lib/watir/elements/file_field.rb +43 -0
- data/lib/watir/elements/font.rb +26 -0
- data/lib/watir/elements/form.rb +16 -0
- data/lib/watir/elements/hidden.rb +26 -0
- data/lib/watir/elements/html_elements.rb +1981 -0
- data/lib/watir/elements/iframe.rb +156 -0
- data/lib/watir/elements/image.rb +22 -0
- data/lib/watir/elements/input.rb +15 -0
- data/lib/watir/elements/link.rb +8 -0
- data/lib/watir/elements/list.rb +51 -0
- data/lib/watir/elements/option.rb +60 -0
- data/lib/watir/elements/radio.rb +65 -0
- data/lib/watir/elements/row.rb +18 -0
- data/lib/watir/elements/select.rb +214 -0
- data/lib/watir/elements/svg_elements.rb +497 -0
- data/lib/watir/elements/table.rb +77 -0
- data/lib/watir/elements/table_cell.rb +32 -0
- data/lib/watir/elements/table_row.rb +34 -0
- data/lib/watir/elements/table_section.rb +17 -0
- data/lib/watir/elements/text_area.rb +7 -0
- data/lib/watir/elements/text_field.rb +39 -0
- data/lib/watir/exception.rb +16 -0
- data/lib/watir/extensions/nokogiri.rb +14 -0
- data/lib/watir/generator/base/generator.rb +114 -0
- data/lib/watir/generator/base/idl_sorter.rb +51 -0
- data/lib/watir/generator/base/spec_extractor.rb +158 -0
- data/lib/watir/generator/base/util.rb +21 -0
- data/lib/watir/generator/base/visitor.rb +133 -0
- data/lib/watir/generator/base.rb +12 -0
- data/lib/watir/generator/html/generator.rb +36 -0
- data/lib/watir/generator/html/spec_extractor.rb +52 -0
- data/lib/watir/generator/html/visitor.rb +23 -0
- data/lib/watir/generator/html.rb +17 -0
- data/lib/watir/generator/svg/generator.rb +38 -0
- data/lib/watir/generator/svg/spec_extractor.rb +55 -0
- data/lib/watir/generator/svg/visitor.rb +23 -0
- data/lib/watir/generator/svg.rb +9 -0
- data/lib/watir/generator.rb +5 -0
- data/lib/watir/has_window.rb +72 -0
- data/lib/watir/http_client.rb +11 -0
- data/lib/watir/js_execution.rb +165 -0
- data/lib/watir/js_snippets/attributeValues.js +11 -0
- data/lib/watir/js_snippets/backgroundColor.js +7 -0
- data/lib/watir/js_snippets/elementObscured.js +14 -0
- data/lib/watir/js_snippets/fireEvent.js +31 -0
- data/lib/watir/js_snippets/focus.js +3 -0
- data/lib/watir/js_snippets/getElementTags.js +3 -0
- data/lib/watir/js_snippets/getInnerHtml.js +19 -0
- data/lib/watir/js_snippets/getInnerText.js +19 -0
- data/lib/watir/js_snippets/getOuterHtml.js +20 -0
- data/lib/watir/js_snippets/getTextContent.js +19 -0
- data/lib/watir/js_snippets/isElementInViewport.js +20 -0
- data/lib/watir/js_snippets/isImageLoaded.js +3 -0
- data/lib/watir/js_snippets/selectOptionsLabel.js +10 -0
- data/lib/watir/js_snippets/selectOptionsText.js +10 -0
- data/lib/watir/js_snippets/selectOptionsValue.js +10 -0
- data/lib/watir/js_snippets/selectText.js +64 -0
- data/lib/watir/js_snippets/selectedOptions.js +11 -0
- data/lib/watir/js_snippets/selectedText.js +17 -0
- data/lib/watir/js_snippets/setText.js +3 -0
- data/lib/watir/js_snippets/setValue.js +3 -0
- data/lib/watir/js_snippets.rb +18 -0
- data/lib/watir/locators/anchor/selector_builder.rb +43 -0
- data/lib/watir/locators/button/matcher.rb +19 -0
- data/lib/watir/locators/button/selector_builder/xpath.rb +69 -0
- data/lib/watir/locators/button/selector_builder.rb +10 -0
- data/lib/watir/locators/cell/selector_builder/xpath.rb +23 -0
- data/lib/watir/locators/cell/selector_builder.rb +13 -0
- data/lib/watir/locators/element/locator.rb +81 -0
- data/lib/watir/locators/element/matcher.rb +118 -0
- data/lib/watir/locators/element/selector_builder/regexp_disassembler.rb +69 -0
- data/lib/watir/locators/element/selector_builder/xpath.rb +268 -0
- data/lib/watir/locators/element/selector_builder/xpath_support.rb +29 -0
- data/lib/watir/locators/element/selector_builder.rb +164 -0
- data/lib/watir/locators/option/matcher.rb +26 -0
- data/lib/watir/locators/option/selector_builder/xpath.rb +39 -0
- data/lib/watir/locators/option/selector_builder.rb +10 -0
- data/lib/watir/locators/row/selector_builder/xpath.rb +53 -0
- data/lib/watir/locators/row/selector_builder.rb +18 -0
- data/lib/watir/locators/text_area/selector_builder/xpath.rb +21 -0
- data/lib/watir/locators/text_area/selector_builder.rb +10 -0
- data/lib/watir/locators/text_field/matcher.rb +37 -0
- data/lib/watir/locators/text_field/selector_builder/xpath.rb +50 -0
- data/lib/watir/locators/text_field/selector_builder.rb +10 -0
- data/lib/watir/locators.rb +77 -0
- data/lib/watir/logger.rb +30 -0
- data/lib/watir/navigation.rb +51 -0
- data/lib/watir/radio_set.rb +230 -0
- data/lib/watir/row_container.rb +36 -0
- data/lib/watir/screenshot.rb +51 -0
- data/lib/watir/scroll.rb +95 -0
- data/lib/watir/search_context.rb +96 -0
- data/lib/watir/shadow_root.rb +60 -0
- data/lib/watir/user_editable.rb +85 -0
- data/lib/watir/version.rb +5 -0
- data/lib/watir/wait/timer.rb +52 -0
- data/lib/watir/wait.rb +171 -0
- data/lib/watir/window.rb +276 -0
- data/lib/watir/window_collection.rb +82 -0
- data/lib/watir.rb +108 -0
- data/lib/watirspec/guards.rb +65 -0
- data/lib/watirspec/implementation.rb +56 -0
- data/lib/watirspec/rake_tasks.rb +118 -0
- data/lib/watirspec/remote_server.rb +39 -0
- data/lib/watirspec/runner.rb +64 -0
- data/lib/watirspec/server/app.rb +86 -0
- data/lib/watirspec/server.rb +104 -0
- data/lib/watirspec.rb +93 -0
- data/spec/locator_spec_helper.rb +88 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/unit/capabilities_spec.rb +670 -0
- data/spec/unit/element_locator_spec.rb +97 -0
- data/spec/unit/match_elements/button_spec.rb +76 -0
- data/spec/unit/match_elements/element_spec.rb +424 -0
- data/spec/unit/match_elements/text_field_spec.rb +84 -0
- data/spec/unit/selector_builder/anchor_spec.rb +59 -0
- data/spec/unit/selector_builder/button_spec.rb +217 -0
- data/spec/unit/selector_builder/cell_spec.rb +71 -0
- data/spec/unit/selector_builder/element_spec.rb +804 -0
- data/spec/unit/selector_builder/row_spec.rb +128 -0
- data/spec/unit/selector_builder/text_field_spec.rb +203 -0
- data/spec/unit/selector_builder/textarea_spec.rb +35 -0
- data/spec/unit/unit_helper.rb +4 -0
- data/spec/unit/wait_spec.rb +99 -0
- data/spec/watirspec/adjacent_spec.rb +256 -0
- data/spec/watirspec/after_hooks_spec.rb +204 -0
- data/spec/watirspec/alert_spec.rb +89 -0
- data/spec/watirspec/browser_spec.rb +536 -0
- data/spec/watirspec/capabilities_spec.rb +556 -0
- data/spec/watirspec/cookies_spec.rb +196 -0
- data/spec/watirspec/drag_and_drop_spec.rb +38 -0
- data/spec/watirspec/element_hidden_spec.rb +86 -0
- data/spec/watirspec/elements/area_spec.rb +69 -0
- data/spec/watirspec/elements/areas_spec.rb +44 -0
- data/spec/watirspec/elements/button_spec.rb +265 -0
- data/spec/watirspec/elements/buttons_spec.rb +57 -0
- data/spec/watirspec/elements/checkbox_spec.rb +290 -0
- data/spec/watirspec/elements/checkboxes_spec.rb +46 -0
- data/spec/watirspec/elements/collections_spec.rb +132 -0
- data/spec/watirspec/elements/date_field_spec.rb +209 -0
- data/spec/watirspec/elements/date_fields_spec.rb +46 -0
- data/spec/watirspec/elements/date_time_field_spec.rb +223 -0
- data/spec/watirspec/elements/date_time_fields_spec.rb +47 -0
- data/spec/watirspec/elements/dd_spec.rb +108 -0
- data/spec/watirspec/elements/dds_spec.rb +44 -0
- data/spec/watirspec/elements/del_spec.rb +113 -0
- data/spec/watirspec/elements/dels_spec.rb +42 -0
- data/spec/watirspec/elements/div_spec.rb +232 -0
- data/spec/watirspec/elements/divs_spec.rb +56 -0
- data/spec/watirspec/elements/dl_spec.rb +117 -0
- data/spec/watirspec/elements/dls_spec.rb +45 -0
- data/spec/watirspec/elements/dt_spec.rb +107 -0
- data/spec/watirspec/elements/dts_spec.rb +44 -0
- data/spec/watirspec/elements/element_spec.rb +1069 -0
- data/spec/watirspec/elements/elements_spec.rb +60 -0
- data/spec/watirspec/elements/em_spec.rb +85 -0
- data/spec/watirspec/elements/ems_spec.rb +45 -0
- data/spec/watirspec/elements/filefield_spec.rb +135 -0
- data/spec/watirspec/elements/filefields_spec.rb +45 -0
- data/spec/watirspec/elements/font_spec.rb +31 -0
- data/spec/watirspec/elements/form_spec.rb +70 -0
- data/spec/watirspec/elements/forms_spec.rb +46 -0
- data/spec/watirspec/elements/frame_spec.rb +117 -0
- data/spec/watirspec/elements/frames_spec.rb +43 -0
- data/spec/watirspec/elements/hidden_spec.rb +106 -0
- data/spec/watirspec/elements/hiddens_spec.rb +45 -0
- data/spec/watirspec/elements/hn_spec.rb +80 -0
- data/spec/watirspec/elements/hns_spec.rb +42 -0
- data/spec/watirspec/elements/iframe_spec.rb +244 -0
- data/spec/watirspec/elements/iframes_spec.rb +49 -0
- data/spec/watirspec/elements/image_spec.rb +160 -0
- data/spec/watirspec/elements/images_spec.rb +42 -0
- data/spec/watirspec/elements/input_spec.rb +17 -0
- data/spec/watirspec/elements/ins_spec.rb +113 -0
- data/spec/watirspec/elements/inses_spec.rb +42 -0
- data/spec/watirspec/elements/label_spec.rb +77 -0
- data/spec/watirspec/elements/labels_spec.rb +42 -0
- data/spec/watirspec/elements/li_spec.rb +99 -0
- data/spec/watirspec/elements/link_spec.rb +180 -0
- data/spec/watirspec/elements/links_spec.rb +66 -0
- data/spec/watirspec/elements/lis_spec.rb +44 -0
- data/spec/watirspec/elements/list_spec.rb +50 -0
- data/spec/watirspec/elements/map_spec.rb +78 -0
- data/spec/watirspec/elements/maps_spec.rb +43 -0
- data/spec/watirspec/elements/meta_spec.rb +27 -0
- data/spec/watirspec/elements/metas_spec.rb +42 -0
- data/spec/watirspec/elements/ol_spec.rb +63 -0
- data/spec/watirspec/elements/ols_spec.rb +42 -0
- data/spec/watirspec/elements/option_spec.rb +113 -0
- data/spec/watirspec/elements/p_spec.rb +102 -0
- data/spec/watirspec/elements/pre_spec.rb +100 -0
- data/spec/watirspec/elements/pres_spec.rb +42 -0
- data/spec/watirspec/elements/ps_spec.rb +42 -0
- data/spec/watirspec/elements/radio_spec.rb +259 -0
- data/spec/watirspec/elements/radios_spec.rb +45 -0
- data/spec/watirspec/elements/select_list_spec.rb +701 -0
- data/spec/watirspec/elements/select_lists_spec.rb +49 -0
- data/spec/watirspec/elements/span_spec.rb +119 -0
- data/spec/watirspec/elements/spans_spec.rb +42 -0
- data/spec/watirspec/elements/strong_spec.rb +78 -0
- data/spec/watirspec/elements/strongs_spec.rb +45 -0
- data/spec/watirspec/elements/table_spec.rb +210 -0
- data/spec/watirspec/elements/tables_spec.rb +44 -0
- data/spec/watirspec/elements/tbody_spec.rb +94 -0
- data/spec/watirspec/elements/tbodys_spec.rb +64 -0
- data/spec/watirspec/elements/td_spec.rb +92 -0
- data/spec/watirspec/elements/tds_spec.rb +55 -0
- data/spec/watirspec/elements/text_field_spec.rb +223 -0
- data/spec/watirspec/elements/text_fields_spec.rb +47 -0
- data/spec/watirspec/elements/textarea_spec.rb +30 -0
- data/spec/watirspec/elements/textareas_spec.rb +28 -0
- data/spec/watirspec/elements/tfoot_spec.rb +89 -0
- data/spec/watirspec/elements/tfoots_spec.rb +72 -0
- data/spec/watirspec/elements/thead_spec.rb +88 -0
- data/spec/watirspec/elements/theads_spec.rb +72 -0
- data/spec/watirspec/elements/tr_spec.rb +69 -0
- data/spec/watirspec/elements/trs_spec.rb +63 -0
- data/spec/watirspec/elements/ul_spec.rb +63 -0
- data/spec/watirspec/elements/uls_spec.rb +42 -0
- data/spec/watirspec/html/alerts.html +12 -0
- data/spec/watirspec/html/aria_attributes.html +9 -0
- data/spec/watirspec/html/child_frame.html +29 -0
- data/spec/watirspec/html/class_locator.html +11 -0
- data/spec/watirspec/html/clicks.html +19 -0
- data/spec/watirspec/html/closeable.html +21 -0
- data/spec/watirspec/html/collections.html +15 -0
- data/spec/watirspec/html/css/jquery-ui-1.8.17.custom.css +287 -0
- data/spec/watirspec/html/data_attributes.html +10 -0
- data/spec/watirspec/html/definition_lists.html +48 -0
- data/spec/watirspec/html/drag_and_drop.html +106 -0
- data/spec/watirspec/html/font.html +10 -0
- data/spec/watirspec/html/forms_with_input_elements.html +194 -0
- data/spec/watirspec/html/frame_1.html +22 -0
- data/spec/watirspec/html/frame_2.html +16 -0
- data/spec/watirspec/html/frames.html +11 -0
- data/spec/watirspec/html/iframe_1.html +22 -0
- data/spec/watirspec/html/iframes.html +15 -0
- data/spec/watirspec/html/images/button.png +0 -0
- data/spec/watirspec/html/images/circle.png +0 -0
- data/spec/watirspec/html/images/map.gif +0 -0
- data/spec/watirspec/html/images/map2.gif +0 -0
- data/spec/watirspec/html/images/originaltriangle.png +0 -0
- data/spec/watirspec/html/images/square.png +0 -0
- data/spec/watirspec/html/images/triangle.png +0 -0
- data/spec/watirspec/html/images.html +28 -0
- data/spec/watirspec/html/inner_outer.html +5 -0
- data/spec/watirspec/html/javascript/angular.min.js +332 -0
- data/spec/watirspec/html/javascript/helpers.js +16 -0
- data/spec/watirspec/html/javascript/jquery-1.7.1.min.js +4 -0
- data/spec/watirspec/html/javascript/jquery-ui-1.8.17.custom.min.js +68 -0
- data/spec/watirspec/html/keylogger.html +15 -0
- data/spec/watirspec/html/modal_dialog.html +9 -0
- data/spec/watirspec/html/multiple_ids.html +15 -0
- data/spec/watirspec/html/nested_elements.html +44 -0
- data/spec/watirspec/html/nested_frame_1.html +1 -0
- data/spec/watirspec/html/nested_frame_2.html +9 -0
- data/spec/watirspec/html/nested_frame_3.html +14 -0
- data/spec/watirspec/html/nested_frames.html +10 -0
- data/spec/watirspec/html/nested_iframe_2.html +12 -0
- data/spec/watirspec/html/nested_iframes.html +13 -0
- data/spec/watirspec/html/nested_tables.html +203 -0
- data/spec/watirspec/html/non_control_elements.html +145 -0
- data/spec/watirspec/html/obscured.html +36 -0
- data/spec/watirspec/html/removed_element.html +24 -0
- data/spec/watirspec/html/right_click.html +23 -0
- data/spec/watirspec/html/scroll.html +15 -0
- data/spec/watirspec/html/scroll_nested.html +17 -0
- data/spec/watirspec/html/scroll_nested_offscreen.html +18 -0
- data/spec/watirspec/html/shadow_dom.html +28 -0
- data/spec/watirspec/html/special_chars.html +15 -0
- data/spec/watirspec/html/sticky_elements.html +10 -0
- data/spec/watirspec/html/tables.html +121 -0
- data/spec/watirspec/html/timeout_window_location.html +19 -0
- data/spec/watirspec/html/uneven_table.html +20 -0
- data/spec/watirspec/html/wait.html +99 -0
- data/spec/watirspec/html/watirspec.css +0 -0
- data/spec/watirspec/html/window_switching.html +22 -0
- data/spec/watirspec/radio_set_spec.rb +346 -0
- data/spec/watirspec/screenshot_spec.rb +33 -0
- data/spec/watirspec/scroll_spec.rb +208 -0
- data/spec/watirspec/shadow_root_spec.rb +108 -0
- data/spec/watirspec/support/rspec_matchers.rb +161 -0
- data/spec/watirspec/user_editable_spec.rb +207 -0
- data/spec/watirspec/wait_spec.rb +345 -0
- data/spec/watirspec/window_switching_spec.rb +580 -0
- data/spec/watirspec_helper.rb +163 -0
- data/support/doctest_helper.rb +101 -0
- data/support/version_differ.rb +60 -0
- data/watir.gemspec +50 -0
- metadata +652 -148
- data/readme.rb +0 -211
- data/unittests/WindowLogonExample.rb +0 -30
- data/unittests/WindowLogonExtra.rb +0 -7
- data/unittests/all_tests.rb +0 -10
- data/unittests/all_tests_concurrent.rb +0 -57
- data/unittests/attachToExistingWindow_test.rb +0 -40
- data/unittests/buttons_test.rb +0 -131
- data/unittests/checkbox_test.rb +0 -149
- data/unittests/core_tests.rb +0 -9
- data/unittests/css_test.rb +0 -60
- data/unittests/div_test.rb +0 -179
- data/unittests/errorchecker_test.rb +0 -29
- data/unittests/filefield_test.rb +0 -35
- data/unittests/form_test.rb +0 -279
- data/unittests/frame_test.rb +0 -141
- data/unittests/html/blankpage.html +0 -12
- data/unittests/html/buttons1.html +0 -40
- data/unittests/html/checkboxes1.html +0 -69
- data/unittests/html/complex_table.html +0 -36
- data/unittests/html/cssTest.html +0 -42
- data/unittests/html/div.html +0 -105
- data/unittests/html/fileupload.html +0 -45
- data/unittests/html/formTest1.html +0 -39
- data/unittests/html/forms2.html +0 -45
- data/unittests/html/forms3.html +0 -132
- data/unittests/html/forms4.html +0 -27
- data/unittests/html/frame_buttons.html +0 -4
- data/unittests/html/frame_links.html +0 -4
- data/unittests/html/frame_multi.html +0 -5
- data/unittests/html/iframeTest.html +0 -13
- data/unittests/html/iframeTest1.html +0 -7
- data/unittests/html/iframeTest2.html +0 -6
- data/unittests/html/images/button.jpg +0 -0
- data/unittests/html/images/circle.jpg +0 -0
- data/unittests/html/images/originaltriangle.jpg +0 -0
- data/unittests/html/images/square.jpg +0 -0
- data/unittests/html/images/triangle.jpg +0 -0
- data/unittests/html/images1.html +0 -52
- data/unittests/html/javascriptevents.html +0 -39
- data/unittests/html/link_pass.html +0 -11
- data/unittests/html/links1.html +0 -37
- data/unittests/html/links2.html +0 -11
- data/unittests/html/nestedFrames.html +0 -6
- data/unittests/html/pass.html +0 -10
- data/unittests/html/popups1.html +0 -60
- data/unittests/html/radioButtons1.html +0 -71
- data/unittests/html/select_tealeaf.html +0 -54
- data/unittests/html/selectboxes1.html +0 -55
- data/unittests/html/simple_table.html +0 -26
- data/unittests/html/simple_table_buttons.html +0 -104
- data/unittests/html/simple_table_columns.html +0 -76
- data/unittests/html/table1.html +0 -142
- data/unittests/html/textarea.html +0 -30
- data/unittests/html/textfields1.html +0 -87
- data/unittests/html/textsearch.html +0 -44
- data/unittests/ie_mock.rb +0 -93
- data/unittests/ie_test.rb +0 -50
- data/unittests/images_test.rb +0 -179
- data/unittests/iostring.rb +0 -30
- data/unittests/iostring_test.rb +0 -48
- data/unittests/js_events_test.rb +0 -77
- data/unittests/jscriptExtraAlert.rb +0 -6
- data/unittests/jscriptExtraConfirmCancel.rb +0 -7
- data/unittests/jscriptExtraConfirmOk.rb +0 -7
- data/unittests/jscriptPushButton.rb +0 -5
- data/unittests/jscript_test.rb +0 -57
- data/unittests/links_test.rb +0 -169
- data/unittests/minmax_test.rb +0 -31
- data/unittests/navigate_test.rb +0 -56
- data/unittests/non_core_tests.rb +0 -9
- data/unittests/pagecontainstext_test.rb +0 -49
- data/unittests/popups_test.rb +0 -44
- data/unittests/radios_test.rb +0 -164
- data/unittests/screen_capture_test.rb +0 -53
- data/unittests/selectbox_test.rb +0 -197
- data/unittests/send_keys_test.rb +0 -29
- data/unittests/setup.rb +0 -47
- data/unittests/table_test.rb +0 -306
- data/unittests/textAreafields_test.rb +0 -81
- data/unittests/textfields_test.rb +0 -239
- data/watir/AutoItX3.dll +0 -0
- data/watir/WindowHelper.rb +0 -47
- data/watir/camel_case.rb +0 -37
- data/watir/clickJSDialog.rb +0 -19
- data/watir/cookiemanager.rb +0 -53
- data/watir/exceptions.rb +0 -60
- data/watir/screen_capture.rb +0 -115
- data/watir/setFileDialog.rb +0 -16
- data/watir/testUnitAddons.rb +0 -47
- data/watir/watir_simple.rb +0 -475
- data/watir/winClicker.rb +0 -505
- data/watir.rb +0 -3744
- /data/{unittests → spec/watirspec}/html/images/1.gif +0 -0
- /data/{unittests/html/images/2.GIF → spec/watirspec/html/images/2.gif} +0 -0
- /data/{unittests/html/images/3.GIF → spec/watirspec/html/images/3.gif} +0 -0
- /data/{unittests/html/images/minus.GIF → spec/watirspec/html/images/minus.gif} +0 -0
- /data/{unittests → spec/watirspec}/html/images/plus.gif +0 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
module SearchContext
|
|
5
|
+
#
|
|
6
|
+
# Returns true if element exists.
|
|
7
|
+
# Checking for staleness is deprecated
|
|
8
|
+
#
|
|
9
|
+
# @return [Boolean]
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
def exists?
|
|
13
|
+
if located? && stale?
|
|
14
|
+
reset!
|
|
15
|
+
elsif located?
|
|
16
|
+
return true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
assert_exists
|
|
20
|
+
true
|
|
21
|
+
rescue Exception::UnknownObjectException, Exception::UnknownFrameException
|
|
22
|
+
false
|
|
23
|
+
end
|
|
24
|
+
alias exist? exists?
|
|
25
|
+
|
|
26
|
+
def assert_exists
|
|
27
|
+
locate unless located?
|
|
28
|
+
return if located?
|
|
29
|
+
|
|
30
|
+
raise unknown_exception, "unable to locate: #{inspect}"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def wait_for_exists
|
|
34
|
+
return if located? # Performance shortcut
|
|
35
|
+
|
|
36
|
+
begin
|
|
37
|
+
@query_scope.wait_for_exists unless @query_scope.is_a? Browser
|
|
38
|
+
wait_until(element_reset: true, &:exists?)
|
|
39
|
+
rescue Wait::TimeoutError
|
|
40
|
+
msg = "timed out after #{Watir.default_timeout} seconds, waiting for #{inspect} to be located"
|
|
41
|
+
raise unknown_exception, msg
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# TODO: - this will get addressed with Watir::Executor implementation
|
|
46
|
+
# rubocop:disable Metrics/AbcSize
|
|
47
|
+
# rubocop:disable Metrics/MethodLength # : # ::
|
|
48
|
+
def element_call(precondition = nil, &block)
|
|
49
|
+
caller = caller_locations(1, 1)[0].label
|
|
50
|
+
already_locked = browser.timer.locked?
|
|
51
|
+
browser.timer = Wait::Timer.new(timeout: Watir.default_timeout) unless already_locked
|
|
52
|
+
|
|
53
|
+
begin
|
|
54
|
+
check_condition(precondition, caller)
|
|
55
|
+
Watir.logger.debug "-> `Executing #{inspect}##{caller}`"
|
|
56
|
+
yield
|
|
57
|
+
rescue unknown_exception => e
|
|
58
|
+
element_call(:wait_for_exists, &block) if precondition.nil?
|
|
59
|
+
raise unknown_exception, e.message + custom_message
|
|
60
|
+
rescue Selenium::WebDriver::Error::StaleElementReferenceError, Selenium::WebDriver::Error::NoSuchElementError
|
|
61
|
+
reset!
|
|
62
|
+
retry
|
|
63
|
+
# TODO: - InvalidElementStateError is deprecated, so no longer calling `raise_disabled`
|
|
64
|
+
# need a better way to handle this
|
|
65
|
+
rescue Selenium::WebDriver::Error::ElementNotInteractableError
|
|
66
|
+
raise_present unless browser.timer.remaining_time.positive?
|
|
67
|
+
raise_present unless %i[wait_for_present wait_for_enabled wait_for_writable].include?(precondition)
|
|
68
|
+
retry
|
|
69
|
+
rescue Selenium::WebDriver::Error::NoSuchWindowError
|
|
70
|
+
raise Exception::NoMatchingWindowFoundException, 'browser window was closed'
|
|
71
|
+
ensure
|
|
72
|
+
Watir.logger.debug "<- `Completed #{inspect}##{caller}`"
|
|
73
|
+
browser.timer.reset! unless already_locked
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# rubocop:enable Metrics/AbcSize
|
|
78
|
+
# rubocop:enable Metrics/MethodLength
|
|
79
|
+
def check_condition(condition, caller)
|
|
80
|
+
Watir.logger.debug "<- `Verifying precondition #{inspect}##{condition} for #{caller}`"
|
|
81
|
+
begin
|
|
82
|
+
condition.nil? ? assert_exists : send(condition)
|
|
83
|
+
Watir.logger.debug "<- `Verified precondition #{inspect}##{condition || 'assert_exists'}`"
|
|
84
|
+
rescue unknown_exception
|
|
85
|
+
raise unless condition.nil?
|
|
86
|
+
|
|
87
|
+
Watir.logger.debug "<- `Unable to satisfy precondition #{inspect}##{condition}`"
|
|
88
|
+
check_condition(:wait_for_exists, caller)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def unknown_exception
|
|
93
|
+
Exception::UnknownObjectException
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
class ShadowRoot
|
|
5
|
+
include Container
|
|
6
|
+
include Exception
|
|
7
|
+
include SearchContext
|
|
8
|
+
include Waitable
|
|
9
|
+
|
|
10
|
+
def initialize(element)
|
|
11
|
+
@query_scope = element
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def browser
|
|
15
|
+
@query_scope.browser
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def located?
|
|
19
|
+
!!@shadow_root
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def wd
|
|
23
|
+
assert_exists
|
|
24
|
+
@shadow_root
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def execute_script(script, *args, function_name: nil)
|
|
28
|
+
browser.execute_script(script, *args, function_name: function_name)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def stale?
|
|
32
|
+
@shadow_root.find_elements(css: 'checking_stale_shadow_root')
|
|
33
|
+
false
|
|
34
|
+
rescue Selenium::WebDriver::Error::DetachedShadowRootError
|
|
35
|
+
true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def reset!
|
|
39
|
+
@shadow_root = nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def locate
|
|
43
|
+
@shadow_root = @query_scope.wd.shadow_root
|
|
44
|
+
rescue Selenium::WebDriver::Error::NoSuchShadowRootError
|
|
45
|
+
nil
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# @api private
|
|
50
|
+
#
|
|
51
|
+
|
|
52
|
+
def selector_string
|
|
53
|
+
"#{@query_scope.selector_string} --> shadow_root"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def custom_message
|
|
57
|
+
''
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
module UserEditable
|
|
5
|
+
#
|
|
6
|
+
# Clear the element, then type in the given value.
|
|
7
|
+
#
|
|
8
|
+
# @param [String, Symbol] args
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
def set(*args)
|
|
12
|
+
element_call(:wait_for_writable) do
|
|
13
|
+
@element.clear
|
|
14
|
+
@element.send_keys(*args)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
alias value= set
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Returns true if element is user_editable because it has a content_editable attribute set
|
|
21
|
+
#
|
|
22
|
+
# @return [Boolean]
|
|
23
|
+
#
|
|
24
|
+
|
|
25
|
+
def content_editable
|
|
26
|
+
defined?(@content_editable) && content_editable?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
# Uses JavaScript to enter most of the given value.
|
|
31
|
+
# Selenium is used to enter the first and last characters
|
|
32
|
+
# This might provide a performance improvement when entering a lot of text on a local machine
|
|
33
|
+
#
|
|
34
|
+
# @param [String, Symbol] args
|
|
35
|
+
#
|
|
36
|
+
|
|
37
|
+
def set!(*args)
|
|
38
|
+
msg = '#set! does not support special keys, use #set instead'
|
|
39
|
+
raise ArgumentError, msg if args.any?(::Symbol)
|
|
40
|
+
|
|
41
|
+
input_value = args.join
|
|
42
|
+
set input_value[0]
|
|
43
|
+
return content_editable_set!(*args) if content_editable
|
|
44
|
+
|
|
45
|
+
element_call { execute_js(:setValue, @element, input_value[0..-2]) }
|
|
46
|
+
append(input_value[-1])
|
|
47
|
+
return if value == input_value
|
|
48
|
+
|
|
49
|
+
raise Exception::Error, "#set! value: '#{value}' does not match expected input: '#{input_value}'"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# Appends the given value to the text in the text field.
|
|
54
|
+
#
|
|
55
|
+
# @param [String, Symbol] args
|
|
56
|
+
#
|
|
57
|
+
|
|
58
|
+
def append(*args)
|
|
59
|
+
raise NotImplementedError, '#append method is not supported with contenteditable element' if content_editable
|
|
60
|
+
|
|
61
|
+
send_keys(*args)
|
|
62
|
+
end
|
|
63
|
+
alias << append
|
|
64
|
+
|
|
65
|
+
#
|
|
66
|
+
# Clears the text field.
|
|
67
|
+
#
|
|
68
|
+
|
|
69
|
+
def clear
|
|
70
|
+
element_call(:wait_for_writable) do
|
|
71
|
+
@element.clear
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
private
|
|
76
|
+
|
|
77
|
+
def content_editable_set!(*args)
|
|
78
|
+
input_text = args.join
|
|
79
|
+
element_call { execute_js(:setText, @element, input_text) }
|
|
80
|
+
return if text == input_text
|
|
81
|
+
|
|
82
|
+
raise Exception::Error, "#set! text: '#{text}' does not match expected input: '#{input_text}'"
|
|
83
|
+
end
|
|
84
|
+
end # UserEditable
|
|
85
|
+
end # Watir
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
module Wait
|
|
5
|
+
class Timer
|
|
6
|
+
def initialize(timeout: nil)
|
|
7
|
+
@end_time = timeout ? current_time + timeout : nil
|
|
8
|
+
@remaining_time = @end_time - current_time if @end_time
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# Executes given block until it returns true or exceeds timeout.
|
|
13
|
+
# @param [Integer] timeout
|
|
14
|
+
# @yield block
|
|
15
|
+
# @api private
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
def wait(timeout, &block)
|
|
19
|
+
end_time = @end_time || (current_time + timeout)
|
|
20
|
+
loop do
|
|
21
|
+
yield(block)
|
|
22
|
+
@remaining_time = end_time - current_time
|
|
23
|
+
break if @remaining_time.negative?
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def remaining_time
|
|
28
|
+
@end_time - current_time
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def reset!
|
|
32
|
+
@end_time = nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def locked?
|
|
36
|
+
!@end_time.nil?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
if defined?(Process::CLOCK_MONOTONIC)
|
|
42
|
+
def current_time
|
|
43
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
def current_time
|
|
47
|
+
::Time.now.to_f
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end # Timer
|
|
51
|
+
end # Wait
|
|
52
|
+
end # Watir
|
data/lib/watir/wait.rb
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'watir/wait/timer'
|
|
4
|
+
|
|
5
|
+
module Watir
|
|
6
|
+
module Wait
|
|
7
|
+
class TimeoutError < StandardError; end
|
|
8
|
+
|
|
9
|
+
INTERVAL = 0.1
|
|
10
|
+
|
|
11
|
+
class << self
|
|
12
|
+
#
|
|
13
|
+
# @!attribute timer
|
|
14
|
+
# Access Watir timer implementation in use.
|
|
15
|
+
# @see Timer
|
|
16
|
+
# @return [#wait]
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
attr_writer :timer
|
|
20
|
+
|
|
21
|
+
def timer
|
|
22
|
+
@timer ||= Timer.new
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Waits until the block evaluates to true or times out.
|
|
27
|
+
#
|
|
28
|
+
# @example
|
|
29
|
+
# Watir::Wait.until { browser.text_field(name: "new_user_first_name").visible? }
|
|
30
|
+
#
|
|
31
|
+
# @param [Integer] timeout How long to wait in seconds
|
|
32
|
+
# @param [String] message Message to raise if timeout is exceeded
|
|
33
|
+
# @param [Object, NilClass] object Object to evaluate block against
|
|
34
|
+
# @raise [TimeoutError] if timeout is exceeded
|
|
35
|
+
#
|
|
36
|
+
|
|
37
|
+
def until(timeout: nil, message: nil, interval: nil, object: nil)
|
|
38
|
+
timeout ||= Watir.default_timeout
|
|
39
|
+
run_with_timer(timeout, interval) do
|
|
40
|
+
result = yield(object)
|
|
41
|
+
return result if result
|
|
42
|
+
end
|
|
43
|
+
raise TimeoutError, message_for(timeout, object, message)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# Wait while the block evaluates to true or times out.
|
|
48
|
+
#
|
|
49
|
+
# @example
|
|
50
|
+
# Watir::Wait.while { browser.text_field(name: "abrakadbra").present? }
|
|
51
|
+
#
|
|
52
|
+
# @param [Integer] timeout How long to wait in seconds
|
|
53
|
+
# @param [String] message Message to raise if timeout is exceeded
|
|
54
|
+
# @param [Object, NilClass] object Object to evaluate block against
|
|
55
|
+
# @raise [TimeoutError] if timeout is exceeded
|
|
56
|
+
#
|
|
57
|
+
|
|
58
|
+
def while(timeout: nil, message: nil, interval: nil, object: nil)
|
|
59
|
+
timeout ||= Watir.default_timeout
|
|
60
|
+
run_with_timer(timeout, interval) { return unless yield(object) }
|
|
61
|
+
raise TimeoutError, message_for(timeout, object, message)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def message_for(timeout, object, message)
|
|
67
|
+
message = message.is_a?(Proc) ? message.call(object) : message || ''
|
|
68
|
+
additional = message.empty? ? '' : ", #{message}"
|
|
69
|
+
"timed out after #{timeout} seconds#{additional}"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def run_with_timer(timeout, interval)
|
|
73
|
+
if timeout.zero?
|
|
74
|
+
yield
|
|
75
|
+
else
|
|
76
|
+
timer.wait(timeout) do
|
|
77
|
+
yield
|
|
78
|
+
sleep interval || INTERVAL
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end # self
|
|
83
|
+
end # Wait
|
|
84
|
+
|
|
85
|
+
module Waitable
|
|
86
|
+
#
|
|
87
|
+
# Waits until the condition is true.
|
|
88
|
+
#
|
|
89
|
+
# @example
|
|
90
|
+
# browser.wait_until(timeout: 2) do |browser|
|
|
91
|
+
# browser.windows.size == 1
|
|
92
|
+
# end
|
|
93
|
+
#
|
|
94
|
+
# @example
|
|
95
|
+
# browser.text_field(name: "new_user_first_name").wait_until(&:present?).click
|
|
96
|
+
# browser.text_field(name: "new_user_first_name").wait_until(message: 'foo') { |field| field.present? }
|
|
97
|
+
# browser.text_field(name: "new_user_first_name").wait_until(timeout: 60, &:present?)
|
|
98
|
+
# browser.text_field(name: "new_user_first_name").wait_until(timeout: 60, name: 'new_user_first_name')
|
|
99
|
+
#
|
|
100
|
+
# @param [Integer] timeout seconds to wait before timing out
|
|
101
|
+
# @param [String] message error message for when times out
|
|
102
|
+
#
|
|
103
|
+
|
|
104
|
+
def wait_until(timeout: nil, message: nil, interval: nil, **opt, &blk)
|
|
105
|
+
message ||= proc { |obj| "waiting for true condition on #{obj.inspect}" }
|
|
106
|
+
|
|
107
|
+
# TODO: Consider throwing argument error for mixing block & options
|
|
108
|
+
proc = create_proc(opt, &blk)
|
|
109
|
+
|
|
110
|
+
Wait.until(timeout: timeout, message: message, interval: interval, object: self, &proc)
|
|
111
|
+
|
|
112
|
+
self
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
#
|
|
116
|
+
# Waits while the condition is true.
|
|
117
|
+
#
|
|
118
|
+
# @example
|
|
119
|
+
# browser.wait_while(timeout: 2) do |browser|
|
|
120
|
+
# !browser.exists?
|
|
121
|
+
# end
|
|
122
|
+
# browser.wait_while(timeout: 2, title: 'No')
|
|
123
|
+
#
|
|
124
|
+
# @todo add element example
|
|
125
|
+
#
|
|
126
|
+
# @param [Integer] timeout seconds to wait before timing out
|
|
127
|
+
# @param [String] message error message for when times out
|
|
128
|
+
#
|
|
129
|
+
|
|
130
|
+
def wait_while(timeout: nil, message: nil, interval: nil, **opt, &blk)
|
|
131
|
+
message ||= proc { |obj| "waiting for false condition on #{obj.inspect}" }
|
|
132
|
+
|
|
133
|
+
# TODO: Consider throwing argument error for mixing block & options
|
|
134
|
+
proc = create_proc(opt, &blk)
|
|
135
|
+
|
|
136
|
+
Wait.while(timeout: timeout, message: message, interval: interval, object: self, &proc)
|
|
137
|
+
|
|
138
|
+
self
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
private
|
|
142
|
+
|
|
143
|
+
def create_proc(opt)
|
|
144
|
+
proc do
|
|
145
|
+
reset! if opt.delete(:element_reset) && is_a?(Element)
|
|
146
|
+
(opt.empty? || match_attributes(opt).call) && (!block_given? || yield(self))
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def match_attributes(opt)
|
|
151
|
+
proc do
|
|
152
|
+
opt.keys.all? do |key|
|
|
153
|
+
expected = opt[key]
|
|
154
|
+
actual = if is_a?(Element) && !respond_to?(key)
|
|
155
|
+
attribute_value(key)
|
|
156
|
+
else
|
|
157
|
+
send(key)
|
|
158
|
+
end
|
|
159
|
+
case expected
|
|
160
|
+
when Regexp
|
|
161
|
+
expected =~ actual
|
|
162
|
+
when Numeric
|
|
163
|
+
expected == actual
|
|
164
|
+
else
|
|
165
|
+
expected.to_s == actual
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end # Waitable
|
|
171
|
+
end # Watir
|