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,156 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
class IFrame < HTMLElement
|
|
5
|
+
#
|
|
6
|
+
# Move Driver context into the iframe
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
def switch_to!
|
|
10
|
+
locate unless located?
|
|
11
|
+
wd.switch!
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# Returns text of iframe body.
|
|
16
|
+
# #body ensures context so this method does not have to
|
|
17
|
+
#
|
|
18
|
+
# @return [String]
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
def text
|
|
22
|
+
body.text
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Returns HTML code of iframe.
|
|
27
|
+
#
|
|
28
|
+
# @return [String]
|
|
29
|
+
#
|
|
30
|
+
|
|
31
|
+
def html
|
|
32
|
+
wd.page_source
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# Delegate sending keystrokes to FramedDriver
|
|
37
|
+
#
|
|
38
|
+
|
|
39
|
+
def send_keys(*args)
|
|
40
|
+
wd.send_keys(*args)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
# Executes JavaScript snippet in context of frame.
|
|
45
|
+
#
|
|
46
|
+
# @see Watir::Browser#execute_script
|
|
47
|
+
#
|
|
48
|
+
|
|
49
|
+
def execute_script(script, *args, function_name: nil)
|
|
50
|
+
args.map! do |e|
|
|
51
|
+
Watir.logger.info "Executing Script on Frame: #{function_name}" if function_name
|
|
52
|
+
e.is_a?(Element) ? e.wait_until(&:exists?).wd : e
|
|
53
|
+
end
|
|
54
|
+
returned = driver.execute_script(script, *args)
|
|
55
|
+
|
|
56
|
+
browser.wrap_elements_in(self, returned)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
#
|
|
60
|
+
# Provides access to underlying Selenium Objects as delegated by FramedDriver
|
|
61
|
+
#
|
|
62
|
+
# @return [Watir::FramedDriver]
|
|
63
|
+
#
|
|
64
|
+
|
|
65
|
+
def wd
|
|
66
|
+
super
|
|
67
|
+
FramedDriver.new(@element, browser)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# Cast this Element instance to a more specific subtype.
|
|
72
|
+
# Cached element needs to be the IFrame element, not the FramedDriver
|
|
73
|
+
#
|
|
74
|
+
|
|
75
|
+
def to_subtype
|
|
76
|
+
super.tap { |el| el.cache = @element }
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def unknown_exception
|
|
82
|
+
UnknownFrameException
|
|
83
|
+
end
|
|
84
|
+
end # IFrame
|
|
85
|
+
|
|
86
|
+
class IFrameCollection < ElementCollection
|
|
87
|
+
end # IFrameCollection
|
|
88
|
+
|
|
89
|
+
class Frame < IFrame
|
|
90
|
+
end # Frame
|
|
91
|
+
|
|
92
|
+
class FrameCollection < IFrameCollection
|
|
93
|
+
end # FrameCollection
|
|
94
|
+
|
|
95
|
+
module Container
|
|
96
|
+
def frame(opts = {})
|
|
97
|
+
Frame.new(self, opts.merge(tag_name: 'frame'))
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def frames(opts = {})
|
|
101
|
+
FrameCollection.new(self, opts.merge(tag_name: 'frame'))
|
|
102
|
+
end
|
|
103
|
+
end # Container
|
|
104
|
+
|
|
105
|
+
#
|
|
106
|
+
# @api private
|
|
107
|
+
#
|
|
108
|
+
|
|
109
|
+
class FramedDriver
|
|
110
|
+
include Exception
|
|
111
|
+
|
|
112
|
+
def initialize(element, browser)
|
|
113
|
+
@element = element
|
|
114
|
+
@browser = browser
|
|
115
|
+
@driver = browser.wd
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def ==(other)
|
|
119
|
+
wd == other.wd
|
|
120
|
+
end
|
|
121
|
+
alias eql? ==
|
|
122
|
+
|
|
123
|
+
def send_keys(*args)
|
|
124
|
+
switch!
|
|
125
|
+
@driver.switch_to.active_element.send_keys(*args)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def switch!
|
|
129
|
+
@driver.switch_to.frame @element
|
|
130
|
+
@browser.default_context = false
|
|
131
|
+
rescue Selenium::WebDriver::Error::NoSuchFrameError => e
|
|
132
|
+
raise UnknownFrameException, e.message
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def wd
|
|
136
|
+
@element
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def respond_to_missing?(meth, _include_private)
|
|
140
|
+
@driver.respond_to?(meth) || @element.respond_to?(meth) || super(meth, false)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def method_missing(meth, *args, &blk)
|
|
144
|
+
if %i[find_element find_elements].include?(meth)
|
|
145
|
+
@driver.send(meth, *args, &blk)
|
|
146
|
+
elsif @driver.respond_to?(meth)
|
|
147
|
+
switch!
|
|
148
|
+
@driver.send(meth, *args, &blk)
|
|
149
|
+
elsif @element.respond_to?(meth)
|
|
150
|
+
@element.send(meth, *args, &blk)
|
|
151
|
+
else
|
|
152
|
+
super
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end # FramedDriver
|
|
156
|
+
end # Watir
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
class Image < HTMLElement
|
|
5
|
+
#
|
|
6
|
+
# Returns true if image is loaded.
|
|
7
|
+
#
|
|
8
|
+
# @return [Boolean]
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
def loaded?
|
|
12
|
+
return false unless complete?
|
|
13
|
+
|
|
14
|
+
element_call { execute_js(:isImageLoaded, @element) }
|
|
15
|
+
end
|
|
16
|
+
end # Image
|
|
17
|
+
|
|
18
|
+
module Container
|
|
19
|
+
alias image img
|
|
20
|
+
alias images imgs
|
|
21
|
+
end # Container
|
|
22
|
+
end # Watir
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
class Input < HTMLElement
|
|
5
|
+
#
|
|
6
|
+
# Returns label element associated with Input element.
|
|
7
|
+
#
|
|
8
|
+
# @return [Watir::Label]
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
def label
|
|
12
|
+
parent(tag_name: 'form').label(for: id)
|
|
13
|
+
end
|
|
14
|
+
end # Input
|
|
15
|
+
end # Watir
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
module List
|
|
5
|
+
include Enumerable
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# Yields each LI associated with this list.
|
|
9
|
+
#
|
|
10
|
+
# @example
|
|
11
|
+
# list = browser.ol
|
|
12
|
+
# list.each do |li|
|
|
13
|
+
# puts li.text
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# @yieldparam [Watir::LI] element Iterate through the items for this List.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
def each(&block)
|
|
20
|
+
list_items.each(&block)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
alias length count
|
|
24
|
+
alias size count
|
|
25
|
+
alias items count
|
|
26
|
+
alias empty? none?
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Returns item from this list at given index.
|
|
30
|
+
#
|
|
31
|
+
# @param [Integer] idx
|
|
32
|
+
# @return Watir::LI
|
|
33
|
+
#
|
|
34
|
+
|
|
35
|
+
def [](idx)
|
|
36
|
+
list_items[idx]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def list_items
|
|
40
|
+
LICollection.new(self, adjacent: :child, tag_name: 'li')
|
|
41
|
+
end
|
|
42
|
+
end # List
|
|
43
|
+
|
|
44
|
+
class OList < HTMLElement
|
|
45
|
+
include List
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class UList < HTMLElement
|
|
49
|
+
include List
|
|
50
|
+
end
|
|
51
|
+
end # Watir
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
#
|
|
5
|
+
# Represents an option in a select list.
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
class Option < HTMLElement
|
|
9
|
+
#
|
|
10
|
+
# Selects this option.
|
|
11
|
+
#
|
|
12
|
+
# @example
|
|
13
|
+
# browser.select(id: "foo").options.first.select
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
alias select click
|
|
17
|
+
|
|
18
|
+
#
|
|
19
|
+
# Toggles the selected state of this option.
|
|
20
|
+
#
|
|
21
|
+
# @example
|
|
22
|
+
# browser.select(id: "foo").options.first.toggle
|
|
23
|
+
#
|
|
24
|
+
|
|
25
|
+
alias toggle click
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Clears (i.e. toggles selected state) option.
|
|
29
|
+
#
|
|
30
|
+
# @example
|
|
31
|
+
# browser.select(id: "foo").options.first.clear
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
def clear
|
|
35
|
+
click if selected?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Is this option selected?
|
|
40
|
+
#
|
|
41
|
+
# @return [Boolean]
|
|
42
|
+
#
|
|
43
|
+
|
|
44
|
+
def selected?
|
|
45
|
+
element_call { @element.selected? }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# Returns the text of option.
|
|
50
|
+
#
|
|
51
|
+
# getAttribute atom pulls the text value if the label does not exist
|
|
52
|
+
#
|
|
53
|
+
# @return [String]
|
|
54
|
+
#
|
|
55
|
+
|
|
56
|
+
def text
|
|
57
|
+
attribute_value(:label)
|
|
58
|
+
end
|
|
59
|
+
end # Option
|
|
60
|
+
end # Watir
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
class Radio < Input
|
|
5
|
+
def build
|
|
6
|
+
@selector[:label] = @selector.delete(:text) if @selector.key?(:text)
|
|
7
|
+
super
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# Selects this radio button.
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
def set(bool = true)
|
|
15
|
+
click if bool && !set?
|
|
16
|
+
end
|
|
17
|
+
alias select set
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Is this radio set?
|
|
21
|
+
#
|
|
22
|
+
# @return [Boolean]
|
|
23
|
+
#
|
|
24
|
+
|
|
25
|
+
def set?
|
|
26
|
+
element_call { @element.selected? }
|
|
27
|
+
end
|
|
28
|
+
alias selected? set?
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# Returns the text of the associated label.
|
|
32
|
+
# Returns empty string if no label is found.
|
|
33
|
+
#
|
|
34
|
+
# @return [String]
|
|
35
|
+
#
|
|
36
|
+
|
|
37
|
+
def text
|
|
38
|
+
l = label
|
|
39
|
+
l.exist? ? l.text : ''
|
|
40
|
+
end
|
|
41
|
+
end # Radio
|
|
42
|
+
|
|
43
|
+
module Container
|
|
44
|
+
def radio(opts = {})
|
|
45
|
+
Radio.new(self, opts.merge(tag_name: 'input', type: 'radio'))
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def radios(opts = {})
|
|
49
|
+
RadioCollection.new(self, opts.merge(tag_name: 'input', type: 'radio'))
|
|
50
|
+
end
|
|
51
|
+
end # Container
|
|
52
|
+
|
|
53
|
+
class RadioCollection < InputCollection
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def build
|
|
57
|
+
@selector[:label] = @selector.delete(:text) if @selector.key?(:text)
|
|
58
|
+
super
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def element_class
|
|
62
|
+
Radio
|
|
63
|
+
end
|
|
64
|
+
end # RadioCollection
|
|
65
|
+
end # Watir
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
#
|
|
5
|
+
# Custom class representing table row (tr).
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
class Row < TableRow
|
|
9
|
+
end # Row
|
|
10
|
+
|
|
11
|
+
class RowCollection < TableRowCollection
|
|
12
|
+
def to_a
|
|
13
|
+
# we do this craziness since the xpath used will find direct child rows
|
|
14
|
+
# before any rows inside thead/tbody/tfoot...
|
|
15
|
+
@to_a ||= super.sort_by { |e| e.attribute_value(:rowIndex).to_i }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end # Watir
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
class Select < HTMLElement
|
|
5
|
+
#
|
|
6
|
+
# Clears all selected options.
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
def clear
|
|
10
|
+
raise Exception::Error, 'you can only clear multi-selects' unless multiple_select_list?
|
|
11
|
+
|
|
12
|
+
selected_options.each(&:click)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# Returns true if the select list has one or more options where text or label matches the given value.
|
|
17
|
+
#
|
|
18
|
+
# @param [String, Regexp] str_or_rx
|
|
19
|
+
# @return [Boolean]
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
def include?(str_or_rx)
|
|
23
|
+
option(text: str_or_rx).exist? || option(label: str_or_rx).exist? || option(value: str_or_rx).exist?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# Select the option whose text or label matches the given string.
|
|
28
|
+
#
|
|
29
|
+
# @param [String, Regexp] str_or_rx
|
|
30
|
+
# @raise [Watir::Exception::NoValueFoundException] if the value does not exist.
|
|
31
|
+
# @return [String] The text of the option selected. If multiple options match, returns the first match.
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
def select(*str_or_rx, text: nil, value: nil, label: nil)
|
|
35
|
+
key, value = parse_select_args(str_or_rx, text, value, label)
|
|
36
|
+
|
|
37
|
+
if value.size > 1 || value.first.is_a?(Array)
|
|
38
|
+
value.flatten.map { |v| select_all_by key, v }.first
|
|
39
|
+
else
|
|
40
|
+
select_matching([find_option(key, value.flatten.first)])
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
alias set select
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Uses JavaScript to select the option whose text matches the given string.
|
|
47
|
+
#
|
|
48
|
+
# @param [String, Regexp] str_or_rx
|
|
49
|
+
# @raise [Watir::Exception::NoValueFoundException] if the value does not exist.
|
|
50
|
+
#
|
|
51
|
+
|
|
52
|
+
def select!(*str_or_rx, text: nil, value: nil, label: nil)
|
|
53
|
+
key, value = parse_select_args(str_or_rx, text, value, label)
|
|
54
|
+
|
|
55
|
+
if value.size > 1 || value.first.is_a?(Array)
|
|
56
|
+
value.flatten.map { |v| select_by! key, v, :multiple }.first
|
|
57
|
+
else
|
|
58
|
+
value.flatten.map { |v| select_by! key, v, :single }.first
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# Returns true if any of the selected options' text or label matches the given value.
|
|
64
|
+
#
|
|
65
|
+
# @param [String, Regexp] str_or_rx
|
|
66
|
+
# @raise [Watir::Exception::UnknownObjectException] if the options do not exist
|
|
67
|
+
# @return [Boolean]
|
|
68
|
+
#
|
|
69
|
+
|
|
70
|
+
def selected?(*str_or_rx, text: nil, value: nil, label: nil)
|
|
71
|
+
key, value = parse_select_args(str_or_rx, text, value, label)
|
|
72
|
+
|
|
73
|
+
find_option(key, value.first).selected?
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
#
|
|
77
|
+
# Returns the value of the first selected option in the select list.
|
|
78
|
+
# Returns nil if no option is selected.
|
|
79
|
+
#
|
|
80
|
+
# @return [String, nil]
|
|
81
|
+
#
|
|
82
|
+
|
|
83
|
+
def value
|
|
84
|
+
selected_options.first&.value
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# Returns the text of the first selected option in the select list.
|
|
89
|
+
# Returns nil if no option is selected.
|
|
90
|
+
#
|
|
91
|
+
# @return [String, nil]
|
|
92
|
+
#
|
|
93
|
+
|
|
94
|
+
# TODO: What is default behavior without #first ?
|
|
95
|
+
def text
|
|
96
|
+
selected_options.first&.text
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Returns an array of currently selected options.
|
|
100
|
+
#
|
|
101
|
+
# @return [Array<Watir::Option>]
|
|
102
|
+
#
|
|
103
|
+
|
|
104
|
+
def selected_options
|
|
105
|
+
element_call { execute_js :selectedOptions, self }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
private
|
|
109
|
+
|
|
110
|
+
def multiple_select_list?
|
|
111
|
+
@multiple_select = @multiple_select.nil? ? multiple? : @multiple_select
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def parse_select_args(str_or_rx, text, value, label)
|
|
115
|
+
selectors = {}
|
|
116
|
+
selectors[:any] = str_or_rx unless str_or_rx.empty?
|
|
117
|
+
selectors[:text] = [text] if text
|
|
118
|
+
selectors[:value] = [value] if value
|
|
119
|
+
selectors[:label] = [label] if label
|
|
120
|
+
|
|
121
|
+
raise ArgumentError, "too many arguments used for Select#select: #{selectors}" if selectors.size > 1
|
|
122
|
+
|
|
123
|
+
selectors.first
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def select_by!(key, str_or_rx, number)
|
|
127
|
+
str_or_rx = type_check(str_or_rx)
|
|
128
|
+
|
|
129
|
+
js_rx = process_str_or_rx(str_or_rx)
|
|
130
|
+
approaches = key == :any ? %w[Text Label Value] : [key.to_s.capitalize]
|
|
131
|
+
|
|
132
|
+
approaches.each do |approach|
|
|
133
|
+
element_call { execute_js("selectOptions#{approach}", self, js_rx, number.to_s) }
|
|
134
|
+
return selected_options.first.text if matching_option?(approach.downcase, str_or_rx)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
raise_no_value_found(str_or_rx)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def process_str_or_rx(str_or_rx)
|
|
141
|
+
case str_or_rx
|
|
142
|
+
when String
|
|
143
|
+
"^#{str_or_rx}$"
|
|
144
|
+
when Regexp
|
|
145
|
+
str_or_rx.inspect.sub('\\A', '^')
|
|
146
|
+
.sub('\\Z', '$')
|
|
147
|
+
.sub('\\z', '$')
|
|
148
|
+
.sub(%r{^/}, '')
|
|
149
|
+
.sub(%r{/[a-z]*$}, '')
|
|
150
|
+
.gsub(/\(\?#.+\)/, '')
|
|
151
|
+
.gsub(/\(\?-\w+:/, '(')
|
|
152
|
+
else
|
|
153
|
+
raise TypeError, "expected String or Regexp, got #{str_or_rx.inspect}:#{str_or_rx.class}"
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def matching_option?(how, what)
|
|
158
|
+
selected_options.each do |opt|
|
|
159
|
+
value = opt.send(how)
|
|
160
|
+
next unless what.is_a?(String) ? value == what : value =~ what
|
|
161
|
+
return true if opt.enabled?
|
|
162
|
+
|
|
163
|
+
raise ObjectDisabledException, "option matching #{what} by #{how} on #{inspect} is disabled"
|
|
164
|
+
end
|
|
165
|
+
false
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def select_all_by(key, str_or_rx)
|
|
169
|
+
raise Error, 'you can only use #select_all on multi-selects' unless multiple_select_list?
|
|
170
|
+
|
|
171
|
+
select_matching(find_options(key, str_or_rx))
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def find_option(key, str_or_rx)
|
|
175
|
+
val = type_check(str_or_rx)
|
|
176
|
+
|
|
177
|
+
option(key => val).wait_until(&:exists?)
|
|
178
|
+
rescue Wait::TimeoutError
|
|
179
|
+
raise_no_value_found(str_or_rx)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def find_options(key, str_or_rx)
|
|
183
|
+
val = type_check(str_or_rx)
|
|
184
|
+
|
|
185
|
+
options(key => val).wait_until(&:exists?)
|
|
186
|
+
rescue Wait::TimeoutError
|
|
187
|
+
raise_no_value_found(str_or_rx)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def type_check(str_or_rx)
|
|
191
|
+
str_or_rx = str_or_rx.to_s if str_or_rx.is_a?(Numeric)
|
|
192
|
+
return str_or_rx if [String, Regexp].any? { |k| str_or_rx.is_a?(k) }
|
|
193
|
+
|
|
194
|
+
raise TypeError, "expected String, Numeric or Regexp, got #{str_or_rx.inspect}:#{str_or_rx.class}"
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# TODO: Consider locating the Select List before throwing the exception
|
|
198
|
+
def raise_no_value_found(str_or_rx)
|
|
199
|
+
raise NoValueFoundException, "#{str_or_rx.inspect} not found in #{inspect}"
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def select_matching(elements)
|
|
203
|
+
elements.each { |e| e.click unless e.selected? }
|
|
204
|
+
elements.first.exists? ? elements.first.text : ''
|
|
205
|
+
end
|
|
206
|
+
end # Select
|
|
207
|
+
|
|
208
|
+
module Container
|
|
209
|
+
alias select_list select
|
|
210
|
+
alias select_lists selects
|
|
211
|
+
|
|
212
|
+
Watir.tag_to_class[:select_list] = Select
|
|
213
|
+
end # Container
|
|
214
|
+
end # Watir
|