watir 7.2.0 → 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.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/chrome.yml +9 -1
  3. data/.github/workflows/edge.yml +10 -2
  4. data/.github/workflows/firefox.yml +10 -2
  5. data/.github/workflows/ie.yml +1 -1
  6. data/.github/workflows/safari.yml +1 -1
  7. data/.github/workflows/unit.yml +3 -3
  8. data/.rubocop.yml +36 -14
  9. data/.rubocop_todo.yml +8 -1
  10. data/CHANGES.md +17 -1
  11. data/LICENSE +2 -2
  12. data/lib/watir/capabilities.rb +2 -12
  13. data/lib/watir/cookies.rb +7 -2
  14. data/lib/watir/elements/date_field.rb +2 -2
  15. data/lib/watir/elements/date_time_field.rb +2 -2
  16. data/lib/watir/elements/select.rb +3 -3
  17. data/lib/watir/locators/anchor/selector_builder.rb +3 -0
  18. data/lib/watir/locators/element/matcher.rb +2 -1
  19. data/lib/watir/locators/element/selector_builder/regexp_disassembler.rb +2 -1
  20. data/lib/watir/locators/element/selector_builder.rb +1 -1
  21. data/lib/watir/locators/text_field/matcher.rb +1 -5
  22. data/lib/watir/version.rb +1 -1
  23. data/lib/watir.rb +1 -0
  24. data/lib/watirspec/implementation.rb +1 -1
  25. data/lib/watirspec.rb +1 -1
  26. data/spec/locator_spec_helper.rb +3 -15
  27. data/spec/unit/capabilities_spec.rb +552 -561
  28. data/spec/unit/element_locator_spec.rb +89 -78
  29. data/spec/unit/match_elements/button_spec.rb +69 -62
  30. data/spec/unit/match_elements/element_spec.rb +303 -309
  31. data/spec/unit/match_elements/text_field_spec.rb +76 -73
  32. data/spec/unit/selector_builder/anchor_spec.rb +39 -33
  33. data/spec/unit/selector_builder/button_spec.rb +209 -202
  34. data/spec/unit/selector_builder/cell_spec.rb +48 -42
  35. data/spec/unit/selector_builder/element_spec.rb +632 -627
  36. data/spec/unit/selector_builder/row_spec.rb +119 -113
  37. data/spec/unit/selector_builder/text_field_spec.rb +195 -188
  38. data/spec/unit/selector_builder/textarea_spec.rb +22 -14
  39. data/spec/unit/wait_spec.rb +85 -81
  40. data/spec/watirspec/adjacent_spec.rb +249 -247
  41. data/spec/watirspec/after_hooks_spec.rb +161 -159
  42. data/spec/watirspec/alert_spec.rb +61 -58
  43. data/spec/watirspec/browser_spec.rb +411 -409
  44. data/spec/watirspec/capabilities_spec.rb +99 -112
  45. data/spec/watirspec/cookies_spec.rb +144 -115
  46. data/spec/watirspec/drag_and_drop_spec.rb +26 -24
  47. data/spec/watirspec/element_hidden_spec.rb +66 -60
  48. data/spec/watirspec/elements/area_spec.rb +49 -47
  49. data/spec/watirspec/elements/areas_spec.rb +27 -25
  50. data/spec/watirspec/elements/button_spec.rb +253 -251
  51. data/spec/watirspec/elements/buttons_spec.rb +36 -34
  52. data/spec/watirspec/elements/checkbox_spec.rb +48 -36
  53. data/spec/watirspec/elements/checkboxes_spec.rb +29 -27
  54. data/spec/watirspec/elements/collections_spec.rb +126 -119
  55. data/spec/watirspec/elements/date_field_spec.rb +202 -183
  56. data/spec/watirspec/elements/date_fields_spec.rb +29 -27
  57. data/spec/watirspec/elements/date_time_field_spec.rb +216 -195
  58. data/spec/watirspec/elements/date_time_fields_spec.rb +30 -28
  59. data/spec/watirspec/elements/dd_spec.rb +87 -85
  60. data/spec/watirspec/elements/dds_spec.rb +27 -25
  61. data/spec/watirspec/elements/del_spec.rb +106 -104
  62. data/spec/watirspec/elements/dels_spec.rb +26 -24
  63. data/spec/watirspec/elements/div_spec.rb +225 -221
  64. data/spec/watirspec/elements/divs_spec.rb +37 -35
  65. data/spec/watirspec/elements/dl_spec.rb +110 -108
  66. data/spec/watirspec/elements/dls_spec.rb +28 -26
  67. data/spec/watirspec/elements/dt_spec.rb +86 -84
  68. data/spec/watirspec/elements/dts_spec.rb +27 -25
  69. data/spec/watirspec/elements/element_spec.rb +794 -775
  70. data/spec/watirspec/elements/elements_spec.rb +40 -38
  71. data/spec/watirspec/elements/em_spec.rb +62 -60
  72. data/spec/watirspec/elements/ems_spec.rb +28 -26
  73. data/spec/watirspec/elements/filefield_spec.rb +116 -114
  74. data/spec/watirspec/elements/filefields_spec.rb +28 -26
  75. data/spec/watirspec/elements/font_spec.rb +20 -18
  76. data/spec/watirspec/elements/form_spec.rb +51 -49
  77. data/spec/watirspec/elements/forms_spec.rb +29 -27
  78. data/spec/watirspec/elements/frame_spec.rb +89 -87
  79. data/spec/watirspec/elements/frames_spec.rb +27 -25
  80. data/spec/watirspec/elements/hidden_spec.rb +81 -79
  81. data/spec/watirspec/elements/hiddens_spec.rb +28 -26
  82. data/spec/watirspec/elements/hn_spec.rb +59 -57
  83. data/spec/watirspec/elements/hns_spec.rb +26 -24
  84. data/spec/watirspec/elements/iframe_spec.rb +195 -191
  85. data/spec/watirspec/elements/iframes_spec.rb +31 -29
  86. data/spec/watirspec/elements/image_spec.rb +148 -146
  87. data/spec/watirspec/elements/images_spec.rb +26 -24
  88. data/spec/watirspec/elements/input_spec.rb +9 -7
  89. data/spec/watirspec/elements/ins_spec.rb +106 -104
  90. data/spec/watirspec/elements/inses_spec.rb +26 -24
  91. data/spec/watirspec/elements/label_spec.rb +56 -54
  92. data/spec/watirspec/elements/labels_spec.rb +26 -24
  93. data/spec/watirspec/elements/li_spec.rb +76 -74
  94. data/spec/watirspec/elements/link_spec.rb +173 -177
  95. data/spec/watirspec/elements/links_spec.rb +45 -43
  96. data/spec/watirspec/elements/lis_spec.rb +27 -25
  97. data/spec/watirspec/elements/list_spec.rb +44 -42
  98. data/spec/watirspec/elements/map_spec.rb +57 -55
  99. data/spec/watirspec/elements/maps_spec.rb +27 -25
  100. data/spec/watirspec/elements/meta_spec.rb +16 -14
  101. data/spec/watirspec/elements/metas_spec.rb +26 -24
  102. data/spec/watirspec/elements/ol_spec.rb +56 -65
  103. data/spec/watirspec/elements/ols_spec.rb +26 -24
  104. data/spec/watirspec/elements/option_spec.rb +91 -89
  105. data/spec/watirspec/elements/p_spec.rb +81 -79
  106. data/spec/watirspec/elements/pre_spec.rb +77 -75
  107. data/spec/watirspec/elements/pres_spec.rb +26 -24
  108. data/spec/watirspec/elements/ps_spec.rb +26 -24
  109. data/spec/watirspec/elements/radio_spec.rb +251 -249
  110. data/spec/watirspec/elements/radios_spec.rb +28 -26
  111. data/spec/watirspec/elements/select_list_spec.rb +537 -526
  112. data/spec/watirspec/elements/select_lists_spec.rb +32 -30
  113. data/spec/watirspec/elements/span_spec.rb +112 -110
  114. data/spec/watirspec/elements/spans_spec.rb +26 -24
  115. data/spec/watirspec/elements/strong_spec.rb +58 -58
  116. data/spec/watirspec/elements/strongs_spec.rb +28 -26
  117. data/spec/watirspec/elements/table_spec.rb +192 -139
  118. data/spec/watirspec/elements/tables_spec.rb +28 -26
  119. data/spec/watirspec/elements/tbody_spec.rb +74 -72
  120. data/spec/watirspec/elements/tbodys_spec.rb +40 -38
  121. data/spec/watirspec/elements/td_spec.rb +66 -64
  122. data/spec/watirspec/elements/tds_spec.rb +41 -39
  123. data/spec/watirspec/elements/text_field_spec.rb +206 -204
  124. data/spec/watirspec/elements/text_fields_spec.rb +30 -28
  125. data/spec/watirspec/elements/textarea_spec.rb +20 -18
  126. data/spec/watirspec/elements/textareas_spec.rb +18 -16
  127. data/spec/watirspec/elements/tfoot_spec.rb +65 -63
  128. data/spec/watirspec/elements/tfoots_spec.rb +42 -40
  129. data/spec/watirspec/elements/thead_spec.rb +65 -63
  130. data/spec/watirspec/elements/theads_spec.rb +42 -40
  131. data/spec/watirspec/elements/tr_spec.rb +48 -46
  132. data/spec/watirspec/elements/trs_spec.rb +42 -40
  133. data/spec/watirspec/elements/ul_spec.rb +56 -54
  134. data/spec/watirspec/elements/uls_spec.rb +26 -24
  135. data/spec/watirspec/radio_set_spec.rb +269 -267
  136. data/spec/watirspec/screenshot_spec.rb +20 -18
  137. data/spec/watirspec/scroll_spec.rb +152 -148
  138. data/spec/watirspec/shadow_root_spec.rb +88 -83
  139. data/spec/watirspec/support/rspec_matchers.rb +34 -25
  140. data/spec/watirspec/user_editable_spec.rb +200 -198
  141. data/spec/watirspec/wait_spec.rb +289 -295
  142. data/spec/watirspec/window_switching_spec.rb +423 -434
  143. data/spec/watirspec_helper.rb +1 -23
  144. data/watir.gemspec +6 -5
  145. metadata +47 -37
  146. data/spec/watirspec/attributes_spec.rb +0 -18
  147. data/spec/watirspec/elements/table_nesting_spec.rb +0 -51
  148. data/spec/watirspec/special_chars_spec.rb +0 -23
  149. data/support/travis.sh +0 -15
@@ -2,85 +2,96 @@
2
2
 
3
3
  require_relative 'unit_helper'
4
4
 
5
- describe Watir::Locators::Element::Locator do
6
- include LocatorSpecHelper
7
-
8
- describe '#locate' do
9
- context 'when XPath can be built to represent entire selector' do
10
- it 'locates without using match' do
11
- @locator = {xpath: './/div'}
12
-
13
- expect_one(*@locator.to_a.flatten).and_return(el)
14
- expect(element_matcher).not_to receive(:match)
15
-
16
- expect(locate_one).to eq el
17
- end
18
-
19
- it 'returns nil if not found' do
20
- @locator = {xpath: './/div'}
21
-
22
- expect_one(*@locator.to_a.flatten).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
23
- expect(locate_one).to eq nil
24
- end
25
- end
26
-
27
- context 'when SelectorBuilder result has additional locators to match' do
28
- it 'locates using match' do
29
- @locator = {xpath: './/div', id: 'foo'}
30
-
31
- expect_all(*@locator.to_a.first.flatten).and_return([el])
32
- expect(element_matcher).to receive(:match).and_return(el)
33
-
34
- expect(locate_one).to eq el
35
- end
36
-
37
- it 'relocates if element goes stale' do
38
- @locator = {xpath: './/div', id: 'foo'}
39
-
40
- expect_all(*@locator.to_a.first.flatten).exactly(2).times.and_return([el])
41
- stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
42
- expect(element_matcher).to receive(:match).and_raise(stale_exception)
43
- expect(element_matcher).to receive(:match).and_return(el)
44
-
45
- expect(locate_one).to eq el
5
+ module Watir
6
+ module Locators
7
+ class Element
8
+ describe Locator do
9
+ include LocatorSpecHelper
10
+
11
+ describe '#locate' do
12
+ context 'when XPath can be built to represent entire selector' do
13
+ it 'locates without using match' do
14
+ @locator = {xpath: './/div'}
15
+
16
+ allow(driver).to receive(:find_element).and_return(el)
17
+ allow(element_matcher).to receive(:match)
18
+
19
+ expect(locate_one).to eq el
20
+ expect(element_matcher).not_to have_received(:match)
21
+ end
22
+
23
+ it 'returns nil if not found' do
24
+ @locator = {xpath: './/div'}
25
+
26
+ allow(driver).to receive(:find_element).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
27
+ expect(locate_one).to be_nil
28
+ end
29
+ end
30
+
31
+ context 'when SelectorBuilder result has additional locators to match' do
32
+ it 'locates using match' do
33
+ @locator = {xpath: './/div', id: 'foo'}
34
+
35
+ allow(driver).to receive(:find_elements).and_return([el])
36
+ allow(element_matcher).to receive(:match).and_return(el)
37
+
38
+ expect(locate_one).to eq el
39
+ expect(element_matcher).to have_received(:match).once
40
+ end
41
+
42
+ it 'relocates if element goes stale' do
43
+ @locator = {xpath: './/div', id: 'foo'}
44
+
45
+ allow(driver).to receive(:find_elements).and_return([el])
46
+ stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
47
+ allow(element_matcher).to receive(:match).and_invoke(proc { raise stale_exception }, proc { el })
48
+
49
+ expect(locate_one).to eq el
50
+ expect(element_matcher).to have_received(:match).exactly(2).times
51
+ end
52
+
53
+ it 'Raises Exception if element continues to go stale' do
54
+ @locator = {xpath: './/div', id: 'foo'}
55
+
56
+ allow(driver).to receive(:find_elements).and_return([el])
57
+ stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
58
+ allow(element_matcher).to receive(:match).and_raise(stale_exception)
59
+
60
+ msg = 'Unable to locate element from {:xpath=>".//div", :id=>"foo"} due to changing page'
61
+ expect { locate_one }.to raise_exception Watir::Exception::LocatorException, msg
62
+ expect(element_matcher).to have_received(:match).exactly(3).times
63
+ end
64
+ end
65
+ end
66
+
67
+ describe '#locate_all' do
68
+ it 'locates using match' do
69
+ @locator = {xpath: './/div', id: 'foo'}
70
+
71
+ allow(driver).to receive(:find_elements).and_return([el])
72
+ allow(element_matcher).to receive(:match).and_return([el])
73
+
74
+ expect(locate_all).to eq [el]
75
+ expect(element_matcher).to have_received(:match).once
76
+ end
77
+
78
+ it 'raises LocatorException if element continues to go stale' do
79
+ @locator = {xpath: './/div', id: 'foo'}
80
+
81
+ allow(driver).to receive(:find_elements).and_return([el])
82
+ stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
83
+ allow(element_matcher).to receive(:match).and_raise(stale_exception)
84
+
85
+ msg = 'Unable to locate element collection from {:xpath=>".//div", :id=>"foo"} due to changing page'
86
+ expect { locate_all }.to raise_exception Watir::Exception::LocatorException, msg
87
+ expect(element_matcher).to have_received(:match).exactly(3).times
88
+ end
89
+
90
+ it 'raises Argument error if using index key' do
91
+ expect { locate_all(index: 2) }.to raise_exception(ArgumentError, "can't locate all elements by :index")
92
+ end
93
+ end
46
94
  end
47
-
48
- it 'Raises Exception if element continues to go stale' do
49
- @locator = {xpath: './/div', id: 'foo'}
50
-
51
- expect_all(*@locator.to_a.first.flatten).exactly(3).times.and_return([el])
52
- stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
53
- expect(element_matcher).to receive(:match).and_raise(stale_exception).exactly(3).times
54
-
55
- msg = 'Unable to locate element from {:xpath=>".//div", :id=>"foo"} due to changing page'
56
- expect { locate_one }.to raise_exception Watir::Exception::LocatorException, msg
57
- end
58
- end
59
- end
60
-
61
- describe '#locate_all' do
62
- it 'locates using match' do
63
- @locator = {xpath: './/div', id: 'foo'}
64
-
65
- expect_all(*@locator.to_a.first.flatten).and_return([el])
66
- expect(element_matcher).to receive(:match).and_return([el])
67
-
68
- expect(locate_all).to eq [el]
69
- end
70
-
71
- it 'raises LocatorException if element continues to go stale' do
72
- @locator = {xpath: './/div', id: 'foo'}
73
-
74
- expect_all(*@locator.to_a.first.flatten).exactly(3).times.and_return([el])
75
- stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
76
- expect(element_matcher).to receive(:match).and_raise(stale_exception).exactly(3).times
77
-
78
- msg = 'Unable to locate element collection from {:xpath=>".//div", :id=>"foo"} due to changing page'
79
- expect { locate_all }.to raise_exception Watir::Exception::LocatorException, msg
80
- end
81
-
82
- it 'raises Argument error if using index key' do
83
- expect { locate_all(index: 2) }.to raise_exception(ArgumentError, "can't locate all elements by :index")
84
95
  end
85
96
  end
86
97
  end
@@ -2,68 +2,75 @@
2
2
 
3
3
  require_relative '../unit_helper'
4
4
 
5
- describe Watir::Locators::Button::Matcher do
6
- include LocatorSpecHelper
7
-
8
- let(:query_scope) { @query_scope || double(Watir::Browser) }
9
- let(:matcher) { described_class.new(query_scope, @selector) }
10
-
11
- describe '#match' do
12
- it 'value attribute matches value' do
13
- elements = [wd_element(text: 'foo', attributes: {value: 'foo'}),
14
- wd_element(text: 'bar', attributes: {value: 'bar'}),
15
- wd_element(text: '', attributes: {value: 'foobar'})]
16
- values_to_match = {value: 'foobar'}
17
-
18
- expect(matcher.match(elements, values_to_match, :all)).to eq [elements[2]]
19
- end
20
-
21
- it 'returns empty array if neither value nor text match' do
22
- elements = [wd_element(text: 'foo', attributes: {value: 'foo'}),
23
- wd_element(text: 'bar', attributes: {value: 'bar'}),
24
- wd_element(text: '', attributes: {value: 'foobar'})]
25
- values_to_match = {value: 'nope'}
26
-
27
- expect(matcher.match(elements, values_to_match, :all)).to eq []
28
- end
29
-
30
- it 'does not evaluate other parameters if value locator is not satisfied' do
31
- elements = [wd_element(text: 'foo', attributes: {value: 'foo'}),
32
- wd_element(text: 'bar', attributes: {value: 'bar'}),
33
- wd_element(text: '', attributes: {value: 'foobar'})]
34
- values_to_match = {value: 'nope', visible: true}
35
- [0..2].each { |idx| expect(elements[idx]).not_to receive(:displayed?) }
36
-
37
- expect(matcher.match(elements, values_to_match, :all)).to eq []
38
- end
39
-
40
- it 'does not calculate value if not passed in' do
41
- elements = [wd_element(displayed?: true, text: 'foo', attributes: {value: 'foo'}),
42
- wd_element(displayed?: true, text: 'bar', attributes: {value: 'bar'})]
43
- values_to_match = {visible: false}
44
-
45
- expect(elements[0]).not_to receive(:text)
46
- expect(elements[0]).not_to receive(:text)
47
- expect(elements[1]).not_to receive(:attribute)
48
- expect(elements[1]).not_to receive(:attribute)
49
-
50
- expect(matcher.match(elements, values_to_match, :all)).to eq []
51
- end
52
-
53
- it 'returns empty array if element is not an input or button element' do
54
- elements = [wd_element(tag_name: 'wrong', text: 'foob', attributes: {value: 'foo'}),
55
- wd_element(tag_name: 'wrong', text: 'bar', attributes: {value: 'bar'})]
56
- values_to_match = {tag_name: 'button', value: 'foo'}
57
-
58
- expect(matcher.match(elements, values_to_match, :all)).to eq []
59
- end
60
-
61
- it 'returns empty array if element is an input element with wrong type' do
62
- elements = [wd_element(tag_name: 'input', text: 'foob', attributes: {value: 'foo', type: 'radio'}),
63
- wd_element(tag_name: 'input', text: 'bar', attributes: {value: 'bar', type: 'radio'})]
64
- values_to_match = {tag_name: 'button', value: 'foo'}
65
-
66
- expect(matcher.match(elements, values_to_match, :all)).to eq []
5
+ module Watir
6
+ module Locators
7
+ class Button
8
+ describe Matcher do
9
+ include LocatorSpecHelper
10
+
11
+ let(:query_scope) { @query_scope || instance_double(Watir::Browser) }
12
+ let(:matcher) { described_class.new(query_scope, @selector) }
13
+
14
+ describe '#match' do
15
+ it 'value attribute matches value' do
16
+ elements = [wd_element(text: 'foo', attributes: {value: 'foo'}),
17
+ wd_element(text: 'bar', attributes: {value: 'bar'}),
18
+ wd_element(text: '', attributes: {value: 'foobar'})]
19
+ values_to_match = {value: 'foobar'}
20
+
21
+ expect(matcher.match(elements, values_to_match, :all)).to eq [elements[2]]
22
+ end
23
+
24
+ it 'returns empty array if neither value nor text match' do
25
+ elements = [wd_element(text: 'foo', attributes: {value: 'foo'}),
26
+ wd_element(text: 'bar', attributes: {value: 'bar'}),
27
+ wd_element(text: '', attributes: {value: 'foobar'})]
28
+ values_to_match = {value: 'nope'}
29
+
30
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
31
+ end
32
+
33
+ it 'does not evaluate other parameters if value locator is not satisfied' do
34
+ elements = [wd_element(text: 'foo', attributes: {value: 'foo'}, displayed?: nil),
35
+ wd_element(text: 'bar', attributes: {value: 'bar'}, displayed?: nil),
36
+ wd_element(text: '', attributes: {value: 'foobar'}, displayed?: nil)]
37
+
38
+ values_to_match = {value: 'nope', visible: true}
39
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
40
+ expect(elements[0]).not_to have_received(:displayed?)
41
+ expect(elements[1]).not_to have_received(:displayed?)
42
+ expect(elements[2]).not_to have_received(:displayed?)
43
+ end
44
+
45
+ it 'does not calculate value if not passed in' do
46
+ elements = [wd_element(displayed?: true, text: 'foo', attributes: {value: 'foo'}),
47
+ wd_element(displayed?: true, text: 'bar', attributes: {value: 'bar'})]
48
+ values_to_match = {visible: false}
49
+
50
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
51
+ expect(elements[0]).not_to have_received(:text)
52
+ expect(elements[0]).not_to have_received(:text)
53
+ expect(elements[1]).not_to have_received(:attribute)
54
+ expect(elements[1]).not_to have_received(:attribute)
55
+ end
56
+
57
+ it 'returns empty array if element is not an input or button element' do
58
+ elements = [wd_element(tag_name: 'wrong', text: 'foob', attributes: {value: 'foo'}),
59
+ wd_element(tag_name: 'wrong', text: 'bar', attributes: {value: 'bar'})]
60
+ values_to_match = {tag_name: 'button', value: 'foo'}
61
+
62
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
63
+ end
64
+
65
+ it 'returns empty array if element is an input element with wrong type' do
66
+ elements = [wd_element(tag_name: 'input', text: 'foob', attributes: {value: 'foo', type: 'radio'}),
67
+ wd_element(tag_name: 'input', text: 'bar', attributes: {value: 'bar', type: 'radio'})]
68
+ values_to_match = {tag_name: 'button', value: 'foo'}
69
+
70
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
71
+ end
72
+ end
73
+ end
67
74
  end
68
75
  end
69
76
  end