watir 6.13.0 → 6.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (223) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +141 -0
  3. data/.travis.yml +6 -0
  4. data/CHANGES.md +12 -0
  5. data/Gemfile +4 -10
  6. data/README.md +64 -49
  7. data/Rakefile +28 -16
  8. data/lib/watir.rb +13 -15
  9. data/lib/watir/adjacent.rb +15 -13
  10. data/lib/watir/after_hooks.rb +8 -10
  11. data/lib/watir/alert.rb +7 -8
  12. data/lib/watir/aliases.rb +2 -2
  13. data/lib/watir/attribute_helper.rb +18 -20
  14. data/lib/watir/browser.rb +42 -75
  15. data/lib/watir/capabilities.rb +19 -10
  16. data/lib/watir/cell_container.rb +0 -2
  17. data/lib/watir/container.rb +4 -4
  18. data/lib/watir/cookies.rb +7 -8
  19. data/lib/watir/element_collection.rb +37 -22
  20. data/lib/watir/elements/area.rb +0 -2
  21. data/lib/watir/elements/button.rb +1 -3
  22. data/lib/watir/elements/cell.rb +0 -1
  23. data/lib/watir/elements/checkbox.rb +5 -7
  24. data/lib/watir/elements/date_field.rb +5 -9
  25. data/lib/watir/elements/date_time_field.rb +6 -10
  26. data/lib/watir/elements/dlist.rb +2 -4
  27. data/lib/watir/elements/element.rb +201 -99
  28. data/lib/watir/elements/file_field.rb +3 -4
  29. data/lib/watir/elements/font.rb +2 -4
  30. data/lib/watir/elements/form.rb +0 -2
  31. data/lib/watir/elements/hidden.rb +3 -4
  32. data/lib/watir/elements/html_elements.rb +24 -76
  33. data/lib/watir/elements/iframe.rb +57 -71
  34. data/lib/watir/elements/image.rb +3 -4
  35. data/lib/watir/elements/input.rb +0 -2
  36. data/lib/watir/elements/link.rb +2 -5
  37. data/lib/watir/elements/list.rb +4 -4
  38. data/lib/watir/elements/option.rb +3 -6
  39. data/lib/watir/elements/radio.rb +4 -6
  40. data/lib/watir/elements/row.rb +0 -1
  41. data/lib/watir/elements/select.rb +41 -43
  42. data/lib/watir/elements/svg_elements.rb +0 -116
  43. data/lib/watir/elements/table.rb +1 -2
  44. data/lib/watir/elements/table_cell.rb +2 -3
  45. data/lib/watir/elements/text_field.rb +4 -6
  46. data/lib/watir/exception.rb +0 -1
  47. data/lib/watir/extensions/nokogiri.rb +2 -4
  48. data/lib/watir/generator.rb +3 -3
  49. data/lib/watir/generator/base.rb +10 -10
  50. data/lib/watir/generator/base/generator.rb +26 -29
  51. data/lib/watir/generator/base/idl_sorter.rb +34 -32
  52. data/lib/watir/generator/base/spec_extractor.rb +132 -114
  53. data/lib/watir/generator/base/util.rb +1 -3
  54. data/lib/watir/generator/base/visitor.rb +140 -140
  55. data/lib/watir/generator/html.rb +4 -4
  56. data/lib/watir/generator/html/generator.rb +2 -4
  57. data/lib/watir/generator/html/spec_extractor.rb +33 -33
  58. data/lib/watir/generator/html/visitor.rb +14 -14
  59. data/lib/watir/generator/svg.rb +3 -3
  60. data/lib/watir/generator/svg/generator.rb +1 -3
  61. data/lib/watir/generator/svg/spec_extractor.rb +35 -35
  62. data/lib/watir/generator/svg/visitor.rb +14 -14
  63. data/lib/watir/has_window.rb +2 -4
  64. data/lib/watir/js_execution.rb +7 -9
  65. data/lib/watir/js_snippets.rb +3 -3
  66. data/lib/watir/js_snippets/attributeValues.js +11 -0
  67. data/lib/watir/legacy_wait.rb +7 -12
  68. data/lib/watir/locators.rb +9 -11
  69. data/lib/watir/locators/button/locator.rb +2 -3
  70. data/lib/watir/locators/button/selector_builder.rb +9 -9
  71. data/lib/watir/locators/button/selector_builder/xpath.rb +1 -1
  72. data/lib/watir/locators/button/validator.rb +2 -2
  73. data/lib/watir/locators/cell/locator.rb +0 -2
  74. data/lib/watir/locators/cell/selector_builder.rb +3 -5
  75. data/lib/watir/locators/element/locator.rb +85 -64
  76. data/lib/watir/locators/element/selector_builder.rb +40 -38
  77. data/lib/watir/locators/element/selector_builder/xpath.rb +20 -18
  78. data/lib/watir/locators/element/validator.rb +1 -1
  79. data/lib/watir/locators/row/locator.rb +0 -2
  80. data/lib/watir/locators/row/selector_builder.rb +6 -9
  81. data/lib/watir/locators/text_area/selector_builder.rb +1 -1
  82. data/lib/watir/locators/text_field/locator.rb +1 -3
  83. data/lib/watir/locators/text_field/selector_builder.rb +5 -5
  84. data/lib/watir/locators/text_field/selector_builder/xpath.rb +1 -1
  85. data/lib/watir/locators/text_field/validator.rb +3 -2
  86. data/lib/watir/logger.rb +11 -21
  87. data/lib/watir/navigation.rb +49 -0
  88. data/lib/watir/radio_set.rb +17 -18
  89. data/lib/watir/row_container.rb +3 -5
  90. data/lib/watir/screenshot.rb +2 -4
  91. data/lib/watir/user_editable.rb +13 -8
  92. data/lib/watir/version.rb +3 -0
  93. data/lib/watir/wait.rb +56 -55
  94. data/lib/watir/wait/timer.rb +1 -3
  95. data/lib/watir/window.rb +36 -45
  96. data/lib/watir/xpath_support.rb +1 -3
  97. data/lib/watirspec.rb +11 -11
  98. data/lib/watirspec/guards.rb +10 -7
  99. data/lib/watirspec/implementation.rb +3 -4
  100. data/lib/watirspec/rake_tasks.rb +30 -29
  101. data/lib/watirspec/remote_server.rb +3 -3
  102. data/lib/watirspec/runner.rb +1 -2
  103. data/lib/watirspec/server.rb +3 -0
  104. data/lib/watirspec/server/app.rb +14 -6
  105. data/spec/implementation_spec.rb +9 -9
  106. data/spec/locator_spec_helper.rb +3 -4
  107. data/spec/spec_helper.rb +3 -7
  108. data/spec/unit/container_spec.rb +9 -10
  109. data/spec/unit/element_locator_spec.rb +224 -219
  110. data/spec/unit/logger_spec.rb +4 -4
  111. data/spec/unit/unit_helper.rb +0 -2
  112. data/spec/unit/wait_spec.rb +26 -28
  113. data/spec/watirspec/adjacent_spec.rb +130 -130
  114. data/spec/watirspec/after_hooks_spec.rb +63 -63
  115. data/spec/watirspec/alert_spec.rb +6 -6
  116. data/spec/watirspec/attributes_spec.rb +6 -6
  117. data/spec/watirspec/browser_spec.rb +161 -162
  118. data/spec/watirspec/click_spec.rb +9 -9
  119. data/spec/watirspec/cookies_spec.rb +15 -14
  120. data/spec/watirspec/drag_and_drop_spec.rb +15 -16
  121. data/spec/watirspec/element_hidden_spec.rb +19 -21
  122. data/spec/watirspec/elements/area_spec.rb +18 -21
  123. data/spec/watirspec/elements/areas_spec.rb +13 -15
  124. data/spec/watirspec/elements/button_spec.rb +96 -99
  125. data/spec/watirspec/elements/buttons_spec.rb +17 -19
  126. data/spec/watirspec/elements/checkbox_spec.rb +102 -100
  127. data/spec/watirspec/elements/checkboxes_spec.rb +13 -15
  128. data/spec/watirspec/elements/collections_spec.rb +35 -37
  129. data/spec/watirspec/elements/date_field_spec.rb +46 -47
  130. data/spec/watirspec/elements/date_fields_spec.rb +13 -15
  131. data/spec/watirspec/elements/date_time_field_spec.rb +62 -57
  132. data/spec/watirspec/elements/date_time_fields_spec.rb +14 -15
  133. data/spec/watirspec/elements/dd_spec.rb +46 -48
  134. data/spec/watirspec/elements/dds_spec.rb +13 -15
  135. data/spec/watirspec/elements/del_spec.rb +27 -28
  136. data/spec/watirspec/elements/dels_spec.rb +13 -15
  137. data/spec/watirspec/elements/div_spec.rb +89 -91
  138. data/spec/watirspec/elements/divs_spec.rb +17 -19
  139. data/spec/watirspec/elements/dl_spec.rb +52 -54
  140. data/spec/watirspec/elements/dls_spec.rb +13 -15
  141. data/spec/watirspec/elements/dt_spec.rb +46 -48
  142. data/spec/watirspec/elements/dts_spec.rb +13 -15
  143. data/spec/watirspec/elements/element_spec.rb +240 -189
  144. data/spec/watirspec/elements/elements_spec.rb +16 -16
  145. data/spec/watirspec/elements/em_spec.rb +38 -40
  146. data/spec/watirspec/elements/ems_spec.rb +13 -15
  147. data/spec/watirspec/elements/filefield_spec.rb +45 -46
  148. data/spec/watirspec/elements/filefields_spec.rb +13 -15
  149. data/spec/watirspec/elements/font_spec.rb +11 -13
  150. data/spec/watirspec/elements/form_spec.rb +13 -15
  151. data/spec/watirspec/elements/forms_spec.rb +13 -15
  152. data/spec/watirspec/elements/frame_spec.rb +48 -50
  153. data/spec/watirspec/elements/frames_spec.rb +13 -15
  154. data/spec/watirspec/elements/hidden_spec.rb +23 -25
  155. data/spec/watirspec/elements/hiddens_spec.rb +13 -15
  156. data/spec/watirspec/elements/hn_spec.rb +22 -24
  157. data/spec/watirspec/elements/hns_spec.rb +13 -13
  158. data/spec/watirspec/elements/iframe_spec.rb +106 -74
  159. data/spec/watirspec/elements/iframes_spec.rb +16 -18
  160. data/spec/watirspec/elements/image_spec.rb +30 -32
  161. data/spec/watirspec/elements/images_spec.rb +13 -15
  162. data/spec/watirspec/elements/input_spec.rb +4 -5
  163. data/spec/watirspec/elements/ins_spec.rb +27 -29
  164. data/spec/watirspec/elements/inses_spec.rb +13 -15
  165. data/spec/watirspec/elements/label_spec.rb +17 -19
  166. data/spec/watirspec/elements/labels_spec.rb +13 -15
  167. data/spec/watirspec/elements/li_spec.rb +23 -25
  168. data/spec/watirspec/elements/link_spec.rb +45 -48
  169. data/spec/watirspec/elements/links_spec.rb +14 -16
  170. data/spec/watirspec/elements/lis_spec.rb +13 -15
  171. data/spec/watirspec/elements/list_spec.rb +14 -15
  172. data/spec/watirspec/elements/map_spec.rb +19 -20
  173. data/spec/watirspec/elements/maps_spec.rb +13 -15
  174. data/spec/watirspec/elements/meta_spec.rb +10 -10
  175. data/spec/watirspec/elements/metas_spec.rb +13 -15
  176. data/spec/watirspec/elements/ol_spec.rb +20 -21
  177. data/spec/watirspec/elements/ols_spec.rb +13 -15
  178. data/spec/watirspec/elements/option_spec.rb +63 -63
  179. data/spec/watirspec/elements/p_spec.rb +27 -26
  180. data/spec/watirspec/elements/pre_spec.rb +24 -25
  181. data/spec/watirspec/elements/pres_spec.rb +13 -15
  182. data/spec/watirspec/elements/ps_spec.rb +13 -15
  183. data/spec/watirspec/elements/radio_spec.rb +96 -97
  184. data/spec/watirspec/elements/radios_spec.rb +13 -15
  185. data/spec/watirspec/elements/select_list_spec.rb +244 -237
  186. data/spec/watirspec/elements/select_lists_spec.rb +15 -16
  187. data/spec/watirspec/elements/span_spec.rb +32 -31
  188. data/spec/watirspec/elements/spans_spec.rb +13 -15
  189. data/spec/watirspec/elements/strong_spec.rb +23 -24
  190. data/spec/watirspec/elements/strongs_spec.rb +13 -15
  191. data/spec/watirspec/elements/table_nesting_spec.rb +15 -14
  192. data/spec/watirspec/elements/table_spec.rb +61 -62
  193. data/spec/watirspec/elements/tables_spec.rb +15 -17
  194. data/spec/watirspec/elements/tbody_spec.rb +25 -26
  195. data/spec/watirspec/elements/tbodys_spec.rb +17 -19
  196. data/spec/watirspec/elements/td_spec.rb +20 -22
  197. data/spec/watirspec/elements/tds_spec.rb +9 -11
  198. data/spec/watirspec/elements/text_field_spec.rb +55 -56
  199. data/spec/watirspec/elements/text_fields_spec.rb +15 -16
  200. data/spec/watirspec/elements/textarea_spec.rb +2 -2
  201. data/spec/watirspec/elements/textareas_spec.rb +1 -1
  202. data/spec/watirspec/elements/tfoot_spec.rb +22 -23
  203. data/spec/watirspec/elements/tfoots_spec.rb +19 -19
  204. data/spec/watirspec/elements/thead_spec.rb +21 -23
  205. data/spec/watirspec/elements/theads_spec.rb +19 -19
  206. data/spec/watirspec/elements/tr_spec.rb +20 -22
  207. data/spec/watirspec/elements/trs_spec.rb +17 -19
  208. data/spec/watirspec/elements/ul_spec.rb +17 -19
  209. data/spec/watirspec/elements/uls_spec.rb +13 -14
  210. data/spec/watirspec/html/data_attributes.html +1 -0
  211. data/spec/watirspec/radio_set_spec.rb +100 -99
  212. data/spec/watirspec/relaxed_locate_spec.rb +19 -43
  213. data/spec/watirspec/screenshot_spec.rb +4 -4
  214. data/spec/watirspec/special_chars_spec.rb +2 -4
  215. data/spec/watirspec/support/rspec_matchers.rb +85 -22
  216. data/spec/watirspec/user_editable_spec.rb +84 -85
  217. data/spec/watirspec/wait_spec.rb +74 -95
  218. data/spec/watirspec/window_switching_spec.rb +131 -132
  219. data/spec/watirspec_helper.rb +12 -9
  220. data/support/travis.sh +4 -0
  221. data/support/version_differ.rb +12 -13
  222. data/watir.gemspec +29 -22
  223. metadata +76 -50
@@ -9,16 +9,15 @@ module Watir
9
9
 
10
10
  def build(selectors)
11
11
  adjacent = selectors.delete :adjacent
12
- xpath = adjacent ? process_adjacent(adjacent) : ".//"
12
+ xpath = adjacent ? process_adjacent(adjacent) : './/*'
13
13
 
14
- xpath << (selectors.delete(:tag_name) || '*').to_s
14
+ tag_name = selectors.delete(:tag_name).to_s
15
+ xpath << "[local-name()='#{tag_name}']" unless tag_name.empty?
15
16
 
16
17
  index = selectors.delete(:index)
17
18
 
18
19
  # the remaining entries should be attributes
19
- unless selectors.empty?
20
- xpath << "[" << attribute_expression(nil, selectors) << "]"
21
- end
20
+ xpath << '[' << attribute_expression(nil, selectors) << ']' unless selectors.empty?
22
21
 
23
22
  xpath << "[#{index + 1}]" if adjacent && index
24
23
 
@@ -31,27 +30,28 @@ module Watir
31
30
  def attribute_expression(building, selectors)
32
31
  f = selectors.map do |key, val|
33
32
  if val.is_a?(Array) && key == :class
34
- "(" + val.map { |v| build_class_match(v) }.join(" and ") + ")"
33
+ '(' + val.map { |v| build_class_match(v) }.join(' and ') + ')'
35
34
  elsif val.is_a?(Array)
36
- "(" + val.map { |v| equal_pair(building, key, v) }.join(" or ") + ")"
37
- elsif val == true
35
+ '(' + val.map { |v| equal_pair(building, key, v) }.join(' or ') + ')'
36
+ elsif val.eql? true
38
37
  attribute_presence(key)
39
- elsif val == false
38
+ elsif val.eql? false
40
39
  attribute_absence(key)
41
40
  else
42
41
  equal_pair(building, key, val)
43
42
  end
44
43
  end
45
- f.join(" and ")
44
+ f.join(' and ')
46
45
  end
47
46
 
48
47
  # @todo Get rid of building
49
48
  def equal_pair(building, key, value)
50
49
  if key == :class
51
50
  if value.strip.include?(' ')
52
- Watir.logger.deprecate "Using the :class locator to locate multiple classes with a String value (i.e. \"#{value}\")",
51
+ dep = "Using the :class locator to locate multiple classes with a String value (i.e. \"#{value}\")"
52
+ Watir.logger.deprecate dep,
53
53
  "Array (e.g. #{value.split})",
54
- ids: [:class_array]
54
+ ids: [:class_array]
55
55
  end
56
56
  build_class_match(value)
57
57
  elsif key == :label && @should_use_label_element
@@ -77,8 +77,10 @@ module Watir
77
77
  # type attributes can be upper case - downcase them
78
78
  # https://github.com/watir/watir/issues/72
79
79
  XpathSupport.downcase('@type')
80
+ when ::Symbol
81
+ "@#{key.to_s.tr('_', '-')}"
80
82
  else
81
- "@#{key.to_s.tr("_", "-")}"
83
+ raise Error::Exception, "Unable to build XPath using #{key}"
82
84
  end
83
85
  end
84
86
 
@@ -88,19 +90,19 @@ module Watir
88
90
  xpath = './'
89
91
  xpath << case adjacent
90
92
  when :ancestor
91
- "ancestor::"
93
+ 'ancestor::*'
92
94
  when :preceding
93
- "preceding-sibling::"
95
+ 'preceding-sibling::*'
94
96
  when :following
95
- "following-sibling::"
97
+ 'following-sibling::*'
96
98
  when :child
97
- "child::"
99
+ 'child::*'
98
100
  end
99
101
  xpath
100
102
  end
101
103
 
102
104
  def build_class_match(value)
103
- if value.match(/^!/)
105
+ if value =~ /^!/
104
106
  klass = XpathSupport.escape " #{value[1..-1]} "
105
107
  "not(contains(concat(' ', @class, ' '), #{klass}))"
106
108
  else
@@ -7,7 +7,7 @@ module Watir
7
7
  element_tag_name = element.tag_name.downcase
8
8
 
9
9
  if selector_tag_name
10
- return unless selector_tag_name === element_tag_name
10
+ return unless element_tag_name =~ /#{selector_tag_name}/
11
11
  end
12
12
 
13
13
  element
@@ -2,13 +2,11 @@ module Watir
2
2
  module Locators
3
3
  class Row
4
4
  class Locator < Element::Locator
5
-
6
5
  private
7
6
 
8
7
  def using_selenium(*)
9
8
  # force Watir usage
10
9
  end
11
-
12
10
  end
13
11
  end
14
12
  end
@@ -3,18 +3,17 @@ module Watir
3
3
  class Row
4
4
  class SelectorBuilder < Element::SelectorBuilder
5
5
  def build_wd_selector(selectors)
6
- return if selectors.values.any? { |e| e.kind_of? Regexp }
7
- selectors.delete(:tag_name) || raise("internal error: no tag_name?!")
6
+ return if selectors.values.any? { |e| e.is_a? Regexp }
7
+
8
+ selectors.delete(:tag_name) || raise('internal error: no tag_name?!')
8
9
 
9
10
  expressions = generate_expressions(@query_scope.tag_name.downcase)
10
11
 
11
12
  attr_expr = xpath_builder.attribute_expression(nil, selectors)
12
13
 
13
- unless attr_expr.empty?
14
- expressions.map! { |e| "#{e}[#{attr_expr}]" }
15
- end
14
+ expressions.map! { |e| "#{e}[#{attr_expr}]" } unless attr_expr.empty?
16
15
 
17
- xpath = expressions.join(" | ")
16
+ xpath = expressions.join(' | ')
18
17
 
19
18
  p build_wd_selector: xpath if $DEBUG
20
19
 
@@ -25,9 +24,7 @@ module Watir
25
24
 
26
25
  def generate_expressions(tag_name)
27
26
  expressions = %w[./tr]
28
- unless %w[tbody tfoot thead].include?(tag_name)
29
- expressions += %w[./tbody/tr ./thead/tr ./tfoot/tr]
30
- end
27
+ expressions += %w[./tbody/tr ./thead/tr ./tfoot/tr] unless %w[tbody tfoot thead].include?(tag_name)
31
28
  expressions
32
29
  end
33
30
  end
@@ -10,7 +10,7 @@ module Watir
10
10
  # difference between IDL vs content attribute.
11
11
  # Current Element design doesn't allow to do that in any
12
12
  # obvious way except to use regular expression.
13
- if how == :value && what.kind_of?(String)
13
+ if how == :value && what.is_a?(String)
14
14
  [how, Regexp.new('^' + Regexp.escape(what) + '$')]
15
15
  else
16
16
  super
@@ -2,7 +2,6 @@ module Watir
2
2
  module Locators
3
3
  class TextField
4
4
  class Locator < Element::Locator
5
-
6
5
  private
7
6
 
8
7
  def using_selenium(*)
@@ -14,7 +13,7 @@ module Watir
14
13
 
15
14
  tag_name = element.tag_name.downcase
16
15
 
17
- [:text, :value, :label].each do |key|
16
+ %i[text value label].each do |key|
18
17
  if rx_selector.key?(key)
19
18
  correct_key = tag_name == 'input' ? :value : :text
20
19
  rx_selector[correct_key] = rx_selector.delete(key)
@@ -23,7 +22,6 @@ module Watir
23
22
 
24
23
  super
25
24
  end
26
-
27
25
  end
28
26
  end
29
27
  end
@@ -3,7 +3,7 @@ module Watir
3
3
  class TextField
4
4
  class SelectorBuilder < Element::SelectorBuilder
5
5
  def build_wd_selector(selectors)
6
- return if selectors.values.any? { |e| e.kind_of? Regexp }
6
+ return if selectors.values.any? { |e| e.is_a? Regexp }
7
7
 
8
8
  selectors.delete(:tag_name)
9
9
 
@@ -11,7 +11,7 @@ module Watir
11
11
 
12
12
  xpath = ".//input[(not(@type) or (#{negative_type_expr}))"
13
13
  xpath << " and #{input_attr_exp}" unless input_attr_exp.empty?
14
- xpath << "]"
14
+ xpath << ']'
15
15
 
16
16
  p build_wd_selector: xpath if $DEBUG
17
17
 
@@ -21,9 +21,9 @@ module Watir
21
21
  private
22
22
 
23
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 ')
24
+ Watir::TextField::NON_TEXT_TYPES.map { |type|
25
+ format('%s!=%s', XpathSupport.downcase('@type'), type.inspect)
26
+ }.join(' and ')
27
27
  end
28
28
  end
29
29
  end
@@ -5,7 +5,7 @@ module Watir
5
5
  class XPath < Element::SelectorBuilder::XPath
6
6
  def lhs_for(building, key)
7
7
  if building == :input && key == :text
8
- "@value"
8
+ '@value'
9
9
  else
10
10
  super
11
11
  end
@@ -2,8 +2,9 @@ module Watir
2
2
  module Locators
3
3
  class TextField
4
4
  class Validator < Element::Validator
5
- def validate(element, selector)
6
- return unless element.tag_name.downcase == 'input'
5
+ def validate(element, _selector)
6
+ return unless element.tag_name.casecmp('input').zero?
7
+
7
8
  element
8
9
  end
9
10
  end
@@ -27,7 +27,7 @@ module Watir
27
27
  :fatal, :fatal?,
28
28
  :level
29
29
 
30
- def initialize(progname="Watir")
30
+ def initialize(progname = 'Watir')
31
31
  @logger = create_logger($stdout)
32
32
  @logger.progname = progname
33
33
  @ignored = []
@@ -46,7 +46,7 @@ module Watir
46
46
  # Only log a warn message if it is not set to be ignored.
47
47
  #
48
48
  def warn(message, ids: [], &block)
49
- msg = ids.empty? ? "" : "[#{ids.map!(&:to_s).map(&:inspect).join(", ")}] "
49
+ msg = ids.empty? ? '' : "[#{ids.map!(&:to_s).map(&:inspect).join(', ')}] "
50
50
  msg += message
51
51
  @logger.warn(msg, &block) unless (@ignored & ids).any?
52
52
  end
@@ -60,22 +60,10 @@ module Watir
60
60
  if severity.is_a?(Integer)
61
61
  @logger.level = severity
62
62
  else
63
- case severity.to_s.downcase
64
- when 'debug'.freeze
65
- @logger.level = DEBUG
66
- when 'info'.freeze
67
- @logger.level = INFO
68
- when 'warn'.freeze
69
- @logger.level = WARN
70
- when 'error'.freeze
71
- @logger.level = ERROR
72
- when 'fatal'.freeze
73
- @logger.level = FATAL
74
- when 'unknown'.freeze
75
- @logger.level = UNKNOWN
76
- else
77
- raise ArgumentError, "invalid log level: #{severity}"
78
- end
63
+ levels = %w[debug info warn error fatal unknown]
64
+ raise ArgumentError, "invalid log level: #{severity}" unless levels.include? severity.to_s.downcase
65
+
66
+ @logger.level = severity.to_s.upcase
79
67
  end
80
68
  end
81
69
 
@@ -100,10 +88,12 @@ module Watir
100
88
  # @param [String] old
101
89
  # @param [String] new
102
90
  #
103
- def deprecate(old, new, ids: [])
91
+ def deprecate(old, new, reference: '', ids: [])
104
92
  return if @ignored.include?('deprecations') || (@ignored & ids.map!(&:to_s)).any?
105
- msg = ids.empty? ? "" : "[#{ids.map(&:inspect).join(", ")}] "
106
- warn "[DEPRECATION] #{msg}#{old} is deprecated. Use #{new} instead."
93
+
94
+ msg = ids.empty? ? '' : "[#{ids.map(&:inspect).join(', ')}] "
95
+ ref_msg = reference.empty? ? '.' : "; see explanation for this deprecation: #{reference}."
96
+ warn "[DEPRECATION] #{msg}#{old} is deprecated. Use #{new} instead#{ref_msg}"
107
97
  end
108
98
 
109
99
  private
@@ -0,0 +1,49 @@
1
+ module Watir
2
+ module Navigation
3
+ #
4
+ # Goes to the given URL.
5
+ #
6
+ # @example
7
+ # browser.goto "watir.github.io"
8
+ #
9
+ # @param [String] uri The url.
10
+ # @return [String] The url you end up at.
11
+ #
12
+
13
+ def goto(uri)
14
+ uri = "http://#{uri}" unless uri =~ URI::DEFAULT_PARSER.make_regexp
15
+
16
+ @driver.navigate.to uri
17
+ @after_hooks.run
18
+
19
+ uri
20
+ end
21
+
22
+ #
23
+ # Navigates back in history.
24
+ #
25
+
26
+ def back
27
+ @driver.navigate.back
28
+ @after_hooks.run
29
+ end
30
+
31
+ #
32
+ # Navigates forward in history.
33
+ #
34
+
35
+ def forward
36
+ @driver.navigate.forward
37
+ @after_hooks.run
38
+ end
39
+
40
+ #
41
+ # Refreshes current page.
42
+ #
43
+
44
+ def refresh
45
+ @driver.navigate.refresh
46
+ @after_hooks.run
47
+ end
48
+ end # Navigation
49
+ end # Watir
@@ -4,14 +4,12 @@ module Watir
4
4
  include Watir::Exception
5
5
  include Enumerable
6
6
 
7
- delegate [:exists?, :present?, :visible?, :browser] => :source
7
+ delegate %i[exists? present? visible? browser] => :source
8
8
 
9
9
  attr_reader :source, :frame
10
10
 
11
11
  def initialize(query_scope, selector)
12
- unless selector.kind_of? Hash
13
- raise ArgumentError, "invalid argument: #{selector.inspect}"
14
- end
12
+ raise ArgumentError, "invalid argument: #{selector.inspect}" unless selector.is_a? Hash
15
13
 
16
14
  @source = Radio.new(query_scope, selector)
17
15
  @frame = @source.parent(tag_name: :form)
@@ -50,13 +48,12 @@ module Watir
50
48
  def radio(opt = {})
51
49
  n = name
52
50
  if !n.empty? && (!opt[:name] || opt[:name] == n)
53
- frame.radio(opt.merge name: n)
51
+ frame.radio(opt.merge(name: n))
54
52
  elsif n.empty?
55
53
  return source
56
54
  else
57
55
  raise Watir::Exception::UnknownObjectException, "#{opt[:name]} does not match name of RadioSet: #{n}"
58
56
  end
59
-
60
57
  end
61
58
 
62
59
  #
@@ -66,7 +63,7 @@ module Watir
66
63
  def radios(opt = {})
67
64
  n = name
68
65
  if !n.empty? && (!opt[:name] || opt[:name] == n)
69
- element_call(:wait_for_present) { frame.radios(opt.merge name: n) }
66
+ element_call(:wait_for_present) { frame.radios(opt.merge(name: n)) }
70
67
  elsif n.empty?
71
68
  Watir::RadioCollection.new(frame, element: source.wd)
72
69
  else
@@ -111,7 +108,7 @@ module Watir
111
108
  #
112
109
 
113
110
  def type
114
- source.send :assert_exists
111
+ assert_exists
115
112
  'radio'
116
113
  end
117
114
 
@@ -161,6 +158,7 @@ module Watir
161
158
  found = frame.radio(label: str_or_rx)
162
159
 
163
160
  return found.selected? if found.exist?
161
+
164
162
  raise UnknownObjectException, "Unable to locate radio matching #{str_or_rx.inspect}"
165
163
  end
166
164
 
@@ -173,7 +171,7 @@ module Watir
173
171
 
174
172
  def value
175
173
  sel = selected
176
- sel && sel.value
174
+ sel&.value
177
175
  end
178
176
 
179
177
  #
@@ -185,7 +183,7 @@ module Watir
185
183
 
186
184
  def text
187
185
  sel = selected
188
- sel && sel.text
186
+ sel&.text
189
187
  end
190
188
 
191
189
  #
@@ -208,24 +206,25 @@ module Watir
208
206
  #
209
207
 
210
208
  def ==(other)
211
- return false unless other.kind_of?(self.class)
209
+ return false unless other.is_a?(self.class)
210
+
212
211
  radios == other.radios
213
212
  end
214
- alias_method :eql?, :==
213
+ alias eql? ==
215
214
 
216
- private
217
-
218
- def element_call(*args, &blk)
219
- source.send :element_call, *args, &blk
215
+ # Ruby 2.4+ complains about using #delegate to do this
216
+ %i[assert_exists element_call].each do |method|
217
+ define_method(method) do |*args, &blk|
218
+ source.send(method, *args, &blk)
219
+ end
220
220
  end
221
221
  end # RadioSet
222
222
 
223
223
  module Container
224
224
  def radio_set(*args)
225
- RadioSet.new(self, extract_selector(args).merge(tag_name: "input", type: "radio"))
225
+ RadioSet.new(self, extract_selector(args).merge(tag_name: 'input', type: 'radio'))
226
226
  end
227
227
 
228
228
  Watir.tag_to_class[:radio_set] = RadioSet
229
229
  end # Container
230
-
231
230
  end # Watir