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