watir 6.10.0 → 6.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/.document +5 -5
  3. data/.github/ISSUE_TEMPLATE.md +16 -16
  4. data/.gitignore +21 -21
  5. data/.travis.yml +72 -72
  6. data/CHANGES.md +6 -0
  7. data/Gemfile +16 -16
  8. data/LICENSE +23 -23
  9. data/README.md +106 -106
  10. data/Rakefile +153 -153
  11. data/appveyor.yml +13 -13
  12. data/lib/watir-webdriver.rb +2 -2
  13. data/lib/watir.rb +158 -158
  14. data/lib/watir/adjacent.rb +126 -126
  15. data/lib/watir/after_hooks.rb +132 -132
  16. data/lib/watir/alert.rb +120 -120
  17. data/lib/watir/aliases.rb +6 -6
  18. data/lib/watir/attribute_helper.rb +96 -96
  19. data/lib/watir/browser.rb +349 -349
  20. data/lib/watir/capabilities.rb +123 -123
  21. data/lib/watir/cell_container.rb +25 -25
  22. data/lib/watir/container.rb +51 -51
  23. data/lib/watir/cookies.rb +134 -134
  24. data/lib/watir/element_collection.rb +138 -138
  25. data/lib/watir/elements/area.rb +12 -12
  26. data/lib/watir/elements/button.rb +37 -37
  27. data/lib/watir/elements/cell.rb +17 -17
  28. data/lib/watir/elements/checkbox.rb +56 -56
  29. data/lib/watir/elements/dlist.rb +12 -12
  30. data/lib/watir/elements/element.rb +6 -5
  31. data/lib/watir/elements/file_field.rb +41 -41
  32. data/lib/watir/elements/font.rb +25 -25
  33. data/lib/watir/elements/form.rb +16 -16
  34. data/lib/watir/elements/hidden.rb +25 -25
  35. data/lib/watir/elements/html_elements.rb +2035 -2035
  36. data/lib/watir/elements/iframe.rb +166 -166
  37. data/lib/watir/elements/image.rb +21 -21
  38. data/lib/watir/elements/input.rb +15 -15
  39. data/lib/watir/elements/link.rb +18 -18
  40. data/lib/watir/elements/list.rb +49 -49
  41. data/lib/watir/elements/option.rb +72 -72
  42. data/lib/watir/elements/radio.rb +60 -60
  43. data/lib/watir/elements/row.rb +17 -17
  44. data/lib/watir/elements/select.rb +250 -250
  45. data/lib/watir/elements/svg_elements.rb +613 -613
  46. data/lib/watir/elements/table.rb +76 -76
  47. data/lib/watir/elements/table_cell.rb +31 -31
  48. data/lib/watir/elements/table_row.rb +32 -32
  49. data/lib/watir/elements/table_section.rb +15 -15
  50. data/lib/watir/elements/text_area.rb +5 -5
  51. data/lib/watir/elements/text_field.rb +39 -39
  52. data/lib/watir/exception.rb +16 -16
  53. data/lib/watir/extensions/nokogiri.rb +14 -14
  54. data/lib/watir/generator.rb +3 -3
  55. data/lib/watir/generator/base.rb +11 -11
  56. data/lib/watir/generator/base/generator.rb +115 -115
  57. data/lib/watir/generator/base/idl_sorter.rb +47 -47
  58. data/lib/watir/generator/base/spec_extractor.rb +138 -138
  59. data/lib/watir/generator/base/util.rb +21 -21
  60. data/lib/watir/generator/base/visitor.rb +162 -162
  61. data/lib/watir/generator/html.rb +15 -15
  62. data/lib/watir/generator/html/generator.rb +36 -36
  63. data/lib/watir/generator/html/spec_extractor.rb +50 -50
  64. data/lib/watir/generator/html/visitor.rb +21 -21
  65. data/lib/watir/generator/svg.rb +7 -7
  66. data/lib/watir/generator/svg/generator.rb +38 -38
  67. data/lib/watir/generator/svg/spec_extractor.rb +53 -53
  68. data/lib/watir/generator/svg/visitor.rb +21 -21
  69. data/lib/watir/has_window.rb +68 -68
  70. data/lib/watir/js_execution.rb +143 -143
  71. data/lib/watir/js_snippets.rb +16 -16
  72. data/lib/watir/js_snippets/backgroundColor.js +7 -7
  73. data/lib/watir/js_snippets/fireEvent.js +31 -31
  74. data/lib/watir/js_snippets/focus.js +3 -3
  75. data/lib/watir/js_snippets/getInnerHtml.js +19 -19
  76. data/lib/watir/js_snippets/getInnerText.js +19 -19
  77. data/lib/watir/js_snippets/getOuterHtml.js +20 -20
  78. data/lib/watir/js_snippets/getTextContent.js +19 -19
  79. data/lib/watir/js_snippets/isImageLoaded.js +3 -3
  80. data/lib/watir/js_snippets/selectOptionsLabel.js +10 -10
  81. data/lib/watir/js_snippets/selectOptionsText.js +10 -10
  82. data/lib/watir/js_snippets/selectOptionsValue.js +10 -10
  83. data/lib/watir/js_snippets/selectText.js +64 -64
  84. data/lib/watir/js_snippets/selectedOptions.js +11 -11
  85. data/lib/watir/js_snippets/setValue.js +3 -3
  86. data/lib/watir/legacy_wait.rb +126 -126
  87. data/lib/watir/locators.rb +60 -60
  88. data/lib/watir/locators/button/locator.rb +31 -31
  89. data/lib/watir/locators/button/selector_builder.rb +30 -30
  90. data/lib/watir/locators/button/selector_builder/xpath.rb +29 -29
  91. data/lib/watir/locators/button/validator.rb +15 -15
  92. data/lib/watir/locators/cell/locator.rb +15 -15
  93. data/lib/watir/locators/cell/selector_builder.rb +24 -24
  94. data/lib/watir/locators/element/locator.rb +1 -0
  95. data/lib/watir/locators/element/selector_builder.rb +150 -150
  96. data/lib/watir/locators/element/selector_builder/xpath.rb +119 -119
  97. data/lib/watir/locators/element/validator.rb +18 -18
  98. data/lib/watir/locators/row/locator.rb +15 -15
  99. data/lib/watir/locators/row/selector_builder.rb +29 -29
  100. data/lib/watir/locators/text_area/locator.rb +13 -13
  101. data/lib/watir/locators/text_area/selector_builder.rb +22 -22
  102. data/lib/watir/locators/text_field/locator.rb +30 -30
  103. data/lib/watir/locators/text_field/selector_builder.rb +31 -31
  104. data/lib/watir/locators/text_field/selector_builder/xpath.rb +17 -17
  105. data/lib/watir/locators/text_field/validator.rb +12 -12
  106. data/lib/watir/logger.rb +109 -109
  107. data/lib/watir/radio_set.rb +231 -231
  108. data/lib/watir/row_container.rb +36 -36
  109. data/lib/watir/screenshot.rb +50 -50
  110. data/lib/watir/user_editable.rb +56 -56
  111. data/lib/watir/wait.rb +200 -200
  112. data/lib/watir/wait/timer.rb +52 -52
  113. data/lib/watir/window.rb +257 -257
  114. data/lib/watir/xpath_support.rb +20 -20
  115. data/lib/watirspec.rb +86 -86
  116. data/lib/watirspec/guards.rb +60 -60
  117. data/lib/watirspec/implementation.rb +51 -51
  118. data/lib/watirspec/rake_tasks.rb +115 -115
  119. data/lib/watirspec/remote_server.rb +38 -38
  120. data/lib/watirspec/runner.rb +53 -53
  121. data/lib/watirspec/server.rb +99 -99
  122. data/lib/watirspec/server/app.rb +76 -76
  123. data/spec/browser_spec.rb +278 -278
  124. data/spec/click_spec.rb +19 -19
  125. data/spec/container_spec.rb +34 -34
  126. data/spec/element_locator_spec.rb +517 -517
  127. data/spec/element_spec.rb +158 -158
  128. data/spec/implementation_spec.rb +24 -24
  129. data/spec/input_spec.rb +14 -14
  130. data/spec/locator_spec_helper.rb +55 -55
  131. data/spec/logger_spec.rb +46 -46
  132. data/spec/spec_helper.rb +22 -22
  133. data/spec/special_chars_spec.rb +13 -13
  134. data/spec/watirspec/adjacent_spec.rb +227 -227
  135. data/spec/watirspec/after_hooks_spec.rb +182 -182
  136. data/spec/watirspec/alert_spec.rb +108 -108
  137. data/spec/watirspec/attributes_spec.rb +16 -16
  138. data/spec/watirspec/browser_spec.rb +281 -281
  139. data/spec/watirspec/cookies_spec.rb +154 -154
  140. data/spec/watirspec/drag_and_drop_spec.rb +49 -49
  141. data/spec/watirspec/element_hidden_spec.rb +75 -75
  142. data/spec/watirspec/elements/area_spec.rb +72 -72
  143. data/spec/watirspec/elements/areas_spec.rb +42 -42
  144. data/spec/watirspec/elements/button_spec.rb +277 -277
  145. data/spec/watirspec/elements/buttons_spec.rb +55 -55
  146. data/spec/watirspec/elements/checkbox_spec.rb +275 -275
  147. data/spec/watirspec/elements/checkboxes_spec.rb +44 -44
  148. data/spec/watirspec/elements/collections_spec.rb +52 -52
  149. data/spec/watirspec/elements/dd_spec.rb +124 -124
  150. data/spec/watirspec/elements/dds_spec.rb +42 -42
  151. data/spec/watirspec/elements/del_spec.rb +126 -126
  152. data/spec/watirspec/elements/dels_spec.rb +40 -40
  153. data/spec/watirspec/elements/div_spec.rb +245 -245
  154. data/spec/watirspec/elements/divs_spec.rb +42 -42
  155. data/spec/watirspec/elements/dl_spec.rb +142 -142
  156. data/spec/watirspec/elements/dls_spec.rb +43 -43
  157. data/spec/watirspec/elements/dt_spec.rb +122 -122
  158. data/spec/watirspec/elements/dts_spec.rb +42 -42
  159. data/spec/watirspec/elements/element_spec.rb +483 -483
  160. data/spec/watirspec/elements/elements_spec.rb +47 -47
  161. data/spec/watirspec/elements/em_spec.rb +96 -96
  162. data/spec/watirspec/elements/ems_spec.rb +43 -43
  163. data/spec/watirspec/elements/filefield_spec.rb +170 -170
  164. data/spec/watirspec/elements/filefields_spec.rb +43 -43
  165. data/spec/watirspec/elements/font_spec.rb +29 -29
  166. data/spec/watirspec/elements/form_spec.rb +66 -66
  167. data/spec/watirspec/elements/forms_spec.rb +46 -46
  168. data/spec/watirspec/elements/frame_spec.rb +123 -123
  169. data/spec/watirspec/elements/frames_spec.rb +41 -41
  170. data/spec/watirspec/elements/hidden_spec.rb +104 -104
  171. data/spec/watirspec/elements/hiddens_spec.rb +43 -43
  172. data/spec/watirspec/elements/hn_spec.rb +92 -92
  173. data/spec/watirspec/elements/hns_spec.rb +38 -38
  174. data/spec/watirspec/elements/iframe_spec.rb +10 -0
  175. data/spec/watirspec/elements/iframes_spec.rb +47 -47
  176. data/spec/watirspec/elements/image_spec.rb +158 -158
  177. data/spec/watirspec/elements/images_spec.rb +40 -40
  178. data/spec/watirspec/elements/ins_spec.rb +127 -127
  179. data/spec/watirspec/elements/inses_spec.rb +40 -40
  180. data/spec/watirspec/elements/label_spec.rb +75 -75
  181. data/spec/watirspec/elements/labels_spec.rb +40 -40
  182. data/spec/watirspec/elements/li_spec.rb +111 -111
  183. data/spec/watirspec/elements/link_spec.rb +171 -171
  184. data/spec/watirspec/elements/links_spec.rb +44 -44
  185. data/spec/watirspec/elements/lis_spec.rb +42 -42
  186. data/spec/watirspec/elements/list_spec.rb +32 -32
  187. data/spec/watirspec/elements/map_spec.rb +75 -75
  188. data/spec/watirspec/elements/maps_spec.rb +41 -41
  189. data/spec/watirspec/elements/meta_spec.rb +23 -23
  190. data/spec/watirspec/elements/metas_spec.rb +40 -40
  191. data/spec/watirspec/elements/ol_spec.rb +87 -87
  192. data/spec/watirspec/elements/ols_spec.rb +40 -40
  193. data/spec/watirspec/elements/option_spec.rb +121 -121
  194. data/spec/watirspec/elements/p_spec.rb +111 -111
  195. data/spec/watirspec/elements/pre_spec.rb +111 -111
  196. data/spec/watirspec/elements/pres_spec.rb +40 -40
  197. data/spec/watirspec/elements/ps_spec.rb +40 -40
  198. data/spec/watirspec/elements/radio_spec.rb +273 -273
  199. data/spec/watirspec/elements/radios_spec.rb +43 -43
  200. data/spec/watirspec/elements/select_list_spec.rb +553 -553
  201. data/spec/watirspec/elements/select_lists_spec.rb +46 -46
  202. data/spec/watirspec/elements/span_spec.rb +128 -128
  203. data/spec/watirspec/elements/spans_spec.rb +40 -40
  204. data/spec/watirspec/elements/strong_spec.rb +88 -88
  205. data/spec/watirspec/elements/strongs_spec.rb +43 -43
  206. data/spec/watirspec/elements/table_nesting_spec.rb +51 -51
  207. data/spec/watirspec/elements/table_spec.rb +156 -156
  208. data/spec/watirspec/elements/tables_spec.rb +42 -42
  209. data/spec/watirspec/elements/tbody_spec.rb +93 -93
  210. data/spec/watirspec/elements/tbodys_spec.rb +62 -62
  211. data/spec/watirspec/elements/td_spec.rb +93 -93
  212. data/spec/watirspec/elements/tds_spec.rb +53 -53
  213. data/spec/watirspec/elements/text_field_spec.rb +360 -360
  214. data/spec/watirspec/elements/text_fields_spec.rb +44 -44
  215. data/spec/watirspec/elements/textarea_spec.rb +26 -26
  216. data/spec/watirspec/elements/textareas_spec.rb +24 -24
  217. data/spec/watirspec/elements/tfoot_spec.rb +86 -86
  218. data/spec/watirspec/elements/tfoots_spec.rb +68 -68
  219. data/spec/watirspec/elements/thead_spec.rb +86 -86
  220. data/spec/watirspec/elements/theads_spec.rb +68 -68
  221. data/spec/watirspec/elements/tr_spec.rb +78 -78
  222. data/spec/watirspec/elements/trs_spec.rb +61 -61
  223. data/spec/watirspec/elements/ul_spec.rb +76 -76
  224. data/spec/watirspec/elements/uls_spec.rb +39 -39
  225. data/spec/watirspec/html/alerts.html +12 -12
  226. data/spec/watirspec/html/aria_attributes.html +9 -9
  227. data/spec/watirspec/html/class_locator.html +8 -8
  228. data/spec/watirspec/html/clicks.html +19 -19
  229. data/spec/watirspec/html/closeable.html +12 -12
  230. data/spec/watirspec/html/collections.html +14 -14
  231. data/spec/watirspec/html/css/jquery-ui-1.8.17.custom.css +286 -286
  232. data/spec/watirspec/html/data_attributes.html +9 -9
  233. data/spec/watirspec/html/definition_lists.html +47 -47
  234. data/spec/watirspec/html/drag_and_drop.html +106 -106
  235. data/spec/watirspec/html/font.html +10 -10
  236. data/spec/watirspec/html/forms_with_input_elements.html +174 -174
  237. data/spec/watirspec/html/frame_1.html +22 -22
  238. data/spec/watirspec/html/frame_2.html +15 -15
  239. data/spec/watirspec/html/frames.html +10 -10
  240. data/spec/watirspec/html/hover.html +11 -11
  241. data/spec/watirspec/html/iframe_1.html +22 -22
  242. data/spec/watirspec/html/iframes.html +12 -12
  243. data/spec/watirspec/html/images.html +27 -27
  244. data/spec/watirspec/html/inner_outer.html +4 -4
  245. data/spec/watirspec/html/javascript/angular.min.js +331 -331
  246. data/spec/watirspec/html/javascript/helpers.js +16 -16
  247. data/spec/watirspec/html/javascript/jquery-1.7.1.min.js +3 -3
  248. data/spec/watirspec/html/javascript/jquery-ui-1.8.17.custom.min.js +67 -67
  249. data/spec/watirspec/html/keylogger.html +14 -14
  250. data/spec/watirspec/html/modal_dialog.html +9 -9
  251. data/spec/watirspec/html/multiple_ids.html +14 -14
  252. data/spec/watirspec/html/nested_elements.html +33 -33
  253. data/spec/watirspec/html/nested_frame_2.html +9 -9
  254. data/spec/watirspec/html/nested_frame_3.html +14 -14
  255. data/spec/watirspec/html/nested_frames.html +10 -10
  256. data/spec/watirspec/html/nested_iframe_2.html +12 -12
  257. data/spec/watirspec/html/nested_iframes.html +13 -13
  258. data/spec/watirspec/html/nested_tables.html +202 -202
  259. data/spec/watirspec/html/non_control_elements.html +140 -140
  260. data/spec/watirspec/html/removed_element.html +24 -24
  261. data/spec/watirspec/html/right_click.html +10 -10
  262. data/spec/watirspec/html/special_chars.html +11 -11
  263. data/spec/watirspec/html/tables.html +120 -120
  264. data/spec/watirspec/html/timeout_window_location.html +19 -19
  265. data/spec/watirspec/html/uneven_table.html +20 -20
  266. data/spec/watirspec/html/wait.html +84 -84
  267. data/spec/watirspec/html/window_switching.html +11 -11
  268. data/spec/watirspec/radio_set_spec.rb +336 -336
  269. data/spec/watirspec/relaxed_locate_spec.rb +99 -99
  270. data/spec/watirspec/screenshot_spec.rb +29 -29
  271. data/spec/watirspec/support/raise_exception_matchers.rb +36 -36
  272. data/spec/watirspec/wait_spec.rb +381 -381
  273. data/spec/watirspec/window_switching_spec.rb +415 -415
  274. data/spec/watirspec_helper.rb +161 -161
  275. data/support/appveyor.cmd +9 -9
  276. data/support/doctest_helper.rb +101 -101
  277. data/support/travis.sh +11 -11
  278. data/support/version_differ.rb +59 -59
  279. data/watir.gemspec +1 -1
  280. metadata +4 -170
@@ -1,31 +1,31 @@
1
- module Watir
2
- module Locators
3
- class TextField
4
- class SelectorBuilder < Element::SelectorBuilder
5
- def build_wd_selector(selectors)
6
- return if selectors.values.any? { |e| e.kind_of? Regexp }
7
-
8
- selectors.delete(:tag_name)
9
-
10
- input_attr_exp = xpath_builder.attribute_expression(:input, selectors)
11
-
12
- xpath = ".//input[(not(@type) or (#{negative_type_expr}))"
13
- xpath << " and #{input_attr_exp}" unless input_attr_exp.empty?
14
- xpath << "]"
15
-
16
- p build_wd_selector: xpath if $DEBUG
17
-
18
- [:xpath, xpath]
19
- end
20
-
21
- private
22
-
23
- def negative_type_expr
24
- Watir::TextField::NON_TEXT_TYPES.map do |type|
25
- "%s!=%s" % [XpathSupport.downcase('@type'), type.inspect]
26
- end.join(' and ')
27
- end
28
- end
29
- end
30
- end
31
- end
1
+ module Watir
2
+ module Locators
3
+ class TextField
4
+ class SelectorBuilder < Element::SelectorBuilder
5
+ def build_wd_selector(selectors)
6
+ return if selectors.values.any? { |e| e.kind_of? Regexp }
7
+
8
+ selectors.delete(:tag_name)
9
+
10
+ input_attr_exp = xpath_builder.attribute_expression(:input, selectors)
11
+
12
+ xpath = ".//input[(not(@type) or (#{negative_type_expr}))"
13
+ xpath << " and #{input_attr_exp}" unless input_attr_exp.empty?
14
+ xpath << "]"
15
+
16
+ p build_wd_selector: xpath if $DEBUG
17
+
18
+ [:xpath, xpath]
19
+ end
20
+
21
+ private
22
+
23
+ def negative_type_expr
24
+ Watir::TextField::NON_TEXT_TYPES.map do |type|
25
+ "%s!=%s" % [XpathSupport.downcase('@type'), type.inspect]
26
+ end.join(' and ')
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,17 +1,17 @@
1
- module Watir
2
- module Locators
3
- class TextField
4
- class SelectorBuilder
5
- class XPath < Element::SelectorBuilder::XPath
6
- def lhs_for(building, key)
7
- if building == :input && key == :text
8
- "@value"
9
- else
10
- super
11
- end
12
- end
13
- end
14
- end
15
- end
16
- end
17
- end
1
+ module Watir
2
+ module Locators
3
+ class TextField
4
+ class SelectorBuilder
5
+ class XPath < Element::SelectorBuilder::XPath
6
+ def lhs_for(building, key)
7
+ if building == :input && key == :text
8
+ "@value"
9
+ else
10
+ super
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,12 +1,12 @@
1
- module Watir
2
- module Locators
3
- class TextField
4
- class Validator < Element::Validator
5
- def validate(element, selector)
6
- return unless element.tag_name.downcase == 'input'
7
- element
8
- end
9
- end
10
- end
11
- end
12
- end
1
+ module Watir
2
+ module Locators
3
+ class TextField
4
+ class Validator < Element::Validator
5
+ def validate(element, selector)
6
+ return unless element.tag_name.downcase == 'input'
7
+ element
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,109 +1,109 @@
1
- require 'forwardable'
2
- require 'logger'
3
-
4
- # Code adapted from Selenium Implementation
5
- # https://github.com/SeleniumHQ/selenium/blob/master/rb/lib/selenium/webdriver/common/logger.rb
6
-
7
- module Watir
8
- #
9
- # @example Enable full logging
10
- # Watir.logger.level = :debug
11
- #
12
- # @example Log to file
13
- # Watir.logger.output = 'watir.log'
14
- #
15
- # @example Use logger manually
16
- # Watir.logger.info('This is info message')
17
- # Watir.logger.warn('This is warning message')
18
- #
19
- class Logger
20
- extend Forwardable
21
- include ::Logger::Severity
22
-
23
- def_delegators :@logger, :debug, :debug?,
24
- :info, :info?,
25
- :warn, :warn?,
26
- :error, :error?,
27
- :fatal, :fatal?,
28
- :level
29
-
30
- def initialize
31
- @logger = create_logger($stdout)
32
- end
33
-
34
- def output=(io)
35
- # `Logger#reopen` was added in Ruby 2.3
36
- if @logger.respond_to?(:reopen)
37
- @logger.reopen(io)
38
- else
39
- @logger = create_logger(io)
40
- end
41
- end
42
-
43
- #
44
- # For Ruby < 2.3 compatibility
45
- # Based on https://github.com/ruby/ruby/blob/ruby_2_3/lib/logger.rb#L250
46
- #
47
-
48
- def level=(severity)
49
- if severity.is_a?(Integer)
50
- @logger.level = severity
51
- else
52
- case severity.to_s.downcase
53
- when 'debug'.freeze
54
- @logger.level = DEBUG
55
- when 'info'.freeze
56
- @logger.level = INFO
57
- when 'warn'.freeze
58
- @logger.level = WARN
59
- when 'error'.freeze
60
- @logger.level = ERROR
61
- when 'fatal'.freeze
62
- @logger.level = FATAL
63
- when 'unknown'.freeze
64
- @logger.level = UNKNOWN
65
- else
66
- raise ArgumentError, "invalid log level: #{severity}"
67
- end
68
- end
69
- end
70
-
71
- #
72
- # Returns IO object used by logger internally.
73
- #
74
- # Normally, we would have never needed it, but we want to
75
- # use it as IO object for all child processes to ensure their
76
- # output is redirected there.
77
- #
78
- # It is only used in debug level, in other cases output is suppressed.
79
- #
80
- # @api private
81
- #
82
- def io
83
- @logger.instance_variable_get(:@logdev).instance_variable_get(:@dev)
84
- end
85
-
86
- #
87
- # Marks code as deprecated with replacement.
88
- #
89
- # @param [String] old
90
- # @param [String] new
91
- #
92
- def deprecate(old, new)
93
- warn "[DEPRECATION] #{old} is deprecated. Use #{new} instead."
94
- end
95
-
96
- private
97
-
98
- def create_logger(output)
99
- logger = ::Logger.new(output)
100
- logger.progname = 'Watir'
101
- logger.level = ($DEBUG ? DEBUG : WARN)
102
- logger.formatter = proc do |severity, time, progname, msg|
103
- "#{time.strftime('%F %T')} #{severity} #{progname} #{msg}\n"
104
- end
105
-
106
- logger
107
- end
108
- end
109
- end
1
+ require 'forwardable'
2
+ require 'logger'
3
+
4
+ # Code adapted from Selenium Implementation
5
+ # https://github.com/SeleniumHQ/selenium/blob/master/rb/lib/selenium/webdriver/common/logger.rb
6
+
7
+ module Watir
8
+ #
9
+ # @example Enable full logging
10
+ # Watir.logger.level = :debug
11
+ #
12
+ # @example Log to file
13
+ # Watir.logger.output = 'watir.log'
14
+ #
15
+ # @example Use logger manually
16
+ # Watir.logger.info('This is info message')
17
+ # Watir.logger.warn('This is warning message')
18
+ #
19
+ class Logger
20
+ extend Forwardable
21
+ include ::Logger::Severity
22
+
23
+ def_delegators :@logger, :debug, :debug?,
24
+ :info, :info?,
25
+ :warn, :warn?,
26
+ :error, :error?,
27
+ :fatal, :fatal?,
28
+ :level
29
+
30
+ def initialize
31
+ @logger = create_logger($stdout)
32
+ end
33
+
34
+ def output=(io)
35
+ # `Logger#reopen` was added in Ruby 2.3
36
+ if @logger.respond_to?(:reopen)
37
+ @logger.reopen(io)
38
+ else
39
+ @logger = create_logger(io)
40
+ end
41
+ end
42
+
43
+ #
44
+ # For Ruby < 2.3 compatibility
45
+ # Based on https://github.com/ruby/ruby/blob/ruby_2_3/lib/logger.rb#L250
46
+ #
47
+
48
+ def level=(severity)
49
+ if severity.is_a?(Integer)
50
+ @logger.level = severity
51
+ else
52
+ case severity.to_s.downcase
53
+ when 'debug'.freeze
54
+ @logger.level = DEBUG
55
+ when 'info'.freeze
56
+ @logger.level = INFO
57
+ when 'warn'.freeze
58
+ @logger.level = WARN
59
+ when 'error'.freeze
60
+ @logger.level = ERROR
61
+ when 'fatal'.freeze
62
+ @logger.level = FATAL
63
+ when 'unknown'.freeze
64
+ @logger.level = UNKNOWN
65
+ else
66
+ raise ArgumentError, "invalid log level: #{severity}"
67
+ end
68
+ end
69
+ end
70
+
71
+ #
72
+ # Returns IO object used by logger internally.
73
+ #
74
+ # Normally, we would have never needed it, but we want to
75
+ # use it as IO object for all child processes to ensure their
76
+ # output is redirected there.
77
+ #
78
+ # It is only used in debug level, in other cases output is suppressed.
79
+ #
80
+ # @api private
81
+ #
82
+ def io
83
+ @logger.instance_variable_get(:@logdev).instance_variable_get(:@dev)
84
+ end
85
+
86
+ #
87
+ # Marks code as deprecated with replacement.
88
+ #
89
+ # @param [String] old
90
+ # @param [String] new
91
+ #
92
+ def deprecate(old, new)
93
+ warn "[DEPRECATION] #{old} is deprecated. Use #{new} instead."
94
+ end
95
+
96
+ private
97
+
98
+ def create_logger(output)
99
+ logger = ::Logger.new(output)
100
+ logger.progname = 'Watir'
101
+ logger.level = ($DEBUG ? DEBUG : WARN)
102
+ logger.formatter = proc do |severity, time, progname, msg|
103
+ "#{time.strftime('%F %T')} #{severity} #{progname} #{msg}\n"
104
+ end
105
+
106
+ logger
107
+ end
108
+ end
109
+ end
@@ -1,231 +1,231 @@
1
- module Watir
2
- class RadioSet
3
- extend Forwardable
4
- include Watir::Exception
5
- include Enumerable
6
-
7
- delegate [:exists?, :present?, :visible?, :browser] => :source
8
-
9
- attr_reader :source, :frame
10
-
11
- def initialize(query_scope, selector)
12
- unless selector.kind_of? Hash
13
- raise ArgumentError, "invalid argument: #{selector.inspect}"
14
- end
15
-
16
- @source = Radio.new(query_scope, selector)
17
- @frame = @source.parent(tag_name: :form)
18
- end
19
-
20
- #
21
- # Yields each Radio associated with this set.
22
- #
23
- # @example
24
- # radio_set = browser.radio_set
25
- # radio_set.each do |radio|
26
- # puts radio.text
27
- # end
28
- #
29
- # @yieldparam [Watir::RadioSet] element iterate through the radio buttons.
30
- #
31
-
32
- def each(&block)
33
- radios.each(&block)
34
- end
35
-
36
- #
37
- # Get the n'th radio button in this set
38
- #
39
- # @return Watir::Radio
40
- #
41
-
42
- def [](idx)
43
- radios[idx]
44
- end
45
-
46
- #
47
- # @return Watir::Radio
48
- #
49
-
50
- def radio(opt = {})
51
- n = name
52
- if !n.empty? && (!opt[:name] || opt[:name] == n)
53
- frame.radio(opt.merge name: n)
54
- elsif n.empty?
55
- return source
56
- else
57
- raise Watir::Exception::UnknownObjectException, "#{opt[:name]} does not match name of RadioSet: #{n}"
58
- end
59
-
60
- end
61
-
62
- #
63
- # @return Watir::RadioCollection
64
- #
65
-
66
- def radios(opt = {})
67
- n = name
68
- if !n.empty? && (!opt[:name] || opt[:name] == n)
69
- element_call(:wait_for_present) { frame.radios(opt.merge name: n) }
70
- elsif n.empty?
71
- Watir::RadioCollection.new(frame, element: source.wd)
72
- else
73
- raise Watir::Exception::UnknownObjectException, "#{opt[:name]} does not match name of RadioSet: #{n}"
74
- end
75
- end
76
-
77
- #
78
- # Returns true if any radio buttons in the set are enabled.
79
- #
80
- # @return [Boolean]
81
- #
82
-
83
- def enabled?
84
- any?(&:enabled?)
85
- end
86
-
87
- #
88
- # Returns true if all radio buttons in the set are disabled.
89
- #
90
- # @return [Boolean]
91
- #
92
-
93
- def disabled?
94
- !enabled?
95
- end
96
-
97
- #
98
- # Returns the name attribute for the set.
99
- #
100
- # @return [String]
101
- #
102
-
103
- def name
104
- @name ||= source.name
105
- end
106
-
107
- #
108
- # If RadioSet exists, this always returns 'radio'.
109
- #
110
- # @return [String]
111
- #
112
-
113
- def type
114
- source.send :assert_exists
115
- 'radio'
116
- end
117
-
118
- #
119
- # Returns true if the radio set has one or more radio buttons where label matches the given value.
120
- #
121
- # @param [String, Regexp] str_or_rx
122
- # @return [Boolean]
123
- #
124
-
125
- def include?(str_or_rx)
126
- radio(label: str_or_rx).exist?
127
- end
128
-
129
- #
130
- # Select the radio button whose value or label matches the given string.
131
- #
132
- # @param [String, Regexp] str_or_rx
133
- # @raise [Watir::Exception::UnknownObjectException] if the Radio does not exist.
134
- # @return [String] The value or text of the radio selected.
135
- #
136
-
137
- def select(str_or_rx)
138
- found_by_value = radio(value: str_or_rx)
139
- found_by_text = radio(label: str_or_rx)
140
-
141
- if found_by_value.exist?
142
- found_by_value.click unless found_by_value.selected?
143
- return found_by_value.value
144
- elsif found_by_text.exist?
145
- found_by_text.click unless found_by_text.selected?
146
- return found_by_text.text
147
- else
148
- raise UnknownObjectException, "Unable to locate radio matching #{str_or_rx.inspect}"
149
- end
150
- end
151
-
152
- #
153
- # Returns true if any of the radio button label matches the given value.
154
- #
155
- # @param [String, Regexp] str_or_rx
156
- # @raise [Watir::Exception::UnknownObjectException] if the options do not exist
157
- # @return [Boolean]
158
- #
159
-
160
- def selected?(str_or_rx)
161
- found = frame.radio(label: str_or_rx)
162
-
163
- return found.selected? if found.exist?
164
- raise UnknownObjectException, "Unable to locate radio matching #{str_or_rx.inspect}"
165
- end
166
-
167
- #
168
- # Returns the value of the selected radio button in the set.
169
- # Returns nil if no radio is selected.
170
- #
171
- # @return [String, nil]
172
- #
173
-
174
- def value
175
- sel = selected
176
- sel && sel.value
177
- end
178
-
179
- #
180
- # Returns the text of the selected radio button in the set.
181
- # Returns nil if no option is selected.
182
- #
183
- # @return [String, nil]
184
- #
185
-
186
- def text
187
- sel = selected
188
- sel && sel.text
189
- end
190
-
191
- #
192
- # Returns the selected Radio element.
193
- # Returns nil if no radio button is selected.
194
- #
195
- # @return [Watir::Radio, nil]
196
- #
197
-
198
- def selected
199
- find(&:selected?)
200
- end
201
-
202
- #
203
- # Returns true if two elements are equal.
204
- #
205
- # @example
206
- # browser.radio_set(id: 'new_user_newsletter_yes') == browser.radio_set(id: 'new_user_newsletter_no')
207
- # #=> true
208
- #
209
-
210
- def ==(other)
211
- return false unless other.kind_of?(self.class)
212
- radios == other.radios
213
- end
214
- alias_method :eql?, :==
215
-
216
- private
217
-
218
- def element_call(*args, &blk)
219
- source.send :element_call, *args, &blk
220
- end
221
- end # RadioSet
222
-
223
- module Container
224
- def radio_set(*args)
225
- RadioSet.new(self, extract_selector(args).merge(tag_name: "input", type: "radio"))
226
- end
227
-
228
- Watir.tag_to_class[:radio_set] = RadioSet
229
- end # Container
230
-
231
- end # Watir
1
+ module Watir
2
+ class RadioSet
3
+ extend Forwardable
4
+ include Watir::Exception
5
+ include Enumerable
6
+
7
+ delegate [:exists?, :present?, :visible?, :browser] => :source
8
+
9
+ attr_reader :source, :frame
10
+
11
+ def initialize(query_scope, selector)
12
+ unless selector.kind_of? Hash
13
+ raise ArgumentError, "invalid argument: #{selector.inspect}"
14
+ end
15
+
16
+ @source = Radio.new(query_scope, selector)
17
+ @frame = @source.parent(tag_name: :form)
18
+ end
19
+
20
+ #
21
+ # Yields each Radio associated with this set.
22
+ #
23
+ # @example
24
+ # radio_set = browser.radio_set
25
+ # radio_set.each do |radio|
26
+ # puts radio.text
27
+ # end
28
+ #
29
+ # @yieldparam [Watir::RadioSet] element iterate through the radio buttons.
30
+ #
31
+
32
+ def each(&block)
33
+ radios.each(&block)
34
+ end
35
+
36
+ #
37
+ # Get the n'th radio button in this set
38
+ #
39
+ # @return Watir::Radio
40
+ #
41
+
42
+ def [](idx)
43
+ radios[idx]
44
+ end
45
+
46
+ #
47
+ # @return Watir::Radio
48
+ #
49
+
50
+ def radio(opt = {})
51
+ n = name
52
+ if !n.empty? && (!opt[:name] || opt[:name] == n)
53
+ frame.radio(opt.merge name: n)
54
+ elsif n.empty?
55
+ return source
56
+ else
57
+ raise Watir::Exception::UnknownObjectException, "#{opt[:name]} does not match name of RadioSet: #{n}"
58
+ end
59
+
60
+ end
61
+
62
+ #
63
+ # @return Watir::RadioCollection
64
+ #
65
+
66
+ def radios(opt = {})
67
+ n = name
68
+ if !n.empty? && (!opt[:name] || opt[:name] == n)
69
+ element_call(:wait_for_present) { frame.radios(opt.merge name: n) }
70
+ elsif n.empty?
71
+ Watir::RadioCollection.new(frame, element: source.wd)
72
+ else
73
+ raise Watir::Exception::UnknownObjectException, "#{opt[:name]} does not match name of RadioSet: #{n}"
74
+ end
75
+ end
76
+
77
+ #
78
+ # Returns true if any radio buttons in the set are enabled.
79
+ #
80
+ # @return [Boolean]
81
+ #
82
+
83
+ def enabled?
84
+ any?(&:enabled?)
85
+ end
86
+
87
+ #
88
+ # Returns true if all radio buttons in the set are disabled.
89
+ #
90
+ # @return [Boolean]
91
+ #
92
+
93
+ def disabled?
94
+ !enabled?
95
+ end
96
+
97
+ #
98
+ # Returns the name attribute for the set.
99
+ #
100
+ # @return [String]
101
+ #
102
+
103
+ def name
104
+ @name ||= source.name
105
+ end
106
+
107
+ #
108
+ # If RadioSet exists, this always returns 'radio'.
109
+ #
110
+ # @return [String]
111
+ #
112
+
113
+ def type
114
+ source.send :assert_exists
115
+ 'radio'
116
+ end
117
+
118
+ #
119
+ # Returns true if the radio set has one or more radio buttons where label matches the given value.
120
+ #
121
+ # @param [String, Regexp] str_or_rx
122
+ # @return [Boolean]
123
+ #
124
+
125
+ def include?(str_or_rx)
126
+ radio(label: str_or_rx).exist?
127
+ end
128
+
129
+ #
130
+ # Select the radio button whose value or label matches the given string.
131
+ #
132
+ # @param [String, Regexp] str_or_rx
133
+ # @raise [Watir::Exception::UnknownObjectException] if the Radio does not exist.
134
+ # @return [String] The value or text of the radio selected.
135
+ #
136
+
137
+ def select(str_or_rx)
138
+ found_by_value = radio(value: str_or_rx)
139
+ found_by_text = radio(label: str_or_rx)
140
+
141
+ if found_by_value.exist?
142
+ found_by_value.click unless found_by_value.selected?
143
+ return found_by_value.value
144
+ elsif found_by_text.exist?
145
+ found_by_text.click unless found_by_text.selected?
146
+ return found_by_text.text
147
+ else
148
+ raise UnknownObjectException, "Unable to locate radio matching #{str_or_rx.inspect}"
149
+ end
150
+ end
151
+
152
+ #
153
+ # Returns true if any of the radio button label matches the given value.
154
+ #
155
+ # @param [String, Regexp] str_or_rx
156
+ # @raise [Watir::Exception::UnknownObjectException] if the options do not exist
157
+ # @return [Boolean]
158
+ #
159
+
160
+ def selected?(str_or_rx)
161
+ found = frame.radio(label: str_or_rx)
162
+
163
+ return found.selected? if found.exist?
164
+ raise UnknownObjectException, "Unable to locate radio matching #{str_or_rx.inspect}"
165
+ end
166
+
167
+ #
168
+ # Returns the value of the selected radio button in the set.
169
+ # Returns nil if no radio is selected.
170
+ #
171
+ # @return [String, nil]
172
+ #
173
+
174
+ def value
175
+ sel = selected
176
+ sel && sel.value
177
+ end
178
+
179
+ #
180
+ # Returns the text of the selected radio button in the set.
181
+ # Returns nil if no option is selected.
182
+ #
183
+ # @return [String, nil]
184
+ #
185
+
186
+ def text
187
+ sel = selected
188
+ sel && sel.text
189
+ end
190
+
191
+ #
192
+ # Returns the selected Radio element.
193
+ # Returns nil if no radio button is selected.
194
+ #
195
+ # @return [Watir::Radio, nil]
196
+ #
197
+
198
+ def selected
199
+ find(&:selected?)
200
+ end
201
+
202
+ #
203
+ # Returns true if two elements are equal.
204
+ #
205
+ # @example
206
+ # browser.radio_set(id: 'new_user_newsletter_yes') == browser.radio_set(id: 'new_user_newsletter_no')
207
+ # #=> true
208
+ #
209
+
210
+ def ==(other)
211
+ return false unless other.kind_of?(self.class)
212
+ radios == other.radios
213
+ end
214
+ alias_method :eql?, :==
215
+
216
+ private
217
+
218
+ def element_call(*args, &blk)
219
+ source.send :element_call, *args, &blk
220
+ end
221
+ end # RadioSet
222
+
223
+ module Container
224
+ def radio_set(*args)
225
+ RadioSet.new(self, extract_selector(args).merge(tag_name: "input", type: "radio"))
226
+ end
227
+
228
+ Watir.tag_to_class[:radio_set] = RadioSet
229
+ end # Container
230
+
231
+ end # Watir