watir 7.2.0 → 7.2.1

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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/chrome.yml +1 -1
  3. data/.github/workflows/edge.yml +1 -1
  4. data/.github/workflows/firefox.yml +1 -1
  5. data/.github/workflows/ie.yml +1 -1
  6. data/.github/workflows/safari.yml +1 -1
  7. data/.github/workflows/unit.yml +1 -1
  8. data/.rubocop.yml +25 -12
  9. data/.rubocop_todo.yml +8 -1
  10. data/CHANGES.md +6 -1
  11. data/LICENSE +2 -2
  12. data/lib/watir/capabilities.rb +1 -1
  13. data/lib/watir/locators/anchor/selector_builder.rb +3 -0
  14. data/lib/watir/locators/element/matcher.rb +2 -1
  15. data/lib/watir/locators/element/selector_builder/regexp_disassembler.rb +2 -1
  16. data/lib/watir/locators/text_field/matcher.rb +0 -4
  17. data/lib/watir/version.rb +1 -1
  18. data/spec/locator_spec_helper.rb +0 -8
  19. data/spec/unit/capabilities_spec.rb +553 -561
  20. data/spec/unit/element_locator_spec.rb +89 -78
  21. data/spec/unit/match_elements/button_spec.rb +69 -62
  22. data/spec/unit/match_elements/element_spec.rb +303 -309
  23. data/spec/unit/match_elements/text_field_spec.rb +76 -73
  24. data/spec/unit/selector_builder/anchor_spec.rb +39 -33
  25. data/spec/unit/selector_builder/button_spec.rb +209 -202
  26. data/spec/unit/selector_builder/cell_spec.rb +48 -42
  27. data/spec/unit/selector_builder/element_spec.rb +634 -627
  28. data/spec/unit/selector_builder/row_spec.rb +119 -113
  29. data/spec/unit/selector_builder/text_field_spec.rb +195 -188
  30. data/spec/unit/selector_builder/textarea_spec.rb +22 -14
  31. data/spec/unit/wait_spec.rb +85 -81
  32. data/spec/watirspec/adjacent_spec.rb +249 -247
  33. data/spec/watirspec/after_hooks_spec.rb +161 -159
  34. data/spec/watirspec/alert_spec.rb +61 -58
  35. data/spec/watirspec/browser_spec.rb +409 -409
  36. data/spec/watirspec/capabilities_spec.rb +89 -99
  37. data/spec/watirspec/cookies_spec.rb +120 -118
  38. data/spec/watirspec/drag_and_drop_spec.rb +26 -24
  39. data/spec/watirspec/element_hidden_spec.rb +66 -60
  40. data/spec/watirspec/elements/area_spec.rb +49 -47
  41. data/spec/watirspec/elements/areas_spec.rb +27 -25
  42. data/spec/watirspec/elements/button_spec.rb +253 -251
  43. data/spec/watirspec/elements/buttons_spec.rb +36 -34
  44. data/spec/watirspec/elements/checkbox_spec.rb +48 -36
  45. data/spec/watirspec/elements/checkboxes_spec.rb +29 -27
  46. data/spec/watirspec/elements/collections_spec.rb +126 -119
  47. data/spec/watirspec/elements/date_field_spec.rb +185 -183
  48. data/spec/watirspec/elements/date_fields_spec.rb +29 -27
  49. data/spec/watirspec/elements/date_time_field_spec.rb +197 -195
  50. data/spec/watirspec/elements/date_time_fields_spec.rb +30 -28
  51. data/spec/watirspec/elements/dd_spec.rb +87 -85
  52. data/spec/watirspec/elements/dds_spec.rb +27 -25
  53. data/spec/watirspec/elements/del_spec.rb +106 -104
  54. data/spec/watirspec/elements/dels_spec.rb +26 -24
  55. data/spec/watirspec/elements/div_spec.rb +225 -221
  56. data/spec/watirspec/elements/divs_spec.rb +37 -35
  57. data/spec/watirspec/elements/dl_spec.rb +110 -108
  58. data/spec/watirspec/elements/dls_spec.rb +28 -26
  59. data/spec/watirspec/elements/dt_spec.rb +86 -84
  60. data/spec/watirspec/elements/dts_spec.rb +27 -25
  61. data/spec/watirspec/elements/element_spec.rb +794 -775
  62. data/spec/watirspec/elements/elements_spec.rb +40 -38
  63. data/spec/watirspec/elements/em_spec.rb +62 -60
  64. data/spec/watirspec/elements/ems_spec.rb +28 -26
  65. data/spec/watirspec/elements/filefield_spec.rb +116 -114
  66. data/spec/watirspec/elements/filefields_spec.rb +28 -26
  67. data/spec/watirspec/elements/font_spec.rb +20 -18
  68. data/spec/watirspec/elements/form_spec.rb +51 -49
  69. data/spec/watirspec/elements/forms_spec.rb +29 -27
  70. data/spec/watirspec/elements/frame_spec.rb +89 -87
  71. data/spec/watirspec/elements/frames_spec.rb +27 -25
  72. data/spec/watirspec/elements/hidden_spec.rb +81 -79
  73. data/spec/watirspec/elements/hiddens_spec.rb +28 -26
  74. data/spec/watirspec/elements/hn_spec.rb +59 -57
  75. data/spec/watirspec/elements/hns_spec.rb +26 -24
  76. data/spec/watirspec/elements/iframe_spec.rb +195 -191
  77. data/spec/watirspec/elements/iframes_spec.rb +31 -29
  78. data/spec/watirspec/elements/image_spec.rb +148 -146
  79. data/spec/watirspec/elements/images_spec.rb +26 -24
  80. data/spec/watirspec/elements/input_spec.rb +9 -7
  81. data/spec/watirspec/elements/ins_spec.rb +106 -104
  82. data/spec/watirspec/elements/inses_spec.rb +26 -24
  83. data/spec/watirspec/elements/label_spec.rb +56 -54
  84. data/spec/watirspec/elements/labels_spec.rb +26 -24
  85. data/spec/watirspec/elements/li_spec.rb +76 -74
  86. data/spec/watirspec/elements/link_spec.rb +173 -177
  87. data/spec/watirspec/elements/links_spec.rb +45 -43
  88. data/spec/watirspec/elements/lis_spec.rb +27 -25
  89. data/spec/watirspec/elements/list_spec.rb +44 -42
  90. data/spec/watirspec/elements/map_spec.rb +57 -55
  91. data/spec/watirspec/elements/maps_spec.rb +27 -25
  92. data/spec/watirspec/elements/meta_spec.rb +16 -14
  93. data/spec/watirspec/elements/metas_spec.rb +26 -24
  94. data/spec/watirspec/elements/ol_spec.rb +56 -65
  95. data/spec/watirspec/elements/ols_spec.rb +26 -24
  96. data/spec/watirspec/elements/option_spec.rb +91 -89
  97. data/spec/watirspec/elements/p_spec.rb +81 -79
  98. data/spec/watirspec/elements/pre_spec.rb +77 -75
  99. data/spec/watirspec/elements/pres_spec.rb +26 -24
  100. data/spec/watirspec/elements/ps_spec.rb +26 -24
  101. data/spec/watirspec/elements/radio_spec.rb +251 -249
  102. data/spec/watirspec/elements/radios_spec.rb +28 -26
  103. data/spec/watirspec/elements/select_list_spec.rb +537 -526
  104. data/spec/watirspec/elements/select_lists_spec.rb +32 -30
  105. data/spec/watirspec/elements/span_spec.rb +112 -110
  106. data/spec/watirspec/elements/spans_spec.rb +26 -24
  107. data/spec/watirspec/elements/strong_spec.rb +58 -58
  108. data/spec/watirspec/elements/strongs_spec.rb +28 -26
  109. data/spec/watirspec/elements/table_spec.rb +192 -139
  110. data/spec/watirspec/elements/tables_spec.rb +28 -26
  111. data/spec/watirspec/elements/tbody_spec.rb +74 -72
  112. data/spec/watirspec/elements/tbodys_spec.rb +40 -38
  113. data/spec/watirspec/elements/td_spec.rb +66 -64
  114. data/spec/watirspec/elements/tds_spec.rb +41 -39
  115. data/spec/watirspec/elements/text_field_spec.rb +206 -204
  116. data/spec/watirspec/elements/text_fields_spec.rb +30 -28
  117. data/spec/watirspec/elements/textarea_spec.rb +20 -18
  118. data/spec/watirspec/elements/textareas_spec.rb +18 -16
  119. data/spec/watirspec/elements/tfoot_spec.rb +65 -63
  120. data/spec/watirspec/elements/tfoots_spec.rb +42 -40
  121. data/spec/watirspec/elements/thead_spec.rb +65 -63
  122. data/spec/watirspec/elements/theads_spec.rb +42 -40
  123. data/spec/watirspec/elements/tr_spec.rb +48 -46
  124. data/spec/watirspec/elements/trs_spec.rb +42 -40
  125. data/spec/watirspec/elements/ul_spec.rb +56 -54
  126. data/spec/watirspec/elements/uls_spec.rb +26 -24
  127. data/spec/watirspec/radio_set_spec.rb +269 -267
  128. data/spec/watirspec/screenshot_spec.rb +20 -18
  129. data/spec/watirspec/scroll_spec.rb +152 -148
  130. data/spec/watirspec/shadow_root_spec.rb +86 -83
  131. data/spec/watirspec/user_editable_spec.rb +200 -198
  132. data/spec/watirspec/wait_spec.rb +289 -295
  133. data/spec/watirspec/window_switching_spec.rb +422 -434
  134. data/spec/watirspec_helper.rb +1 -23
  135. data/watir.gemspec +5 -4
  136. metadata +44 -33
  137. data/spec/watirspec/attributes_spec.rb +0 -18
  138. data/spec/watirspec/elements/table_nesting_spec.rb +0 -51
  139. data/spec/watirspec/special_chars_spec.rb +0 -23
@@ -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