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,121 @@
|
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<title>Tables</title>
|
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
6
|
+
<script src="javascript/helpers.js" type="text/javascript" charset="utf-8"></script>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="messages"></div>
|
|
10
|
+
<h1>Tables</h1>
|
|
11
|
+
<h2>Semantic table</h2>
|
|
12
|
+
<table cellspacing="0" data-locator="top table" cellpadding="5" rules="groups" frame="box" border="1" id="axis_example" summary="Hugh Laurie made more money than Gregory House in both March and April of 2008.">
|
|
13
|
+
<caption>Income tax information for Gregory House and Hugh Laurie</caption>
|
|
14
|
+
<colgroup width="25%" align="left"></colgroup>
|
|
15
|
+
<colgroup width="25%" span="3" align="right"></colgroup>
|
|
16
|
+
<thead id="tax_headers">
|
|
17
|
+
<tr style="border-bottom: 1px solid black;" class="dark" id="thead_row_1" data-locator="thead row">
|
|
18
|
+
<th></th>
|
|
19
|
+
<th id="before_tax" axis="cash" abbr="Before tax">Before income tax</th>
|
|
20
|
+
<th id="tax" axis="cash" abbr="Tax">Income tax</th>
|
|
21
|
+
<th id="after_tax" axis="cash" abbr="After tax">After income tax</th>
|
|
22
|
+
</tr>
|
|
23
|
+
</thead>
|
|
24
|
+
<tfoot id="tax_totals">
|
|
25
|
+
<tr class="dark" id="tfoot_row_1" data-locator="tfoot row">
|
|
26
|
+
<th axis="sum">Sum</th>
|
|
27
|
+
<td headers="before_tax">24 349</td>
|
|
28
|
+
<td headers="tax">5 577</td>
|
|
29
|
+
<td headers="after_tax">18 722</td>
|
|
30
|
+
</tr>
|
|
31
|
+
</tfoot>
|
|
32
|
+
<tbody id="first">
|
|
33
|
+
<tr id="march" data-locator="tbody row">
|
|
34
|
+
<th id="d1" axis="date" scope="rowgroup">March 2008</th>
|
|
35
|
+
<th></th>
|
|
36
|
+
<th></th>
|
|
37
|
+
<th></th>
|
|
38
|
+
</tr>
|
|
39
|
+
<tr id="gregory" class="brick" data-locator="House row">
|
|
40
|
+
<td id="p1" abbr="Dr. House"data-locator="first cell">Gregory House</td>
|
|
41
|
+
<td headers="before_tax p1 d1" data-locator="before tax">5 934</td>
|
|
42
|
+
<td headers="tax p1 d1" data-locator="tax">1 347</td>
|
|
43
|
+
<td id="last" headers="after_tax p1 d1" data-locator="after tax">4 587</td>
|
|
44
|
+
</tr>
|
|
45
|
+
<tr id="hugh">
|
|
46
|
+
<td id="p2" abbr="Laurie" data-locator="hugh">Hugh Laurie</td>
|
|
47
|
+
<td headers="before_tax p2 d1">6 300</td>
|
|
48
|
+
<td headers="tax p2 d1">1 479</td>
|
|
49
|
+
<td headers="after_tax p2 d1">4 821</td>
|
|
50
|
+
</tr>
|
|
51
|
+
</tbody>
|
|
52
|
+
<tbody name="second" id="second">
|
|
53
|
+
<tr>
|
|
54
|
+
<th id="d2" axis="date" scope="rowgroup">April 2008</th>
|
|
55
|
+
<th></th>
|
|
56
|
+
<th></th>
|
|
57
|
+
<th></th>
|
|
58
|
+
</tr>
|
|
59
|
+
<tr>
|
|
60
|
+
<td id="p3" abbr="Dr. House">Gregory House</td>
|
|
61
|
+
<td headers="before_tax p3 d2">5 863</td>
|
|
62
|
+
<td headers="tax p3 d2">1 331</td>
|
|
63
|
+
<td headers="after_tax p3 d2">4 532</td>
|
|
64
|
+
</tr>
|
|
65
|
+
<tr>
|
|
66
|
+
<td id="p4" abbr="Laurie">Hugh Laurie</td>
|
|
67
|
+
<td headers="before_tax p4 d2">6 252</td>
|
|
68
|
+
<td headers="tax p4 d2">1 420</td>
|
|
69
|
+
<td headers="after_tax p4 d2">4 <span id="cell-child">832</span></td>
|
|
70
|
+
</tr>
|
|
71
|
+
</tbody>
|
|
72
|
+
</table>
|
|
73
|
+
<h2>Table inside a table</h2>
|
|
74
|
+
<table border="1" id="outer">
|
|
75
|
+
<tr id="outer_first" data-locator="first row">
|
|
76
|
+
<td>
|
|
77
|
+
Table 1, Row 1, Cell 1
|
|
78
|
+
</td>
|
|
79
|
+
<td>
|
|
80
|
+
Table 1, Row 1, Cell 2
|
|
81
|
+
</td>
|
|
82
|
+
</tr>
|
|
83
|
+
<tr id="outer_second" data-locator="middle row">
|
|
84
|
+
<td id="t1_r2_c1">
|
|
85
|
+
Table 1, Row 2, Cell 1
|
|
86
|
+
</td>
|
|
87
|
+
<td id="t1_r2_c2">
|
|
88
|
+
Table 1, Row 2, Cell 2
|
|
89
|
+
<table border="1" id="inner" onclick="WatirSpec.addMessage('table')">
|
|
90
|
+
<tr id="inner_first" onclick="WatirSpec.addMessage('tr')">
|
|
91
|
+
<td id="t2_r1_c1" onclick="WatirSpec.addMessage('td')">
|
|
92
|
+
Table 2, Row 1, Cell 1
|
|
93
|
+
</td>
|
|
94
|
+
<td>
|
|
95
|
+
Table 2, Row 1, Cell 2
|
|
96
|
+
</td>
|
|
97
|
+
</tr>
|
|
98
|
+
</table>
|
|
99
|
+
</td>
|
|
100
|
+
</tr>
|
|
101
|
+
<tr id="outer_last" data-locator="last row">
|
|
102
|
+
<td>
|
|
103
|
+
Table 1, Row 3, Cell 1
|
|
104
|
+
</td>
|
|
105
|
+
<td>
|
|
106
|
+
Table 1, Row 3, Cell 2
|
|
107
|
+
</td>
|
|
108
|
+
</tr>
|
|
109
|
+
</table>
|
|
110
|
+
<h2>Colspan</h2>
|
|
111
|
+
<table border="1" id="colspan">
|
|
112
|
+
<tr>
|
|
113
|
+
<td colspan="2" id="colspan_2">Colspan 2</td>
|
|
114
|
+
</tr>
|
|
115
|
+
<tr>
|
|
116
|
+
<td id="no_colspan">No colspan attribute</td>
|
|
117
|
+
<td>No colspan attribute</td>
|
|
118
|
+
</tr>
|
|
119
|
+
</table>
|
|
120
|
+
</body>
|
|
121
|
+
</html>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
2
|
+
<html lang='en_gb' xml:lang='en_gb' xmlns='http://www.w3.org/1999/xhtml'>
|
|
3
|
+
<head>
|
|
4
|
+
<title>
|
|
5
|
+
Timeout test
|
|
6
|
+
</title>
|
|
7
|
+
<meta content='text/html; charset=utf-8' http-equiv='content-type' />
|
|
8
|
+
<script type='text/javascript'>
|
|
9
|
+
//<![CDATA[
|
|
10
|
+
function move_on() {
|
|
11
|
+
window.location = 'non_control_elements.html';
|
|
12
|
+
}
|
|
13
|
+
//]]>
|
|
14
|
+
</script>
|
|
15
|
+
</head>
|
|
16
|
+
<body onload='setTimeout(move_on, 500)'>
|
|
17
|
+
Wait 500ms for the next page.
|
|
18
|
+
</body>
|
|
19
|
+
</html>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>Uneven Table</title>
|
|
6
|
+
</head>
|
|
7
|
+
<body>
|
|
8
|
+
<table border="0" cellspacing="5" cellpadding="5">
|
|
9
|
+
<tr>
|
|
10
|
+
<th>Header 1</th>
|
|
11
|
+
<th>Header 2</th>
|
|
12
|
+
<th>Header 3</th>
|
|
13
|
+
</tr>
|
|
14
|
+
<tr>
|
|
15
|
+
<td>Data 1</td>
|
|
16
|
+
<td>Data 2</td>
|
|
17
|
+
</tr>
|
|
18
|
+
</table>
|
|
19
|
+
</body>
|
|
20
|
+
</html>
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<!DOCTYPE HTML>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>wait test</title>
|
|
5
|
+
<script type="text/javascript" charset="utf-8">
|
|
6
|
+
|
|
7
|
+
function setTimeoutAddDisplay(id, current_id, timeout) {
|
|
8
|
+
setTimeoutAdd(id, "none", id, current_id, timeout);
|
|
9
|
+
setTimeoutDisplay(id, "block", timeout*2)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function setTimeoutDisplay(id, display, timeout) {
|
|
13
|
+
setTimeout(function() {
|
|
14
|
+
var el = document.getElementById(id)
|
|
15
|
+
el.style.display = display;
|
|
16
|
+
el.setAttribute("custom", id)
|
|
17
|
+
}, timeout);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function setTimeoutAdd(id, display, text, existing_id, timeout) {
|
|
21
|
+
var newDiv = document.createElement("div");
|
|
22
|
+
newDiv.setAttribute("id", id);
|
|
23
|
+
newDiv.style.display = display;
|
|
24
|
+
newDiv.appendChild(document.createTextNode(text));
|
|
25
|
+
|
|
26
|
+
var currentDiv = document.getElementById(existing_id);
|
|
27
|
+
|
|
28
|
+
setTimeout(function() {
|
|
29
|
+
document.body.insertBefore(newDiv, currentDiv);
|
|
30
|
+
}, timeout);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function setTimeoutRemove(id, timeout) {
|
|
34
|
+
setTimeout(function() {
|
|
35
|
+
var e = document.getElementById(id);
|
|
36
|
+
e.parentNode.removeChild(e);
|
|
37
|
+
}, timeout);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function setDisabled(id, disabled, timeout) {
|
|
41
|
+
setTimeout(function() {
|
|
42
|
+
document.getElementById(id).disabled = disabled;
|
|
43
|
+
}, timeout);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function makeWritable(id, timeout) {
|
|
47
|
+
setTimeout(function() {
|
|
48
|
+
document.getElementById(id).removeAttribute('readonly');
|
|
49
|
+
}, timeout);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function changeName(id) {
|
|
53
|
+
document.getElementById(id).name = 'different';
|
|
54
|
+
}
|
|
55
|
+
</script>
|
|
56
|
+
</head>
|
|
57
|
+
|
|
58
|
+
<body>
|
|
59
|
+
<div id="foo" custom="" style="display:block;">foo</div>
|
|
60
|
+
<div id="bar" style="display:none;" onclick='this.innerHTML = "changed"'>bar</div>
|
|
61
|
+
<a id="show_bar" href="#" onclick="setTimeoutDisplay('bar', 'block', 1000);">show bar</a>
|
|
62
|
+
<a id="hide_foo" href="#" onclick="setTimeoutDisplay('foo', 'none', 1000);">hide foo</a>
|
|
63
|
+
<a id="remove_foo" href="#" onclick="setTimeoutRemove('foo', 1000);">remove foo</a>
|
|
64
|
+
<a id="add_foobar" href="#" onclick="setTimeoutAddDisplay('foobar', 'bar', 1000);">add foobar</a>
|
|
65
|
+
<a id="readd_bar" href="#" onclick="setTimeoutRemove('bar', 500); setTimeoutAddDisplay('bar', 'foo', 1000);">re-add bar</a>
|
|
66
|
+
<div id="buttons">
|
|
67
|
+
<button id="btn" type="button" onclick="setDisabled('btn', true, 0);" disabled>Click To Disable!</button>
|
|
68
|
+
<a id="enable_btn" href="#" onclick="setDisabled('btn', false, 1000);">enable btn</a>
|
|
69
|
+
<button id="btn2" style="display:none;" type="button" disabled>Hidden and Disabled</button>
|
|
70
|
+
<a id="show_and_enable_btn" href="#" onclick="setTimeoutDisplay('btn2', 'block', 500); setDisabled('btn2', false, 1000);">
|
|
71
|
+
show and enable btn
|
|
72
|
+
</a>
|
|
73
|
+
</div>
|
|
74
|
+
<div>
|
|
75
|
+
<a id="change_select" href="#" onclick="changeName('add_select');">change select list</a>
|
|
76
|
+
<a id="add_select" name="add_select" href="#" onclick="setTimeoutDisplay('languages', 'block', 500);">show select list</a>
|
|
77
|
+
</div>
|
|
78
|
+
<form>
|
|
79
|
+
<label for="textfield">Not Displayed Yet</label>
|
|
80
|
+
<input type="textfield" title="Text Displayed" name="textfield" id="textfield" style="display:none;" /> <br />
|
|
81
|
+
<a id="show_textfield" href="#" onclick="setTimeoutDisplay('textfield', 'block', 1000);">show textfield</a>
|
|
82
|
+
<label for="writable">Not Writable</label>
|
|
83
|
+
<input type="text" title="Not Writable" name="writable" id="writable" readonly/> <br />
|
|
84
|
+
<a id="make-writable" onclick="makeWritable('writable', 1000);">Make Writable</a>
|
|
85
|
+
<fieldset>
|
|
86
|
+
<select name="languages" id="languages", style="display: none">
|
|
87
|
+
<option id="danish" value="1">Danish</option>
|
|
88
|
+
<option selected="selected" value="2">English</option>
|
|
89
|
+
<option selected="selected" value="3">Norwegian</option>
|
|
90
|
+
<option value="4" disabled>Russian</option>
|
|
91
|
+
<option>Swedish</option>
|
|
92
|
+
</select> <br />
|
|
93
|
+
</fieldset>
|
|
94
|
+
</form>
|
|
95
|
+
<div id="also_hidden" style="display:none;">
|
|
96
|
+
<div id="hidden_child">Nothing to see here</div>
|
|
97
|
+
</div>
|
|
98
|
+
</body>
|
|
99
|
+
</html>
|
|
File without changes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!DOCTYPE HTML>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>window switching</title>
|
|
5
|
+
<script>
|
|
6
|
+
function windowOpenDelayed(timeout) {
|
|
7
|
+
setTimeout(function() {
|
|
8
|
+
window.open("closeable.html");
|
|
9
|
+
}, timeout);
|
|
10
|
+
}
|
|
11
|
+
</script>
|
|
12
|
+
</head>
|
|
13
|
+
|
|
14
|
+
<body>
|
|
15
|
+
<p>
|
|
16
|
+
Click <a id="open" href="#" onclick='window.open("closeable.html")'>here</a> to open a new window.
|
|
17
|
+
</p>
|
|
18
|
+
<p>
|
|
19
|
+
Click <a id="delayed" href="#" onclick=windowOpenDelayed(1000)>here</a> to open a new window after a delay.
|
|
20
|
+
</p>
|
|
21
|
+
</body>
|
|
22
|
+
</html>
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'watirspec_helper'
|
|
4
|
+
|
|
5
|
+
module Watir
|
|
6
|
+
describe RadioSet do
|
|
7
|
+
before do
|
|
8
|
+
browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Exists method
|
|
12
|
+
describe '#exists?' do
|
|
13
|
+
it 'returns true if matches any radio_set button' do
|
|
14
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes')).to exist
|
|
15
|
+
expect(browser.radio_set(id: /new_user_newsletter_yes/)).to exist
|
|
16
|
+
expect(browser.radio_set(name: 'new_user_newsletter')).to exist
|
|
17
|
+
expect(browser.radio_set(name: /new_user_newsletter/)).to exist
|
|
18
|
+
expect(browser.radio_set(value: 'yes')).to exist
|
|
19
|
+
expect(browser.radio_set(value: /yes/)).to exist
|
|
20
|
+
expect(browser.radio_set(class: 'huge')).to exist
|
|
21
|
+
expect(browser.radio_set(class: /huge/)).to exist
|
|
22
|
+
expect(browser.radio_set(index: 0)).to exist
|
|
23
|
+
expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_yes']")).to exist
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'returns false if no radio button exists' do
|
|
27
|
+
expect(browser.radio_set(id: 'no_such_id')).not_to exist
|
|
28
|
+
expect(browser.radio_set(id: /no_such_id/)).not_to exist
|
|
29
|
+
expect(browser.radio_set(name: 'no_such_name')).not_to exist
|
|
30
|
+
expect(browser.radio_set(name: /no_such_name/)).not_to exist
|
|
31
|
+
expect(browser.radio_set(value: 'no_such_value')).not_to exist
|
|
32
|
+
expect(browser.radio_set(value: /no_such_value/)).not_to exist
|
|
33
|
+
expect(browser.radio_set(text: 'no_such_text')).not_to exist
|
|
34
|
+
expect(browser.radio_set(text: /no_such_text/)).not_to exist
|
|
35
|
+
expect(browser.radio_set(class: 'no_such_class')).not_to exist
|
|
36
|
+
expect(browser.radio_set(class: /no_such_class/)).not_to exist
|
|
37
|
+
expect(browser.radio_set(index: 1337)).not_to exist
|
|
38
|
+
expect(browser.radio_set(xpath: "input[@id='no_such_id']")).not_to exist
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'returns the first radio set if given no args' do
|
|
42
|
+
expect(browser.radio_set).to exist
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "raises TypeError when 'what' argument is invalid" do
|
|
46
|
+
expect { browser.radio_set(id: 3.14).exists? }.to raise_error(TypeError)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Attribute methods
|
|
51
|
+
describe '#name' do
|
|
52
|
+
it 'returns the name attribute if the radio exists' do
|
|
53
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes').name).to eq 'new_user_newsletter'
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'returns an empty string if the radio exists and there is not name' do
|
|
57
|
+
expect(browser.radio_set(id: 'new_user_newsletter_absolutely').name).to eq ''
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "raises UnknownObjectException if the radio doesn't exist" do
|
|
61
|
+
expect { browser.radio_set(index: 1337).name }.to raise_unknown_object_exception
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context 'without name specified' do
|
|
66
|
+
it 'Finds specified radio' do
|
|
67
|
+
expect(browser.radio_set(id: 'new_user_newsletter_absolutely').count).to eq 1
|
|
68
|
+
expect(browser.radio_set(id: 'new_user_newsletter_absolutely').radios.size).to eq 1
|
|
69
|
+
expect(browser.radio_set(id: 'new_user_newsletter_absolutely').radio(value: 'absolutely').exist?).to be true
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe '#type' do
|
|
74
|
+
it 'returns the type attribute if the radio set exists' do
|
|
75
|
+
expect(browser.radio_set.type).to eq 'radio'
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "raises UnknownObjectException if the radio doesn't exist" do
|
|
79
|
+
expect { browser.radio_set(index: 1337).type }.to raise_unknown_object_exception
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
describe '#value' do
|
|
84
|
+
it 'returns the value attributes of the selected radio button' do
|
|
85
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes').value).to eq 'yes'
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "raises UnknownObjectException if the radio doesn't exist" do
|
|
89
|
+
expect { browser.radio_set(index: 1337).value }.to raise_unknown_object_exception
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
describe '#text' do
|
|
94
|
+
it 'returns the text of the selected radio button' do
|
|
95
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes').text).to eq 'Yes'
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "raises UnknownObjectException if the radio set doesn't exist" do
|
|
99
|
+
expect { browser.radio_set(index: 1337).text }.to raise_unknown_object_exception
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
describe '#respond_to?' do
|
|
104
|
+
it 'returns true for all attribute methods' do
|
|
105
|
+
expect(browser.radio_set(index: 0)).not_to respond_to(:class_name)
|
|
106
|
+
expect(browser.radio_set(index: 0)).not_to respond_to(:id)
|
|
107
|
+
expect(browser.radio_set(index: 0)).to respond_to(:name)
|
|
108
|
+
expect(browser.radio_set(index: 0)).not_to respond_to(:title)
|
|
109
|
+
expect(browser.radio_set(index: 0)).to respond_to(:type)
|
|
110
|
+
expect(browser.radio_set(index: 0)).to respond_to(:value)
|
|
111
|
+
expect(browser.radio_set(index: 0)).to respond_to(:text)
|
|
112
|
+
expect(browser.radio_set(index: 0)).not_to respond_to(:clear)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Access methods
|
|
117
|
+
describe '#enabled?' do
|
|
118
|
+
it 'returns true if any radio button in the set is enabled' do
|
|
119
|
+
expect(browser.radio_set(id: 'new_user_newsletter_nah')).to be_enabled
|
|
120
|
+
expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_nah']")).to be_enabled
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it 'returns false if all radio buttons are disabled' do
|
|
124
|
+
expect(browser.radio_set(id: 'new_user_newsletter_none')).not_to be_enabled
|
|
125
|
+
expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_none']")).not_to be_enabled
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it "raises UnknownObjectException if the radio button doesn't exist" do
|
|
129
|
+
expect { browser.radio_set(id: 'no_such_id').enabled? }.to raise_unknown_object_exception
|
|
130
|
+
expect { browser.radio_set(xpath: "//input[@id='no_such_id']").enabled? }.to raise_unknown_object_exception
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
describe '#disabled?' do
|
|
135
|
+
it 'returns false if the any radio button in the set is enabled' do
|
|
136
|
+
expect(browser.radio_set(id: 'new_user_newsletter_nah')).not_to be_disabled
|
|
137
|
+
expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_nah']")).not_to be_disabled
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it 'returns true if all radio buttons are disabled' do
|
|
141
|
+
expect(browser.radio_set(id: 'new_user_newsletter_none')).to be_disabled
|
|
142
|
+
expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_none']")).to be_disabled
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it 'raises UnknownObjectException when the radio set does not exist' do
|
|
146
|
+
expect { browser.radio_set(index: 1337).disabled? }.to raise_unknown_object_exception
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Other
|
|
151
|
+
describe '#radio' do
|
|
152
|
+
it 'returns first instance of Radio if no arguments specified' do
|
|
153
|
+
radio = browser.radio_set(id: 'new_user_newsletter_yes').radio
|
|
154
|
+
expect(radio).to be_instance_of(Watir::Radio)
|
|
155
|
+
expect(radio.value).to eq 'yes'
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it 'returns provided instance of Radio if element has no name' do
|
|
159
|
+
radio = browser.radio_set(id: 'new_user_newsletter_absolutely').radio
|
|
160
|
+
expect(radio).to be_instance_of(Watir::Radio)
|
|
161
|
+
expect(radio.value).to eq 'absolutely'
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it 'returns an instance of Radio matching the provided value' do
|
|
165
|
+
radio = browser.radio_set(id: 'new_user_newsletter_yes').radio(id: 'new_user_newsletter_no')
|
|
166
|
+
expect(radio).to be_instance_of(Watir::Radio)
|
|
167
|
+
expect(radio.value).to eq 'no'
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it 'does not exist when using bad locator' do
|
|
171
|
+
radio = browser.radio_set(id: 'new_user_newsletter_yes').radio(id: 'new_user_newsletter_not_there')
|
|
172
|
+
expect(radio).not_to exist
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it 'raises Unknown Object Exception if it specifies the wrong name' do
|
|
176
|
+
radio_set = browser.radio_set(id: 'new_user_newsletter_yes')
|
|
177
|
+
expect { radio_set.radio(name: '') }.to raise_unknown_object_exception
|
|
178
|
+
expect { radio_set.radio(name: 'foo') }.to raise_unknown_object_exception
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
describe '#radios' do
|
|
183
|
+
it 'returns array of all radios in the set if no arguments specified' do
|
|
184
|
+
radios = browser.radio_set(id: 'new_user_newsletter_yes').radios
|
|
185
|
+
expect(radios).to be_instance_of(Watir::RadioCollection)
|
|
186
|
+
values = %w[yes no certainly nah nah]
|
|
187
|
+
expect(radios.map(&:value)).to match_array values
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
it 'returns RadioCollection matching the provided value' do
|
|
191
|
+
radios = browser.radio_set(id: 'new_user_newsletter_yes').radios(id: /new_user_newsletter_n/)
|
|
192
|
+
expect(radios).to be_instance_of(Watir::RadioCollection)
|
|
193
|
+
expect(radios.map(&:value)).to eq %w[no nah]
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it 'returns provided instance of Radio if element has no name' do
|
|
197
|
+
radios = browser.radio_set(id: 'new_user_newsletter_absolutely').radios
|
|
198
|
+
expect(radios).to be_instance_of(Watir::RadioCollection)
|
|
199
|
+
expect(radios.size).to eq 1
|
|
200
|
+
expect(radios.first.value).to eq 'absolutely'
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it 'returns empty collection if specified radio does not exist' do
|
|
204
|
+
radios = browser.radio_set(id: 'new_user_newsletter_yes').radios(id: 'new_user_newsletter_not_there')
|
|
205
|
+
expect(radios).to be_empty
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it 'raises empty collection if it specifies the wrong name' do
|
|
209
|
+
radio_set = browser.radio_set(id: 'new_user_newsletter_yes')
|
|
210
|
+
expect { radio_set.radios(name: '') }.to raise_unknown_object_exception
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
it 'returns the radio button at the specified index' do
|
|
214
|
+
radio_set = browser.radio_set(id: 'new_user_newsletter_yes')
|
|
215
|
+
expect(radio_set[1]).to be_a Watir::Radio
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
describe '#selected' do
|
|
220
|
+
it "raises UnknownObjectException if the radio set doesn't exist" do
|
|
221
|
+
expect { browser.radio_set(name: 'no_such_name').selected }.to raise_unknown_object_exception
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it 'gets the currently selected radio' do
|
|
225
|
+
expect(browser.radio_set(id: 'new_user_newsletter_no').selected.text).to eq 'Yes'
|
|
226
|
+
expect(browser.radio_set(id: 'new_user_newsletter_no').selected.value).to eq 'yes'
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
describe '#include?' do
|
|
231
|
+
it 'returns true if the given radio exists by text' do
|
|
232
|
+
expect(browser.radio_set(id: 'new_user_newsletter_no')).to include('Yes')
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
it "returns false if the given option doesn't exist" do
|
|
236
|
+
expect(browser.radio_set(id: 'new_user_newsletter_no')).not_to include('Mother')
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
describe '#selected?' do
|
|
241
|
+
it 'returns true if the given option is selected by text' do
|
|
242
|
+
browser.radio_set(id: 'new_user_newsletter_yes').select('No')
|
|
243
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes')).to be_selected('No')
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
it 'returns false if the given option is not selected by text' do
|
|
247
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes')).not_to be_selected('Probably')
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it "raises UnknownObjectException if the radio button doesn't exist" do
|
|
251
|
+
expect { browser.radio_set(id: 'new_user_newsletter_yes').selected?('missing_option') }
|
|
252
|
+
.to raise_unknown_object_exception
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
describe '#select' do
|
|
257
|
+
context 'when interacting with radios' do
|
|
258
|
+
it 'selects radio text by String' do
|
|
259
|
+
browser.radio_set(id: 'new_user_newsletter_yes').select('Probably')
|
|
260
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes').selected.text).to eq 'Probably'
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
it 'selects radio text by Regexp' do
|
|
264
|
+
browser.radio_set(id: 'new_user_newsletter_yes').select(/Prob/)
|
|
265
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes').selected.text).to eq 'Probably'
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
it 'selects the radio text when given an Xpath' do
|
|
269
|
+
browser.radio_set(xpath: "//input[@id='new_user_newsletter_no']").select('Probably')
|
|
270
|
+
expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_no']").selected.text).to eq 'Probably'
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
it 'selects radio value by string' do
|
|
274
|
+
browser.radio_set(id: 'new_user_newsletter_yes').select('no')
|
|
275
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes').selected.text).to eq 'No'
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
it 'selects radio value by regexp' do
|
|
279
|
+
browser.radio_set(id: 'new_user_newsletter_yes').select(/nah/)
|
|
280
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes').selected.text).to eq 'Probably'
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
it 'returns the value selected' do
|
|
285
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes').select('no')).to eq 'no'
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
it 'fires onchange event when selecting a radio' do
|
|
289
|
+
browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'certainly').set
|
|
290
|
+
expect(messages).to eq ['changed: new_user_newsletter']
|
|
291
|
+
|
|
292
|
+
browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'certainly').set
|
|
293
|
+
expect(messages).to eq ['changed: new_user_newsletter'] # no event fired here - didn't change
|
|
294
|
+
|
|
295
|
+
browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'yes').set
|
|
296
|
+
browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'certainly').set
|
|
297
|
+
list = ['changed: new_user_newsletter', 'clicked: new_user_newsletter_yes', 'changed: new_user_newsletter']
|
|
298
|
+
expect(messages).to eq list
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it "doesn't fire onchange event when selecting an already selected radio" do
|
|
302
|
+
browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'no').set
|
|
303
|
+
|
|
304
|
+
browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'no').set
|
|
305
|
+
expect(messages.size).to eq 1
|
|
306
|
+
|
|
307
|
+
browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'no').set
|
|
308
|
+
expect(messages.size).to eq 1
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
describe '#eql?' do
|
|
313
|
+
it 'returns true when located by any radio button' do
|
|
314
|
+
rs = browser.radio_set(id: 'new_user_newsletter_yes')
|
|
315
|
+
expect(browser.radio_set(id: /new_user_newsletter_no/)).to eql rs
|
|
316
|
+
expect(browser.radio_set(name: 'new_user_newsletter', index: 2)).to eql rs
|
|
317
|
+
expect(browser.radio_set(name: /new_user_newsletter/)).to eql rs
|
|
318
|
+
expect(browser.radio_set(value: 'yes')).to eql rs
|
|
319
|
+
expect(browser.radio_set(value: /yes/)).to eql rs
|
|
320
|
+
expect(browser.radio_set(class: 'huge')).to eql rs
|
|
321
|
+
expect(browser.radio_set(class: /huge/)).to eql rs
|
|
322
|
+
expect(browser.radio_set(index: 0)).to eql rs
|
|
323
|
+
expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_probably']")).to eql rs
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
it 'returns the text of the selected radio' do
|
|
328
|
+
expect(browser.radio_set(id: 'new_user_newsletter_yes').select('No')).to eq 'No'
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
it "raises UnknownObjectException if the radio doesn't exist" do
|
|
332
|
+
expect { browser.radio_set(id: 'new_user_newsletter_yes').select('missing_option') }
|
|
333
|
+
.to raise_unknown_object_exception
|
|
334
|
+
expect { browser.radio_set(id: 'new_user_newsletter_yes').select(/missing_option/) }
|
|
335
|
+
.to raise_unknown_object_exception
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
it 'raises ObjectDisabledException if the option is disabled' do
|
|
339
|
+
expect { browser.radio_set(id: 'new_user_newsletter_none').select('None') }.to raise_object_disabled_exception
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
it 'raises a TypeError if argument is not a String, Regexp or Numeric' do
|
|
343
|
+
expect { browser.radio_set(id: 'new_user_newsletter_yes').select([]) }.to raise_error(TypeError)
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'base64'
|
|
4
|
+
require 'watirspec_helper'
|
|
5
|
+
|
|
6
|
+
module Watir
|
|
7
|
+
describe Screenshot do
|
|
8
|
+
let(:png_header) { (+"\211PNG").force_encoding('ASCII-8BIT') }
|
|
9
|
+
|
|
10
|
+
describe '#png' do
|
|
11
|
+
it 'gets png representation of screenshot' do
|
|
12
|
+
expect(browser.screenshot.png[0..3]).to eq png_header
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe '#base64' do
|
|
17
|
+
it 'gets base64 representation of screenshot' do
|
|
18
|
+
image = browser.screenshot.base64
|
|
19
|
+
expect(Base64.decode64(image)[0..3]).to eq png_header
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe '#save' do
|
|
24
|
+
it 'saves screenshot to given file' do
|
|
25
|
+
path = "#{Dir.tmpdir}/test#{::Time.now.to_i}.png"
|
|
26
|
+
expect(File).not_to exist(path)
|
|
27
|
+
browser.screenshot.save(path)
|
|
28
|
+
expect(File).to exist(path)
|
|
29
|
+
expect(File.binread(path)[0..3]).to eq png_header
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|