watir 6.13.0 → 6.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +141 -0
- data/.travis.yml +6 -0
- data/CHANGES.md +12 -0
- data/Gemfile +4 -10
- data/README.md +64 -49
- data/Rakefile +28 -16
- data/lib/watir.rb +13 -15
- data/lib/watir/adjacent.rb +15 -13
- data/lib/watir/after_hooks.rb +8 -10
- data/lib/watir/alert.rb +7 -8
- data/lib/watir/aliases.rb +2 -2
- data/lib/watir/attribute_helper.rb +18 -20
- data/lib/watir/browser.rb +42 -75
- data/lib/watir/capabilities.rb +19 -10
- data/lib/watir/cell_container.rb +0 -2
- data/lib/watir/container.rb +4 -4
- data/lib/watir/cookies.rb +7 -8
- data/lib/watir/element_collection.rb +37 -22
- data/lib/watir/elements/area.rb +0 -2
- data/lib/watir/elements/button.rb +1 -3
- data/lib/watir/elements/cell.rb +0 -1
- data/lib/watir/elements/checkbox.rb +5 -7
- data/lib/watir/elements/date_field.rb +5 -9
- data/lib/watir/elements/date_time_field.rb +6 -10
- data/lib/watir/elements/dlist.rb +2 -4
- data/lib/watir/elements/element.rb +201 -99
- data/lib/watir/elements/file_field.rb +3 -4
- data/lib/watir/elements/font.rb +2 -4
- data/lib/watir/elements/form.rb +0 -2
- data/lib/watir/elements/hidden.rb +3 -4
- data/lib/watir/elements/html_elements.rb +24 -76
- data/lib/watir/elements/iframe.rb +57 -71
- data/lib/watir/elements/image.rb +3 -4
- data/lib/watir/elements/input.rb +0 -2
- data/lib/watir/elements/link.rb +2 -5
- data/lib/watir/elements/list.rb +4 -4
- data/lib/watir/elements/option.rb +3 -6
- data/lib/watir/elements/radio.rb +4 -6
- data/lib/watir/elements/row.rb +0 -1
- data/lib/watir/elements/select.rb +41 -43
- data/lib/watir/elements/svg_elements.rb +0 -116
- data/lib/watir/elements/table.rb +1 -2
- data/lib/watir/elements/table_cell.rb +2 -3
- data/lib/watir/elements/text_field.rb +4 -6
- data/lib/watir/exception.rb +0 -1
- data/lib/watir/extensions/nokogiri.rb +2 -4
- data/lib/watir/generator.rb +3 -3
- data/lib/watir/generator/base.rb +10 -10
- data/lib/watir/generator/base/generator.rb +26 -29
- data/lib/watir/generator/base/idl_sorter.rb +34 -32
- data/lib/watir/generator/base/spec_extractor.rb +132 -114
- data/lib/watir/generator/base/util.rb +1 -3
- data/lib/watir/generator/base/visitor.rb +140 -140
- data/lib/watir/generator/html.rb +4 -4
- data/lib/watir/generator/html/generator.rb +2 -4
- data/lib/watir/generator/html/spec_extractor.rb +33 -33
- data/lib/watir/generator/html/visitor.rb +14 -14
- data/lib/watir/generator/svg.rb +3 -3
- data/lib/watir/generator/svg/generator.rb +1 -3
- data/lib/watir/generator/svg/spec_extractor.rb +35 -35
- data/lib/watir/generator/svg/visitor.rb +14 -14
- data/lib/watir/has_window.rb +2 -4
- data/lib/watir/js_execution.rb +7 -9
- data/lib/watir/js_snippets.rb +3 -3
- data/lib/watir/js_snippets/attributeValues.js +11 -0
- data/lib/watir/legacy_wait.rb +7 -12
- data/lib/watir/locators.rb +9 -11
- data/lib/watir/locators/button/locator.rb +2 -3
- data/lib/watir/locators/button/selector_builder.rb +9 -9
- data/lib/watir/locators/button/selector_builder/xpath.rb +1 -1
- data/lib/watir/locators/button/validator.rb +2 -2
- data/lib/watir/locators/cell/locator.rb +0 -2
- data/lib/watir/locators/cell/selector_builder.rb +3 -5
- data/lib/watir/locators/element/locator.rb +85 -64
- data/lib/watir/locators/element/selector_builder.rb +40 -38
- data/lib/watir/locators/element/selector_builder/xpath.rb +20 -18
- data/lib/watir/locators/element/validator.rb +1 -1
- data/lib/watir/locators/row/locator.rb +0 -2
- data/lib/watir/locators/row/selector_builder.rb +6 -9
- data/lib/watir/locators/text_area/selector_builder.rb +1 -1
- data/lib/watir/locators/text_field/locator.rb +1 -3
- data/lib/watir/locators/text_field/selector_builder.rb +5 -5
- data/lib/watir/locators/text_field/selector_builder/xpath.rb +1 -1
- data/lib/watir/locators/text_field/validator.rb +3 -2
- data/lib/watir/logger.rb +11 -21
- data/lib/watir/navigation.rb +49 -0
- data/lib/watir/radio_set.rb +17 -18
- data/lib/watir/row_container.rb +3 -5
- data/lib/watir/screenshot.rb +2 -4
- data/lib/watir/user_editable.rb +13 -8
- data/lib/watir/version.rb +3 -0
- data/lib/watir/wait.rb +56 -55
- data/lib/watir/wait/timer.rb +1 -3
- data/lib/watir/window.rb +36 -45
- data/lib/watir/xpath_support.rb +1 -3
- data/lib/watirspec.rb +11 -11
- data/lib/watirspec/guards.rb +10 -7
- data/lib/watirspec/implementation.rb +3 -4
- data/lib/watirspec/rake_tasks.rb +30 -29
- data/lib/watirspec/remote_server.rb +3 -3
- data/lib/watirspec/runner.rb +1 -2
- data/lib/watirspec/server.rb +3 -0
- data/lib/watirspec/server/app.rb +14 -6
- data/spec/implementation_spec.rb +9 -9
- data/spec/locator_spec_helper.rb +3 -4
- data/spec/spec_helper.rb +3 -7
- data/spec/unit/container_spec.rb +9 -10
- data/spec/unit/element_locator_spec.rb +224 -219
- data/spec/unit/logger_spec.rb +4 -4
- data/spec/unit/unit_helper.rb +0 -2
- data/spec/unit/wait_spec.rb +26 -28
- data/spec/watirspec/adjacent_spec.rb +130 -130
- data/spec/watirspec/after_hooks_spec.rb +63 -63
- data/spec/watirspec/alert_spec.rb +6 -6
- data/spec/watirspec/attributes_spec.rb +6 -6
- data/spec/watirspec/browser_spec.rb +161 -162
- data/spec/watirspec/click_spec.rb +9 -9
- data/spec/watirspec/cookies_spec.rb +15 -14
- data/spec/watirspec/drag_and_drop_spec.rb +15 -16
- data/spec/watirspec/element_hidden_spec.rb +19 -21
- data/spec/watirspec/elements/area_spec.rb +18 -21
- data/spec/watirspec/elements/areas_spec.rb +13 -15
- data/spec/watirspec/elements/button_spec.rb +96 -99
- data/spec/watirspec/elements/buttons_spec.rb +17 -19
- data/spec/watirspec/elements/checkbox_spec.rb +102 -100
- data/spec/watirspec/elements/checkboxes_spec.rb +13 -15
- data/spec/watirspec/elements/collections_spec.rb +35 -37
- data/spec/watirspec/elements/date_field_spec.rb +46 -47
- data/spec/watirspec/elements/date_fields_spec.rb +13 -15
- data/spec/watirspec/elements/date_time_field_spec.rb +62 -57
- data/spec/watirspec/elements/date_time_fields_spec.rb +14 -15
- data/spec/watirspec/elements/dd_spec.rb +46 -48
- data/spec/watirspec/elements/dds_spec.rb +13 -15
- data/spec/watirspec/elements/del_spec.rb +27 -28
- data/spec/watirspec/elements/dels_spec.rb +13 -15
- data/spec/watirspec/elements/div_spec.rb +89 -91
- data/spec/watirspec/elements/divs_spec.rb +17 -19
- data/spec/watirspec/elements/dl_spec.rb +52 -54
- data/spec/watirspec/elements/dls_spec.rb +13 -15
- data/spec/watirspec/elements/dt_spec.rb +46 -48
- data/spec/watirspec/elements/dts_spec.rb +13 -15
- data/spec/watirspec/elements/element_spec.rb +240 -189
- data/spec/watirspec/elements/elements_spec.rb +16 -16
- data/spec/watirspec/elements/em_spec.rb +38 -40
- data/spec/watirspec/elements/ems_spec.rb +13 -15
- data/spec/watirspec/elements/filefield_spec.rb +45 -46
- data/spec/watirspec/elements/filefields_spec.rb +13 -15
- data/spec/watirspec/elements/font_spec.rb +11 -13
- data/spec/watirspec/elements/form_spec.rb +13 -15
- data/spec/watirspec/elements/forms_spec.rb +13 -15
- data/spec/watirspec/elements/frame_spec.rb +48 -50
- data/spec/watirspec/elements/frames_spec.rb +13 -15
- data/spec/watirspec/elements/hidden_spec.rb +23 -25
- data/spec/watirspec/elements/hiddens_spec.rb +13 -15
- data/spec/watirspec/elements/hn_spec.rb +22 -24
- data/spec/watirspec/elements/hns_spec.rb +13 -13
- data/spec/watirspec/elements/iframe_spec.rb +106 -74
- data/spec/watirspec/elements/iframes_spec.rb +16 -18
- data/spec/watirspec/elements/image_spec.rb +30 -32
- data/spec/watirspec/elements/images_spec.rb +13 -15
- data/spec/watirspec/elements/input_spec.rb +4 -5
- data/spec/watirspec/elements/ins_spec.rb +27 -29
- data/spec/watirspec/elements/inses_spec.rb +13 -15
- data/spec/watirspec/elements/label_spec.rb +17 -19
- data/spec/watirspec/elements/labels_spec.rb +13 -15
- data/spec/watirspec/elements/li_spec.rb +23 -25
- data/spec/watirspec/elements/link_spec.rb +45 -48
- data/spec/watirspec/elements/links_spec.rb +14 -16
- data/spec/watirspec/elements/lis_spec.rb +13 -15
- data/spec/watirspec/elements/list_spec.rb +14 -15
- data/spec/watirspec/elements/map_spec.rb +19 -20
- data/spec/watirspec/elements/maps_spec.rb +13 -15
- data/spec/watirspec/elements/meta_spec.rb +10 -10
- data/spec/watirspec/elements/metas_spec.rb +13 -15
- data/spec/watirspec/elements/ol_spec.rb +20 -21
- data/spec/watirspec/elements/ols_spec.rb +13 -15
- data/spec/watirspec/elements/option_spec.rb +63 -63
- data/spec/watirspec/elements/p_spec.rb +27 -26
- data/spec/watirspec/elements/pre_spec.rb +24 -25
- data/spec/watirspec/elements/pres_spec.rb +13 -15
- data/spec/watirspec/elements/ps_spec.rb +13 -15
- data/spec/watirspec/elements/radio_spec.rb +96 -97
- data/spec/watirspec/elements/radios_spec.rb +13 -15
- data/spec/watirspec/elements/select_list_spec.rb +244 -237
- data/spec/watirspec/elements/select_lists_spec.rb +15 -16
- data/spec/watirspec/elements/span_spec.rb +32 -31
- data/spec/watirspec/elements/spans_spec.rb +13 -15
- data/spec/watirspec/elements/strong_spec.rb +23 -24
- data/spec/watirspec/elements/strongs_spec.rb +13 -15
- data/spec/watirspec/elements/table_nesting_spec.rb +15 -14
- data/spec/watirspec/elements/table_spec.rb +61 -62
- data/spec/watirspec/elements/tables_spec.rb +15 -17
- data/spec/watirspec/elements/tbody_spec.rb +25 -26
- data/spec/watirspec/elements/tbodys_spec.rb +17 -19
- data/spec/watirspec/elements/td_spec.rb +20 -22
- data/spec/watirspec/elements/tds_spec.rb +9 -11
- data/spec/watirspec/elements/text_field_spec.rb +55 -56
- data/spec/watirspec/elements/text_fields_spec.rb +15 -16
- data/spec/watirspec/elements/textarea_spec.rb +2 -2
- data/spec/watirspec/elements/textareas_spec.rb +1 -1
- data/spec/watirspec/elements/tfoot_spec.rb +22 -23
- data/spec/watirspec/elements/tfoots_spec.rb +19 -19
- data/spec/watirspec/elements/thead_spec.rb +21 -23
- data/spec/watirspec/elements/theads_spec.rb +19 -19
- data/spec/watirspec/elements/tr_spec.rb +20 -22
- data/spec/watirspec/elements/trs_spec.rb +17 -19
- data/spec/watirspec/elements/ul_spec.rb +17 -19
- data/spec/watirspec/elements/uls_spec.rb +13 -14
- data/spec/watirspec/html/data_attributes.html +1 -0
- data/spec/watirspec/radio_set_spec.rb +100 -99
- data/spec/watirspec/relaxed_locate_spec.rb +19 -43
- data/spec/watirspec/screenshot_spec.rb +4 -4
- data/spec/watirspec/special_chars_spec.rb +2 -4
- data/spec/watirspec/support/rspec_matchers.rb +85 -22
- data/spec/watirspec/user_editable_spec.rb +84 -85
- data/spec/watirspec/wait_spec.rb +74 -95
- data/spec/watirspec/window_switching_spec.rb +131 -132
- data/spec/watirspec_helper.rb +12 -9
- data/support/travis.sh +4 -0
- data/support/version_differ.rb +12 -13
- data/watir.gemspec +29 -22
- 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
|
-
|
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
|
-
|
33
|
+
'(' + val.map { |v| build_class_match(v) }.join(' and ') + ')'
|
35
34
|
elsif val.is_a?(Array)
|
36
|
-
|
37
|
-
elsif val
|
35
|
+
'(' + val.map { |v| equal_pair(building, key, v) }.join(' or ') + ')'
|
36
|
+
elsif val.eql? true
|
38
37
|
attribute_presence(key)
|
39
|
-
elsif val
|
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(
|
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
|
-
|
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
|
-
|
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
|
-
"
|
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
|
-
|
93
|
+
'ancestor::*'
|
92
94
|
when :preceding
|
93
|
-
|
95
|
+
'preceding-sibling::*'
|
94
96
|
when :following
|
95
|
-
|
97
|
+
'following-sibling::*'
|
96
98
|
when :child
|
97
|
-
|
99
|
+
'child::*'
|
98
100
|
end
|
99
101
|
xpath
|
100
102
|
end
|
101
103
|
|
102
104
|
def build_class_match(value)
|
103
|
-
if value
|
105
|
+
if value =~ /^!/
|
104
106
|
klass = XpathSupport.escape " #{value[1..-1]} "
|
105
107
|
"not(contains(concat(' ', @class, ' '), #{klass}))"
|
106
108
|
else
|
@@ -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.
|
7
|
-
|
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.
|
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
|
-
[
|
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.
|
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
|
25
|
-
|
26
|
-
|
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
|
@@ -2,8 +2,9 @@ module Watir
|
|
2
2
|
module Locators
|
3
3
|
class TextField
|
4
4
|
class Validator < Element::Validator
|
5
|
-
def validate(element,
|
6
|
-
return unless element.tag_name.
|
5
|
+
def validate(element, _selector)
|
6
|
+
return unless element.tag_name.casecmp('input').zero?
|
7
|
+
|
7
8
|
element
|
8
9
|
end
|
9
10
|
end
|
data/lib/watir/logger.rb
CHANGED
@@ -27,7 +27,7 @@ module Watir
|
|
27
27
|
:fatal, :fatal?,
|
28
28
|
:level
|
29
29
|
|
30
|
-
def initialize(progname=
|
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? ?
|
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
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
106
|
-
|
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
|
data/lib/watir/radio_set.rb
CHANGED
@@ -4,14 +4,12 @@ module Watir
|
|
4
4
|
include Watir::Exception
|
5
5
|
include Enumerable
|
6
6
|
|
7
|
-
delegate [
|
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.
|
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
|
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
|
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
|
-
|
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
|
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
|
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.
|
209
|
+
return false unless other.is_a?(self.class)
|
210
|
+
|
212
211
|
radios == other.radios
|
213
212
|
end
|
214
|
-
|
213
|
+
alias eql? ==
|
215
214
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
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:
|
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
|