watir-webdriver 0.7.0 → 0.8.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.
- checksums.yaml +4 -4
- data/.gitignore +3 -2
- data/.travis.yml +2 -3
- data/CHANGES.md +10 -1
- data/Gemfile +1 -1
- data/README.md +22 -17
- data/Rakefile +55 -52
- data/lib/watir-webdriver.rb +3 -2
- data/lib/watir-webdriver/alert.rb +0 -1
- data/lib/watir-webdriver/atoms/README +1 -1
- data/lib/watir-webdriver/browser.rb +4 -5
- data/lib/watir-webdriver/cell_container.rb +2 -2
- data/lib/watir-webdriver/container.rb +2 -3
- data/lib/watir-webdriver/cookies.rb +8 -8
- data/lib/watir-webdriver/element_collection.rb +3 -4
- data/lib/watir-webdriver/elements/area.rb +0 -1
- data/lib/watir-webdriver/elements/button.rb +0 -1
- data/lib/watir-webdriver/elements/checkbox.rb +2 -4
- data/lib/watir-webdriver/elements/element.rb +69 -45
- data/lib/watir-webdriver/elements/file_field.rb +2 -3
- data/lib/watir-webdriver/elements/font.rb +2 -2
- data/lib/watir-webdriver/elements/form.rb +0 -1
- data/lib/watir-webdriver/elements/hidden.rb +2 -3
- data/lib/watir-webdriver/elements/html_elements.rb +2282 -0
- data/lib/watir-webdriver/elements/iframe.rb +6 -7
- data/lib/watir-webdriver/elements/image.rb +0 -1
- data/lib/watir-webdriver/elements/input.rb +0 -1
- data/lib/watir-webdriver/elements/link.rb +0 -1
- data/lib/watir-webdriver/elements/option.rb +3 -4
- data/lib/watir-webdriver/elements/radio.rb +2 -3
- data/lib/watir-webdriver/elements/select.rb +0 -1
- data/lib/watir-webdriver/elements/svg_elements.rb +787 -0
- data/lib/watir-webdriver/elements/table.rb +0 -2
- data/lib/watir-webdriver/elements/table_section.rb +1 -1
- data/lib/watir-webdriver/elements/text_field.rb +2 -3
- data/lib/watir-webdriver/exception.rb +0 -2
- data/lib/watir-webdriver/extensions/nokogiri.rb +1 -1
- data/lib/watir-webdriver/generator.rb +3 -0
- data/lib/watir-webdriver/generator/base.rb +11 -0
- data/lib/watir-webdriver/{html → generator/base}/generator.rb +23 -33
- data/lib/watir-webdriver/{html → generator/base}/idl_sorter.rb +3 -5
- data/lib/watir-webdriver/{html → generator/base}/spec_extractor.rb +15 -41
- data/lib/watir-webdriver/generator/base/util.rb +21 -0
- data/lib/watir-webdriver/{html → generator/base}/visitor.rb +15 -15
- data/lib/watir-webdriver/{html.rb → generator/html.rb} +3 -11
- data/lib/watir-webdriver/generator/html/generator.rb +36 -0
- data/lib/watir-webdriver/generator/html/spec_extractor.rb +50 -0
- data/lib/watir-webdriver/generator/html/visitor.rb +21 -0
- data/lib/watir-webdriver/generator/svg.rb +7 -0
- data/lib/watir-webdriver/generator/svg/generator.rb +38 -0
- data/lib/watir-webdriver/generator/svg/spec_extractor.rb +46 -0
- data/lib/watir-webdriver/generator/svg/visitor.rb +21 -0
- data/lib/watir-webdriver/has_window.rb +3 -3
- data/lib/watir-webdriver/locators/button_locator.rb +7 -2
- data/lib/watir-webdriver/locators/child_cell_locator.rb +1 -1
- data/lib/watir-webdriver/locators/child_row_locator.rb +1 -1
- data/lib/watir-webdriver/locators/element_locator.rb +44 -9
- data/lib/watir-webdriver/locators/text_area_locator.rb +4 -0
- data/lib/watir-webdriver/locators/text_field_locator.rb +7 -2
- data/lib/watir-webdriver/screenshot.rb +0 -1
- data/lib/watir-webdriver/version.rb +1 -1
- data/lib/watir-webdriver/wait.rb +10 -11
- data/lib/watir-webdriver/window.rb +5 -5
- data/lib/watir-webdriver/xpath_support.rb +0 -1
- data/spec/always_locate_spec.rb +4 -4
- data/spec/browser_spec.rb +3 -3
- data/spec/click_spec.rb +11 -4
- data/spec/container_spec.rb +2 -2
- data/spec/element_locator_spec.rb +145 -84
- data/spec/element_spec.rb +29 -16
- data/spec/html/clicks.html +3 -0
- data/spec/html/removed_element.html +7 -0
- data/spec/implementation.rb +5 -5
- data/spec/input_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -2
- data/spec/special_chars_spec.rb +2 -2
- data/support/doctest_helper.rb +4 -4
- data/support/version_differ.rb +2 -2
- data/watir-webdriver.gemspec +3 -3
- metadata +27 -17
- data/lib/watir-webdriver/elements/generated.rb +0 -3106
- data/lib/watir-webdriver/html/util.rb +0 -22
@@ -8,7 +8,7 @@ module Watir
|
|
8
8
|
|
9
9
|
if selector.empty?
|
10
10
|
@handle = current_window
|
11
|
-
elsif selector.
|
11
|
+
elsif selector.key? :handle
|
12
12
|
@handle = selector.delete :handle
|
13
13
|
else
|
14
14
|
unless selector.keys.all? { |k| [:title, :url, :index].include? k }
|
@@ -116,7 +116,7 @@ module Watir
|
|
116
116
|
# Returns true if two windows are equal.
|
117
117
|
#
|
118
118
|
# @example
|
119
|
-
# browser.window(:
|
119
|
+
# browser.window(index: 0) == browser.window(index: 1)
|
120
120
|
# #=> false
|
121
121
|
#
|
122
122
|
# @param [Window] other
|
@@ -183,8 +183,8 @@ module Watir
|
|
183
183
|
# Switches to given window and executes block, then switches back.
|
184
184
|
#
|
185
185
|
# @example
|
186
|
-
# browser.window(:
|
187
|
-
# browser.a(:
|
186
|
+
# browser.window(title: "closeable window").use do
|
187
|
+
# browser.a(id: "close").click
|
188
188
|
# end
|
189
189
|
#
|
190
190
|
|
@@ -210,7 +210,7 @@ module Watir
|
|
210
210
|
def locate
|
211
211
|
if @selector.empty?
|
212
212
|
nil
|
213
|
-
elsif @selector.
|
213
|
+
elsif @selector.key?(:index)
|
214
214
|
@driver.window_handles[Integer(@selector[:index])]
|
215
215
|
else
|
216
216
|
@driver.window_handles.find { |wh| matches?(wh) }
|
data/spec/always_locate_spec.rb
CHANGED
@@ -4,11 +4,11 @@ describe 'Watir' do
|
|
4
4
|
describe '#always_locate?' do
|
5
5
|
|
6
6
|
before do
|
7
|
-
browser.goto WatirSpec.url_for('removed_element.html', :
|
7
|
+
browser.goto WatirSpec.url_for('removed_element.html', needs_server: true)
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'determines whether #exist? returns false for stale element' do
|
11
|
-
element = browser.div(:
|
11
|
+
element = browser.div(id: "text")
|
12
12
|
expect(element.exists?).to be true
|
13
13
|
|
14
14
|
browser.refresh
|
@@ -17,7 +17,7 @@ describe 'Watir' do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'allows using cached elements regardless of setting, when element is not stale' do
|
20
|
-
element = browser.div(:
|
20
|
+
element = browser.div(id: "text")
|
21
21
|
expect(element.exists?).to be true
|
22
22
|
|
23
23
|
# exception raised if element is re-looked up
|
@@ -27,7 +27,7 @@ describe 'Watir' do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'determines whether an exception is raised when taking an action on a stale element' do
|
30
|
-
element = browser.div(:
|
30
|
+
element = browser.div(id: "text")
|
31
31
|
expect(element.exists?).to be true
|
32
32
|
|
33
33
|
browser.refresh
|
data/spec/browser_spec.rb
CHANGED
@@ -51,12 +51,12 @@ describe Watir::Browser do
|
|
51
51
|
browser.goto WatirSpec.url_for "forms_with_input_elements.html"
|
52
52
|
|
53
53
|
browser.send_keys "hello"
|
54
|
-
expect(browser.text_field(:
|
54
|
+
expect(browser.text_field(id: "new_user_first_name").value).to eq "hello"
|
55
55
|
end
|
56
56
|
|
57
57
|
it "sends keys to a frame" do
|
58
58
|
browser.goto WatirSpec.url_for "frames.html"
|
59
|
-
tf = browser.frame.text_field(:
|
59
|
+
tf = browser.frame.text_field(id: "senderElement")
|
60
60
|
tf.clear
|
61
61
|
|
62
62
|
browser.frame.send_keys "hello"
|
@@ -70,7 +70,7 @@ describe Watir::Browser do
|
|
70
70
|
b.goto WatirSpec.url_for "definition_lists.html"
|
71
71
|
b.close
|
72
72
|
|
73
|
-
expect { b.dl(:
|
73
|
+
expect { b.dl(id: "experience-list").id }.to raise_error(Watir::Exception::Error, "browser was closed")
|
74
74
|
end
|
75
75
|
|
76
76
|
describe "#wait_while" do
|
data/spec/click_spec.rb
CHANGED
@@ -3,14 +3,21 @@ require File.expand_path('../watirspec/spec_helper', __FILE__)
|
|
3
3
|
describe Watir::Element do
|
4
4
|
describe "#click" do
|
5
5
|
before {
|
6
|
-
browser.goto WatirSpec.url_for('clicks.html', :
|
6
|
+
browser.goto WatirSpec.url_for('clicks.html', needs_server: true)
|
7
7
|
}
|
8
8
|
|
9
|
-
let(:clicker) { browser.element(:
|
10
|
-
let(:log) { browser.element(:
|
9
|
+
let(:clicker) { browser.element(id: "click-logger") }
|
10
|
+
let(:log) { browser.element(id: "log").ps.map { |e| e.text } }
|
11
|
+
|
12
|
+
bug "https://github.com/watir/watir-webdriver/issues/343", :webdriver do
|
13
|
+
it "clicks an element with text in nested text node using text selector" do
|
14
|
+
browser.element(text: "Can You Click This?").click
|
15
|
+
expect(browser.element(text: "You Clicked It!")).to exist
|
16
|
+
end
|
17
|
+
end
|
11
18
|
|
12
19
|
# TODO: make guards more flexible, in reality this currently only works on linux with native events
|
13
|
-
compliant_on
|
20
|
+
compliant_on %i(webdriver firefox native_events) do
|
14
21
|
it "should perform a click with no modifier keys" do
|
15
22
|
clicker.click
|
16
23
|
expect(log).to eq ["shift=false alt=false"]
|
data/spec/container_spec.rb
CHANGED
@@ -11,11 +11,11 @@ describe Watir::Container do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it "converts 2-arg selector into a hash" do
|
14
|
-
expect(@container.public_extract_selector([:how, 'what'])).to eq Hash[:
|
14
|
+
expect(@container.public_extract_selector([:how, 'what'])).to eq Hash[how: 'what']
|
15
15
|
end
|
16
16
|
|
17
17
|
it "returns the hash given" do
|
18
|
-
expect(@container.public_extract_selector([:
|
18
|
+
expect(@container.public_extract_selector([how: "what"])).to eq Hash[how: "what"]
|
19
19
|
end
|
20
20
|
|
21
21
|
it "returns an empty hash if given no args" do
|
@@ -7,7 +7,7 @@ describe Watir::ElementLocator do
|
|
7
7
|
describe "by delegating to webdriver" do
|
8
8
|
WEBDRIVER_SELECTORS.each do |loc|
|
9
9
|
it "delegates to webdriver's #{loc} locator" do
|
10
|
-
expect_one(loc, "bar").and_return(element(:
|
10
|
+
expect_one(loc, "bar").and_return(element(tag_name: "div"))
|
11
11
|
locate_one loc => "bar"
|
12
12
|
end
|
13
13
|
end
|
@@ -21,8 +21,8 @@ describe Watir::ElementLocator do
|
|
21
21
|
expect_one :xpath, ".//div[@title='foo']"
|
22
22
|
end
|
23
23
|
|
24
|
-
locate_one :
|
25
|
-
:
|
24
|
+
locate_one tag_name: "div",
|
25
|
+
title: "foo"
|
26
26
|
end
|
27
27
|
|
28
28
|
it "handles selector with no tag name and and a single attribute" do
|
@@ -32,7 +32,7 @@ describe Watir::ElementLocator do
|
|
32
32
|
expect_one :xpath, ".//*[@title='foo']"
|
33
33
|
end
|
34
34
|
|
35
|
-
locate_one :
|
35
|
+
locate_one title: "foo"
|
36
36
|
end
|
37
37
|
|
38
38
|
it "handles single quotes in the attribute string" do
|
@@ -42,7 +42,7 @@ describe Watir::ElementLocator do
|
|
42
42
|
expect_one :xpath, %{.//*[@title=concat('foo and ',"'",'bar',"'",'')]}
|
43
43
|
end
|
44
44
|
|
45
|
-
locate_one :
|
45
|
+
locate_one title: "foo and 'bar'"
|
46
46
|
end
|
47
47
|
|
48
48
|
it "handles selector with tag name and multiple attributes" do
|
@@ -73,15 +73,15 @@ describe Watir::ElementLocator do
|
|
73
73
|
describe "with special cased selectors" do
|
74
74
|
it "normalizes space for :text" do
|
75
75
|
expect_one :xpath, ".//div[normalize-space()='foo']"
|
76
|
-
locate_one :
|
77
|
-
:
|
76
|
+
locate_one tag_name: "div",
|
77
|
+
text: "foo"
|
78
78
|
end
|
79
79
|
|
80
80
|
it "translates :caption to :text" do
|
81
81
|
expect_one :xpath, ".//div[normalize-space()='foo']"
|
82
82
|
|
83
|
-
locate_one :
|
84
|
-
:
|
83
|
+
locate_one tag_name: "div",
|
84
|
+
caption: "foo"
|
85
85
|
end
|
86
86
|
|
87
87
|
it "translates :class_name to :class" do
|
@@ -91,8 +91,8 @@ describe Watir::ElementLocator do
|
|
91
91
|
expect_one :xpath, ".//div[contains(concat(' ', @class, ' '), ' foo ')]"
|
92
92
|
end
|
93
93
|
|
94
|
-
locate_one :
|
95
|
-
:
|
94
|
+
locate_one tag_name: "div",
|
95
|
+
class_name: "foo"
|
96
96
|
end
|
97
97
|
|
98
98
|
it "handles data-* attributes" do
|
@@ -102,8 +102,8 @@ describe Watir::ElementLocator do
|
|
102
102
|
expect_one :xpath, ".//div[@data-name='foo']"
|
103
103
|
end
|
104
104
|
|
105
|
-
locate_one :
|
106
|
-
:
|
105
|
+
locate_one tag_name: "div",
|
106
|
+
data_name: "foo"
|
107
107
|
end
|
108
108
|
|
109
109
|
it "handles aria-* attributes" do
|
@@ -113,8 +113,8 @@ describe Watir::ElementLocator do
|
|
113
113
|
expect_one :xpath, ".//div[@aria-label='foo']"
|
114
114
|
end
|
115
115
|
|
116
|
-
locate_one :
|
117
|
-
:
|
116
|
+
locate_one tag_name: "div",
|
117
|
+
aria_label: "foo"
|
118
118
|
end
|
119
119
|
|
120
120
|
it "normalizes space for the :href attribute" do
|
@@ -125,8 +125,8 @@ describe Watir::ElementLocator do
|
|
125
125
|
end
|
126
126
|
|
127
127
|
selector = {
|
128
|
-
:
|
129
|
-
:
|
128
|
+
tag_name: "a",
|
129
|
+
href: "foo"
|
130
130
|
}
|
131
131
|
|
132
132
|
locate_one selector, Watir::Anchor.attributes
|
@@ -160,7 +160,7 @@ describe Watir::ElementLocator do
|
|
160
160
|
it "uses label attribute if it is valid for element" do
|
161
161
|
expect_one :xpath, ".//option[@label='foo']"
|
162
162
|
|
163
|
-
selector = { :
|
163
|
+
selector = { tag_name: "option", label: "foo" }
|
164
164
|
locate_one selector, Watir::Option.attributes
|
165
165
|
end
|
166
166
|
|
@@ -172,8 +172,8 @@ describe Watir::ElementLocator do
|
|
172
172
|
end
|
173
173
|
|
174
174
|
selector = {
|
175
|
-
:
|
176
|
-
:
|
175
|
+
tag_name: "meta",
|
176
|
+
http_equiv: "foo"
|
177
177
|
}
|
178
178
|
|
179
179
|
locate_one selector, Watir::Meta.attributes
|
@@ -185,35 +185,35 @@ describe Watir::ElementLocator do
|
|
185
185
|
describe "with regexp selectors" do
|
186
186
|
it "handles selector with tag name and a single regexp attribute" do
|
187
187
|
elements = [
|
188
|
-
element(:
|
189
|
-
element(:
|
188
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
189
|
+
element(tag_name: "div", attributes: { class: "foob"})
|
190
190
|
]
|
191
191
|
|
192
192
|
if Watir.prefer_css?
|
193
193
|
expect_all(:css, "div").and_return(elements)
|
194
194
|
else
|
195
|
-
expect_all(:xpath, ".//div").and_return(elements)
|
195
|
+
expect_all(:xpath, "(.//div)[contains(@class, 'oob')]").and_return(elements)
|
196
196
|
end
|
197
197
|
|
198
|
-
expect(locate_one(:
|
198
|
+
expect(locate_one(tag_name: "div", class: /oob/)).to eq elements[1]
|
199
199
|
end
|
200
200
|
|
201
201
|
it "handles :tag_name, :index and a single regexp attribute" do
|
202
202
|
elements = [
|
203
|
-
element(:
|
204
|
-
element(:
|
203
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
204
|
+
element(tag_name: "div", attributes: { class: "foo" })
|
205
205
|
]
|
206
206
|
|
207
207
|
if Watir.prefer_css?
|
208
208
|
expect_all(:css, "div").and_return(elements)
|
209
209
|
else
|
210
|
-
expect_all(:xpath, ".//div").and_return(elements)
|
210
|
+
expect_all(:xpath, "(.//div)[contains(@class, 'foo')]").and_return(elements)
|
211
211
|
end
|
212
212
|
|
213
213
|
selector = {
|
214
|
-
:
|
215
|
-
:
|
216
|
-
:
|
214
|
+
tag_name: "div",
|
215
|
+
class: /foo/,
|
216
|
+
index: 1
|
217
217
|
}
|
218
218
|
|
219
219
|
expect(locate_one(selector)).to eq elements[1]
|
@@ -221,15 +221,15 @@ describe Watir::ElementLocator do
|
|
221
221
|
|
222
222
|
it "handles :xpath and :index selectors" do
|
223
223
|
elements = [
|
224
|
-
element(:
|
225
|
-
element(:
|
224
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
225
|
+
element(tag_name: "div", attributes: { class: "foo" })
|
226
226
|
]
|
227
227
|
|
228
228
|
expect_all(:xpath, './/div[@class="foo"]').and_return(elements)
|
229
229
|
|
230
230
|
selector = {
|
231
|
-
:
|
232
|
-
:
|
231
|
+
xpath: './/div[@class="foo"]',
|
232
|
+
index: 1
|
233
233
|
}
|
234
234
|
|
235
235
|
expect(locate_one(selector)).to eq elements[1]
|
@@ -237,15 +237,15 @@ describe Watir::ElementLocator do
|
|
237
237
|
|
238
238
|
it "handles :css and :index selectors" do
|
239
239
|
elements = [
|
240
|
-
element(:
|
241
|
-
element(:
|
240
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
241
|
+
element(tag_name: "div", attributes: { class: "foo" })
|
242
242
|
]
|
243
243
|
|
244
244
|
expect_all(:css, 'div[class="foo"]').and_return(elements)
|
245
245
|
|
246
246
|
selector = {
|
247
|
-
:
|
248
|
-
:
|
247
|
+
css: 'div[class="foo"]',
|
248
|
+
index: 1
|
249
249
|
}
|
250
250
|
|
251
251
|
expect(locate_one(selector)).to eq elements[1]
|
@@ -253,21 +253,20 @@ describe Watir::ElementLocator do
|
|
253
253
|
|
254
254
|
it "handles mix of string and regexp attributes" do
|
255
255
|
elements = [
|
256
|
-
element(:
|
257
|
-
element(:
|
256
|
+
element(tag_name: "div", attributes: { dir: "foo", title: "bar" }),
|
257
|
+
element(tag_name: "div", attributes: { dir: "foo", title: "baz" })
|
258
258
|
]
|
259
259
|
|
260
260
|
if Watir.prefer_css?
|
261
261
|
expect_all(:css, 'div[dir="foo"]').and_return(elements)
|
262
262
|
else
|
263
|
-
expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
|
263
|
+
expect_all(:xpath, "(.//div[@dir='foo'])[contains(@title, 'baz')]").and_return(elements)
|
264
264
|
end
|
265
265
|
|
266
|
-
|
267
266
|
selector = {
|
268
|
-
:
|
269
|
-
:
|
270
|
-
:
|
267
|
+
tag_name: "div",
|
268
|
+
dir: "foo",
|
269
|
+
title: /baz/
|
271
270
|
}
|
272
271
|
|
273
272
|
expect(locate_one(selector)).to eq elements[1]
|
@@ -275,20 +274,20 @@ describe Watir::ElementLocator do
|
|
275
274
|
|
276
275
|
it "handles data-* attributes with regexp" do
|
277
276
|
elements = [
|
278
|
-
element(:
|
279
|
-
element(:
|
277
|
+
element(tag_name: "div", attributes: { :'data-automation-id' => "foo" }),
|
278
|
+
element(tag_name: "div", attributes: { :'data-automation-id' => "bar" })
|
280
279
|
]
|
281
280
|
|
282
281
|
if Watir.prefer_css?
|
283
282
|
expect_all(:css, 'div').and_return(elements)
|
284
283
|
else
|
285
|
-
expect_all(:xpath, ".//div").and_return(elements)
|
284
|
+
expect_all(:xpath, "(.//div)[contains(@data-automation-id, 'bar')]").and_return(elements)
|
286
285
|
end
|
287
286
|
|
288
287
|
|
289
288
|
selector = {
|
290
|
-
:
|
291
|
-
:
|
289
|
+
tag_name: "div",
|
290
|
+
data_automation_id: /bar/
|
292
291
|
}
|
293
292
|
|
294
293
|
expect(locate_one(selector)).to eq elements[1]
|
@@ -296,10 +295,10 @@ describe Watir::ElementLocator do
|
|
296
295
|
|
297
296
|
it "handles :label => /regexp/ selector" do
|
298
297
|
label_elements = [
|
299
|
-
element(:
|
300
|
-
element(:
|
298
|
+
element(tag_name: "label", text: "foo", attributes: { for: "bar"}),
|
299
|
+
element(tag_name: "label", text: "foob", attributes: { for: "baz"})
|
301
300
|
]
|
302
|
-
div_elements = [element(:
|
301
|
+
div_elements = [element(tag_name: "div")]
|
303
302
|
|
304
303
|
expect_all(:tag_name, "label").ordered.and_return(label_elements)
|
305
304
|
|
@@ -309,21 +308,20 @@ describe Watir::ElementLocator do
|
|
309
308
|
expect_all(:xpath, ".//div[@id='baz']").ordered.and_return(div_elements)
|
310
309
|
end
|
311
310
|
|
312
|
-
expect(locate_one(:
|
311
|
+
expect(locate_one(tag_name: "div", label: /oob/)).to eq div_elements.first
|
313
312
|
end
|
314
313
|
|
315
314
|
it "returns nil when no label matching the regexp is found" do
|
316
315
|
expect_all(:tag_name, "label").and_return([])
|
317
|
-
expect(locate_one(:
|
316
|
+
expect(locate_one(tag_name: "div", label: /foo/)).to be_nil
|
318
317
|
end
|
319
|
-
|
320
318
|
end
|
321
319
|
|
322
320
|
it "finds all if :index is given" do
|
323
321
|
# or could we use XPath indeces reliably instead?
|
324
322
|
elements = [
|
325
|
-
element(:
|
326
|
-
element(:
|
323
|
+
element(tag_name: "div"),
|
324
|
+
element(tag_name: "div")
|
327
325
|
]
|
328
326
|
|
329
327
|
if Watir.prefer_css?
|
@@ -333,20 +331,20 @@ describe Watir::ElementLocator do
|
|
333
331
|
end
|
334
332
|
|
335
333
|
selector = {
|
336
|
-
:
|
337
|
-
:
|
338
|
-
:
|
334
|
+
tag_name: "div",
|
335
|
+
dir: "foo",
|
336
|
+
index: 1
|
339
337
|
}
|
340
338
|
|
341
339
|
expect(locate_one(selector)).to eq elements[1]
|
342
340
|
end
|
343
341
|
|
344
342
|
it "returns nil if found element didn't match the selector tag_name" do
|
345
|
-
expect_one(:xpath, "//div").and_return(element(:
|
343
|
+
expect_one(:xpath, "//div").and_return(element(tag_name: "div"))
|
346
344
|
|
347
345
|
selector = {
|
348
|
-
:
|
349
|
-
:
|
346
|
+
tag_name: "input",
|
347
|
+
xpath: "//div"
|
350
348
|
}
|
351
349
|
|
352
350
|
expect(locate_one(selector, Watir::Input.attributes)).to be_nil
|
@@ -354,17 +352,17 @@ describe Watir::ElementLocator do
|
|
354
352
|
|
355
353
|
describe "errors" do
|
356
354
|
it "raises a TypeError if :index is not a Fixnum" do
|
357
|
-
expect { locate_one(:
|
355
|
+
expect { locate_one(tag_name: "div", index: "bar") }.to \
|
358
356
|
raise_error(TypeError, %[expected Fixnum, got "bar":String])
|
359
357
|
end
|
360
358
|
|
361
359
|
it "raises a TypeError if selector value is not a String or Regexp" do
|
362
|
-
expect { locate_one(:
|
360
|
+
expect { locate_one(tag_name: 123) }.to \
|
363
361
|
raise_error(TypeError, %[expected one of [String, Regexp], got 123:Fixnum])
|
364
362
|
end
|
365
363
|
|
366
364
|
it "raises a MissingWayOfFindingObjectException if the attribute is not valid" do
|
367
|
-
bad_selector = {:
|
365
|
+
bad_selector = {tag_name: "input", href: "foo"}
|
368
366
|
valid_attributes = Watir::Input.attributes
|
369
367
|
|
370
368
|
expect { locate_one(bad_selector, valid_attributes) }.to \
|
@@ -377,7 +375,7 @@ describe Watir::ElementLocator do
|
|
377
375
|
describe "by delegating to webdriver" do
|
378
376
|
WEBDRIVER_SELECTORS.each do |loc|
|
379
377
|
it "delegates to webdriver's #{loc} locator" do
|
380
|
-
expect_all(loc, "bar").and_return([element(:
|
378
|
+
expect_all(loc, "bar").and_return([element(tag_name: "div")])
|
381
379
|
locate_all(loc => "bar")
|
382
380
|
end
|
383
381
|
end
|
@@ -403,8 +401,8 @@ describe Watir::ElementLocator do
|
|
403
401
|
expect_all :xpath, ".//div[@dir='foo']"
|
404
402
|
end
|
405
403
|
|
406
|
-
locate_all :
|
407
|
-
:
|
404
|
+
locate_all tag_name: "div",
|
405
|
+
dir: "foo"
|
408
406
|
end
|
409
407
|
|
410
408
|
it "handles selector with tag name and multiple attributes" do
|
@@ -423,47 +421,110 @@ describe Watir::ElementLocator do
|
|
423
421
|
describe "with regexp selectors" do
|
424
422
|
it "handles selector with tag name and a single regexp attribute" do
|
425
423
|
elements = [
|
426
|
-
element(:
|
427
|
-
element(:
|
428
|
-
element(:
|
429
|
-
element(:
|
424
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
425
|
+
element(tag_name: "div", attributes: { class: "foob"}),
|
426
|
+
element(tag_name: "div", attributes: { class: "doob"}),
|
427
|
+
element(tag_name: "div", attributes: { class: "noob"})
|
430
428
|
]
|
431
429
|
|
432
430
|
if Watir.prefer_css?
|
433
431
|
expect_all(:css, "div").and_return(elements)
|
434
432
|
else
|
435
|
-
expect_all(:xpath, ".//div").and_return(elements)
|
433
|
+
expect_all(:xpath, "(.//div)[contains(@class, 'oob')]").and_return(elements)
|
436
434
|
end
|
437
435
|
|
438
|
-
expect(locate_all(:
|
436
|
+
expect(locate_all(tag_name: "div", class: /oob/)).to eq elements.last(3)
|
439
437
|
end
|
440
438
|
|
441
439
|
it "handles mix of string and regexp attributes" do
|
442
440
|
elements = [
|
443
|
-
element(:
|
444
|
-
element(:
|
445
|
-
element(:
|
441
|
+
element(tag_name: "div", attributes: { dir: "foo", title: "bar" }),
|
442
|
+
element(tag_name: "div", attributes: { dir: "foo", title: "baz" }),
|
443
|
+
element(tag_name: "div", attributes: { dir: "foo", title: "bazt"})
|
446
444
|
]
|
447
445
|
|
448
446
|
if Watir.prefer_css?
|
449
447
|
expect_all(:css, 'div[dir="foo"]').and_return(elements)
|
450
448
|
else
|
451
|
-
expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
|
449
|
+
expect_all(:xpath, "(.//div[@dir='foo'])[contains(@title, 'baz')]").and_return(elements)
|
452
450
|
end
|
453
451
|
|
454
452
|
selector = {
|
455
|
-
:
|
456
|
-
:
|
457
|
-
:
|
453
|
+
tag_name: "div",
|
454
|
+
dir: "foo",
|
455
|
+
title: /baz/
|
458
456
|
}
|
459
457
|
|
460
458
|
expect(locate_all(selector)).to eq elements.last(2)
|
461
459
|
end
|
460
|
+
|
461
|
+
context "and xpath" do
|
462
|
+
before do
|
463
|
+
expect(Watir).to receive(:prefer_css?).and_return(false)
|
464
|
+
end
|
465
|
+
|
466
|
+
it "converts a leading run of regexp literals to a contains() expression" do
|
467
|
+
elements = [
|
468
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
469
|
+
element(tag_name: "div", attributes: { class: "foob" }),
|
470
|
+
element(tag_name: "div", attributes: { class: "bar" })
|
471
|
+
]
|
472
|
+
|
473
|
+
expect_all(:xpath, "(.//div)[contains(@class, 'fo')]").and_return(elements.first(2))
|
474
|
+
|
475
|
+
expect(locate_one(tag_name: "div", class: /fo.b$/)).to eq elements[1]
|
476
|
+
end
|
477
|
+
|
478
|
+
it "converts a trailing run of regexp literals to a contains() expression" do
|
479
|
+
elements = [
|
480
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
481
|
+
element(tag_name: "div", attributes: { class: "foob" })
|
482
|
+
]
|
483
|
+
|
484
|
+
expect_all(:xpath, "(.//div)[contains(@class, 'b')]").and_return(elements.last(1))
|
485
|
+
|
486
|
+
expect(locate_one(tag_name: "div", class: /^fo.b/)).to eq elements[1]
|
487
|
+
end
|
488
|
+
|
489
|
+
it "converts a leading and a trailing run of regexp literals to a contains() expression" do
|
490
|
+
elements = [
|
491
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
492
|
+
element(tag_name: "div", attributes: { class: "foob" })
|
493
|
+
]
|
494
|
+
|
495
|
+
expect_all(:xpath, "(.//div)[contains(@class, 'fo') and contains(@class, 'b')]").
|
496
|
+
and_return(elements.last(1))
|
497
|
+
|
498
|
+
expect(locate_one(tag_name: "div", class: /fo.b/)).to eq elements[1]
|
499
|
+
end
|
500
|
+
|
501
|
+
it "does not try to convert case insensitive expressions" do
|
502
|
+
elements = [
|
503
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
504
|
+
element(tag_name: "div", attributes: { class: "foob"})
|
505
|
+
]
|
506
|
+
|
507
|
+
expect_all(:xpath, ".//div").and_return(elements.last(1))
|
508
|
+
|
509
|
+
expect(locate_one(tag_name: "div", class: /FOOB/i)).to eq elements[1]
|
510
|
+
end
|
511
|
+
|
512
|
+
it "does not try to convert expressions containing '|'" do
|
513
|
+
elements = [
|
514
|
+
element(tag_name: "div", attributes: { class: "foo" }),
|
515
|
+
element(tag_name: "div", attributes: { class: "foob"})
|
516
|
+
]
|
517
|
+
|
518
|
+
expect_all(:xpath, ".//div").and_return(elements.last(1))
|
519
|
+
|
520
|
+
expect(locate_one(tag_name: "div", class: /x|b/)).to eq elements[1]
|
521
|
+
end
|
522
|
+
end
|
462
523
|
end
|
463
524
|
|
464
525
|
describe "errors" do
|
465
526
|
it "raises ArgumentError if :index is given" do
|
466
|
-
expect { locate_all(:
|
527
|
+
expect { locate_all(tag_name: "div", index: 1) }.to \
|
467
528
|
raise_error(ArgumentError, "can't locate all elements by :index")
|
468
529
|
end
|
469
530
|
end
|