watir-webdriver 0.6.11 → 0.7.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/.travis.yml +14 -12
- data/CHANGES.md +17 -0
- data/LICENSE +1 -1
- data/README.md +8 -1
- data/Rakefile +7 -2
- data/lib/watir-webdriver/alert.rb +5 -1
- data/lib/watir-webdriver/attribute_helper.rb +4 -8
- data/lib/watir-webdriver/browser.rb +41 -21
- data/lib/watir-webdriver/element_collection.rb +1 -2
- data/lib/watir-webdriver/elements/button.rb +3 -5
- data/lib/watir-webdriver/elements/checkbox.rb +2 -11
- data/lib/watir-webdriver/elements/element.rb +93 -86
- data/lib/watir-webdriver/elements/file_field.rb +1 -2
- data/lib/watir-webdriver/elements/form.rb +2 -1
- data/lib/watir-webdriver/elements/generated.rb +24 -11
- data/lib/watir-webdriver/elements/iframe.rb +25 -17
- data/lib/watir-webdriver/elements/option.rb +6 -14
- data/lib/watir-webdriver/elements/radio.rb +2 -5
- data/lib/watir-webdriver/elements/select.rb +15 -7
- data/lib/watir-webdriver/exception.rb +0 -2
- data/lib/watir-webdriver/extensions/alerts.rb +0 -14
- data/lib/watir-webdriver/has_window.rb +2 -4
- data/lib/watir-webdriver/html/spec_extractor.rb +3 -2
- data/lib/watir-webdriver/html/visitor.rb +2 -2
- data/lib/watir-webdriver/locators/element_locator.rb +22 -21
- data/lib/watir-webdriver/locators/text_field_locator.rb +11 -3
- data/lib/watir-webdriver/user_editable.rb +5 -10
- data/lib/watir-webdriver/version.rb +1 -1
- data/lib/watir-webdriver/wait.rb +26 -26
- data/lib/watir-webdriver/window.rb +30 -25
- data/spec/always_locate_spec.rb +42 -0
- data/spec/browser_spec.rb +1 -1
- data/spec/element_locator_spec.rb +13 -1
- data/spec/element_spec.rb +43 -8
- data/spec/input_spec.rb +0 -31
- data/spec/spec_helper.rb +0 -1
- data/support/doctest_helper.rb +72 -0
- data/support/travis.sh +4 -0
- data/watir-webdriver.gemspec +2 -1
- metadata +50 -35
- data/spec/html/inner_outer.html +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c59e0947d61d3444072fba9199dbb1923ef78bb
|
4
|
+
data.tar.gz: cea68a6afbae78f341d70c43e276697cd297b42a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 118d8dac0739c61e992e684c3f7ea86744142bf27f68f10bd766f3f930724c5d7c7475b9ba02d2fb11dda3ff33c582ddf02227a5933e23b8c07d39409fcb1473
|
7
|
+
data.tar.gz: 76b6e52b21db799697ccf8777debbeaebd14bbb5e19e60825c6f7c6a5ccce387c964dd647e1506f5dc4c8a6315264b8f9816f77cd234987e219be7741399b723
|
data/.travis.yml
CHANGED
@@ -9,18 +9,20 @@ notifications:
|
|
9
9
|
irc: "irc.freenode.net#watir"
|
10
10
|
before_script:
|
11
11
|
- support/travis.sh
|
12
|
+
script: bundle exec rake $RAKE_TASK
|
12
13
|
env:
|
13
|
-
- WATIR_WEBDRIVER_BROWSER=firefox
|
14
|
-
- WATIR_WEBDRIVER_BROWSER=firefox ALWAYS_LOCATE=false
|
15
|
-
- WATIR_WEBDRIVER_BROWSER=firefox PREFER_CSS=1 SELECTOR_STATS=1
|
16
|
-
- WATIR_WEBDRIVER_BROWSER=chrome
|
17
|
-
- WATIR_WEBDRIVER_BROWSER=chrome ALWAYS_LOCATE=false
|
18
|
-
- WATIR_WEBDRIVER_BROWSER=chrome PREFER_CSS=1 SELECTOR_STATS=1
|
19
|
-
- WATIR_WEBDRIVER_BROWSER=phantomjs
|
20
|
-
- WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
|
21
|
-
- WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
|
14
|
+
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=firefox
|
15
|
+
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=firefox ALWAYS_LOCATE=false
|
16
|
+
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=firefox PREFER_CSS=1 SELECTOR_STATS=1
|
17
|
+
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=chrome
|
18
|
+
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=chrome ALWAYS_LOCATE=false
|
19
|
+
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=chrome PREFER_CSS=1 SELECTOR_STATS=1
|
20
|
+
# - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs
|
21
|
+
# - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
|
22
|
+
# - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
|
23
|
+
- RAKE_TASK=yard:doctest
|
22
24
|
matrix:
|
23
25
|
allow_failures:
|
24
|
-
- env: WATIR_WEBDRIVER_BROWSER=phantomjs
|
25
|
-
- env: WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
|
26
|
-
- env: WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
|
26
|
+
- env: RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs
|
27
|
+
- env: RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
|
28
|
+
- env: RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
### 0.7.0
|
2
|
+
|
3
|
+
* Allow finding all elements with prefer_css
|
4
|
+
* Add support for yard-doctest (#287)
|
5
|
+
* Update from HTML spec (#296)
|
6
|
+
* Support tag_name call on Frames and IFrames (#293 & #294)
|
7
|
+
* Increased performance by caching elements by default where possible (#307)
|
8
|
+
* Improved handling of elements that go stale during lookup (#291, thanks @titusfortner)
|
9
|
+
* Fix element location issues when switching between IFrames (#286, thanks @titusfortner)
|
10
|
+
* Fix creation of an IFrameCollection based on selector (#299, thanks @titusfortner)
|
11
|
+
* Fix window handling with closed windows (#290 & 282, thanks @titusfortner)
|
12
|
+
* Prevent running checkers on a closed window (#283, thanks @titusfortner)
|
13
|
+
* Allow taking actions without triggering run checkers (#283, thanks @titusfortner)
|
14
|
+
* Fix bug when ElementCollection#[] returns existing elements for non-existing selector (#309)
|
15
|
+
* Fix bug when Wait would never execute block with 0 timeout (#312)
|
16
|
+
* Fix race condition with IFrameCollection#to_a (#317)
|
17
|
+
|
1
18
|
### 0.6.11 (2014-09-23)
|
2
19
|
|
3
20
|
* Fix namespacing issue (#265, thanks @titusfortner)
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -38,6 +38,13 @@ watir-webdriver uses [watirspec](http://github.com/watir/watirspec) for testing.
|
|
38
38
|
|
39
39
|
Specs specific to watir-webdriver are found in spec/*_spec.rb, with watirspec in spec/watirspec.
|
40
40
|
|
41
|
+
Doctests
|
42
|
+
--------
|
43
|
+
|
44
|
+
watir-webdriver uses [yard-doctest](https://github.com/p0deje/yard-doctest) for testing documentation examples.
|
45
|
+
|
46
|
+
rake yard:doctest
|
47
|
+
|
41
48
|
API docs
|
42
49
|
--------
|
43
50
|
|
@@ -71,4 +78,4 @@ Note on Patches/Pull Requests
|
|
71
78
|
Copyright
|
72
79
|
---------
|
73
80
|
|
74
|
-
Copyright (c) 2009-
|
81
|
+
Copyright (c) 2009-2015 Jari Bakken. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -20,10 +20,10 @@ namespace :spec do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
task :default => :spec
|
23
|
+
task :default => [:spec, 'yard:doctest']
|
24
24
|
|
25
25
|
namespace :html5 do
|
26
|
-
SPEC_URI = "
|
26
|
+
SPEC_URI = "https://www.whatwg.org/specs/web-apps/current-work/"
|
27
27
|
SPEC_PATH = "support/html5.html"
|
28
28
|
|
29
29
|
task :html_lib => :lib do
|
@@ -91,6 +91,11 @@ YARD::Rake::YardocTask.new do |task|
|
|
91
91
|
task.options = %w[--debug] # this is pretty slow, so nice with some output
|
92
92
|
end
|
93
93
|
|
94
|
+
require 'yard-doctest'
|
95
|
+
YARD::Doctest::RakeTask.new do |task|
|
96
|
+
task.doctest_opts = ['-v']
|
97
|
+
end
|
98
|
+
|
94
99
|
namespace :changes do
|
95
100
|
task :differ do
|
96
101
|
require './support/version_differ'
|
@@ -14,7 +14,7 @@ module Watir
|
|
14
14
|
#
|
15
15
|
# @example
|
16
16
|
# browser.alert.text
|
17
|
-
# #=> "
|
17
|
+
# #=> "ok"
|
18
18
|
#
|
19
19
|
# @return [String]
|
20
20
|
#
|
@@ -70,6 +70,10 @@ module Watir
|
|
70
70
|
#
|
71
71
|
# Returns true if alert, confirm or prompt is present and false otherwise.
|
72
72
|
#
|
73
|
+
# @example
|
74
|
+
# browser.alert.exists?
|
75
|
+
# #=> true
|
76
|
+
#
|
73
77
|
|
74
78
|
def exists?
|
75
79
|
assert_exists
|
@@ -68,30 +68,26 @@ module Watir
|
|
68
68
|
|
69
69
|
def define_string_attribute(mname, aname)
|
70
70
|
define_method mname do
|
71
|
-
|
72
|
-
@element.attribute(aname).to_s
|
71
|
+
attribute_value(aname).to_s
|
73
72
|
end
|
74
73
|
end
|
75
74
|
|
76
75
|
def define_boolean_attribute(mname, aname)
|
77
76
|
define_method mname do
|
78
|
-
|
79
|
-
@element.attribute(aname) == "true"
|
77
|
+
attribute_value(aname) == "true"
|
80
78
|
end
|
81
79
|
end
|
82
80
|
|
83
81
|
def define_int_attribute(mname, aname)
|
84
82
|
define_method mname do
|
85
|
-
|
86
|
-
value = @element.attribute(aname)
|
83
|
+
value = attribute_value(aname)
|
87
84
|
value && Integer(value)
|
88
85
|
end
|
89
86
|
end
|
90
87
|
|
91
88
|
def define_float_attribute(mname, aname)
|
92
89
|
define_method mname do
|
93
|
-
|
94
|
-
value = @element.attribute(aname)
|
90
|
+
value = attribute_value(aname)
|
95
91
|
value && Float(value)
|
96
92
|
end
|
97
93
|
end
|
@@ -18,7 +18,7 @@ module Watir
|
|
18
18
|
# Creates a Watir::Browser instance and goes to URL.
|
19
19
|
#
|
20
20
|
# @example
|
21
|
-
# browser = Watir::Browser.start "www.google.com", :
|
21
|
+
# browser = Watir::Browser.start "www.google.com", :firefox
|
22
22
|
# #=> #<Watir::Browser:0x..fa45a499cb41e1752 url="http://www.google.com" title="Google">
|
23
23
|
#
|
24
24
|
# @param [String] url
|
@@ -65,7 +65,7 @@ module Watir
|
|
65
65
|
# Goes to the given URL.
|
66
66
|
#
|
67
67
|
# @example
|
68
|
-
# browser.goto "www.
|
68
|
+
# browser.goto "www.watir.com"
|
69
69
|
#
|
70
70
|
# @param [String] uri The url.
|
71
71
|
# @return [String] The url you end up at.
|
@@ -100,9 +100,9 @@ module Watir
|
|
100
100
|
# Returns URL of current page.
|
101
101
|
#
|
102
102
|
# @example
|
103
|
-
# browser.goto "
|
103
|
+
# browser.goto "www.watir.com"
|
104
104
|
# browser.url
|
105
|
-
# #=> "http://
|
105
|
+
# #=> "http://watir.com/"
|
106
106
|
#
|
107
107
|
# @return [String]
|
108
108
|
#
|
@@ -116,9 +116,9 @@ module Watir
|
|
116
116
|
# Returns title of current page.
|
117
117
|
#
|
118
118
|
# @example
|
119
|
-
# browser.goto "
|
119
|
+
# browser.goto "www.watir.com"
|
120
120
|
# browser.title
|
121
|
-
# #=> "
|
121
|
+
# #=> "Watir.com | Web Application Testing in Ruby"
|
122
122
|
#
|
123
123
|
# @return [String]
|
124
124
|
#
|
@@ -152,9 +152,9 @@ module Watir
|
|
152
152
|
# Returns browser name.
|
153
153
|
#
|
154
154
|
# @example
|
155
|
-
# browser = Watir::Browser.new :
|
155
|
+
# browser = Watir::Browser.new :firefox
|
156
156
|
# browser.name
|
157
|
-
# #=> :
|
157
|
+
# #=> :firefox
|
158
158
|
#
|
159
159
|
# @return [Symbol]
|
160
160
|
#
|
@@ -243,14 +243,9 @@ module Watir
|
|
243
243
|
# `return` explicitly.
|
244
244
|
#
|
245
245
|
# @example Check that Ajax requests are completed with jQuery
|
246
|
-
# browser.execute_script("return jQuery.active") ==
|
246
|
+
# browser.execute_script("return jQuery.active") == 0
|
247
247
|
# #=> true
|
248
248
|
#
|
249
|
-
# @example Get inner HTML of element
|
250
|
-
# span = browser.span(class: "someclass")
|
251
|
-
# browser.execute_script "return arguments[0].innerHTML", span
|
252
|
-
# #=> "Span innerHTML"
|
253
|
-
#
|
254
249
|
# @param [String] script JavaScript snippet to execute
|
255
250
|
# @param *args Arguments will be available in the given script in the 'arguments' pseudo-array
|
256
251
|
#
|
@@ -266,7 +261,7 @@ module Watir
|
|
266
261
|
# Sends sequence of keystrokes to currently active element.
|
267
262
|
#
|
268
263
|
# @example
|
269
|
-
# browser.goto "
|
264
|
+
# browser.goto "www.google.com"
|
270
265
|
# browser.send_keys "Watir", :return
|
271
266
|
#
|
272
267
|
# @param [String, Symbol] *args
|
@@ -299,8 +294,8 @@ module Watir
|
|
299
294
|
# browser.add_checker do |page|
|
300
295
|
# page.text.include?("Server Error") and puts "Application exception or 500 error!"
|
301
296
|
# end
|
302
|
-
# browser.goto "www.
|
303
|
-
# "
|
297
|
+
# browser.goto "www.watir.com/404"
|
298
|
+
# "Application exception or 500 error!"
|
304
299
|
#
|
305
300
|
# @param [#call] checker Object responding to call
|
306
301
|
# @yield Checker block
|
@@ -325,8 +320,8 @@ module Watir
|
|
325
320
|
# page.text.include?("Server Error") and puts "Application exception or 500 error!"
|
326
321
|
# end
|
327
322
|
# browser.add_checker checker
|
328
|
-
# browser.goto "www.
|
329
|
-
# "
|
323
|
+
# browser.goto "www.watir.com/404"
|
324
|
+
# "Application exception or 500 error!"
|
330
325
|
# browser.disable_checker checker
|
331
326
|
# browser.refresh
|
332
327
|
#
|
@@ -340,7 +335,26 @@ module Watir
|
|
340
335
|
#
|
341
336
|
|
342
337
|
def run_checkers
|
343
|
-
@error_checkers.each { |e| e.call(self) }
|
338
|
+
@error_checkers.each { |e| e.call(self) } if !@error_checkers.empty? && window.present?
|
339
|
+
end
|
340
|
+
|
341
|
+
#
|
342
|
+
# Executes a block without running error checkers.
|
343
|
+
#
|
344
|
+
# @example
|
345
|
+
# browser.without_checkers do
|
346
|
+
# browser.element(:name => "new_user_button").click
|
347
|
+
# end
|
348
|
+
#
|
349
|
+
# @yieldparam [Watir::Browser]
|
350
|
+
#
|
351
|
+
|
352
|
+
def without_checkers
|
353
|
+
current_checkers = @error_checkers
|
354
|
+
@error_checkers = []
|
355
|
+
yield(self)
|
356
|
+
ensure
|
357
|
+
@error_checkers = current_checkers
|
344
358
|
end
|
345
359
|
|
346
360
|
#
|
@@ -350,7 +364,10 @@ module Watir
|
|
350
364
|
#
|
351
365
|
|
352
366
|
def exist?
|
353
|
-
|
367
|
+
assert_exists
|
368
|
+
true
|
369
|
+
rescue Exception::NoMatchingWindowFoundException, Exception::Error
|
370
|
+
false
|
354
371
|
end
|
355
372
|
alias_method :exists?, :exist?
|
356
373
|
|
@@ -363,11 +380,14 @@ module Watir
|
|
363
380
|
def assert_exists
|
364
381
|
if @closed
|
365
382
|
raise Exception::Error, "browser was closed"
|
383
|
+
elsif !window.present?
|
384
|
+
raise Exception::NoMatchingWindowFoundException, "browser window was closed"
|
366
385
|
else
|
367
386
|
driver.switch_to.default_content
|
368
387
|
true
|
369
388
|
end
|
370
389
|
end
|
390
|
+
alias_method :assert_not_stale, :assert_exists
|
371
391
|
|
372
392
|
def reset!
|
373
393
|
# no-op
|
@@ -42,7 +42,6 @@ module Watir
|
|
42
42
|
|
43
43
|
#
|
44
44
|
# Get the element at the given index.
|
45
|
-
# Note that this is 0-indexed and not compatible with older Watir implementations.
|
46
45
|
#
|
47
46
|
# Also note that because of Watir's lazy loading, this will return an Element
|
48
47
|
# instance even if the index is out of bounds.
|
@@ -52,7 +51,7 @@ module Watir
|
|
52
51
|
#
|
53
52
|
|
54
53
|
def [](idx)
|
55
|
-
to_a[idx] || element_class.new(@parent, :index => idx)
|
54
|
+
to_a[idx] || element_class.new(@parent, @selector.merge(:index => idx))
|
56
55
|
end
|
57
56
|
|
58
57
|
#
|
@@ -23,15 +23,13 @@ module Watir
|
|
23
23
|
#
|
24
24
|
|
25
25
|
def text
|
26
|
-
|
27
|
-
|
28
|
-
tn = @element.tag_name.downcase
|
26
|
+
tn = tag_name
|
29
27
|
|
30
28
|
case tn
|
31
29
|
when 'input'
|
32
|
-
|
30
|
+
value
|
33
31
|
when 'button'
|
34
|
-
|
32
|
+
super
|
35
33
|
else
|
36
34
|
raise Exception::Error, "unknown tag name for button: #{tn}"
|
37
35
|
end
|
@@ -17,14 +17,7 @@ module Watir
|
|
17
17
|
#
|
18
18
|
|
19
19
|
def set(bool = true)
|
20
|
-
|
21
|
-
assert_enabled
|
22
|
-
|
23
|
-
if @element.selected?
|
24
|
-
@element.click unless bool
|
25
|
-
else
|
26
|
-
@element.click if bool
|
27
|
-
end
|
20
|
+
set? == bool ? assert_enabled : click
|
28
21
|
end
|
29
22
|
|
30
23
|
#
|
@@ -34,14 +27,12 @@ module Watir
|
|
34
27
|
|
35
28
|
def set?
|
36
29
|
assert_exists
|
37
|
-
@element.selected?
|
30
|
+
element_call { @element.selected? }
|
38
31
|
end
|
39
32
|
|
40
33
|
#
|
41
34
|
# Unsets checkbox.
|
42
35
|
#
|
43
|
-
# Same as +set(false)+
|
44
|
-
#
|
45
36
|
|
46
37
|
def clear
|
47
38
|
set false
|
@@ -60,15 +60,12 @@ module Watir
|
|
60
60
|
# Returns true if two elements are equal.
|
61
61
|
#
|
62
62
|
# @example
|
63
|
-
# browser.
|
63
|
+
# browser.text_field(:name => "new_user_first_name") == browser.text_field(:name => "new_user_first_name")
|
64
64
|
# #=> true
|
65
65
|
#
|
66
66
|
|
67
67
|
def ==(other)
|
68
|
-
|
69
|
-
|
70
|
-
assert_exists
|
71
|
-
@element == other.wd
|
68
|
+
other.kind_of?(self.class) && wd == other.wd
|
72
69
|
end
|
73
70
|
alias_method :eql?, :==
|
74
71
|
|
@@ -84,7 +81,7 @@ module Watir
|
|
84
81
|
|
85
82
|
def text
|
86
83
|
assert_exists
|
87
|
-
@element.text
|
84
|
+
element_call { @element.text }
|
88
85
|
end
|
89
86
|
|
90
87
|
#
|
@@ -95,7 +92,7 @@ module Watir
|
|
95
92
|
|
96
93
|
def tag_name
|
97
94
|
assert_exists
|
98
|
-
@element.tag_name.downcase
|
95
|
+
element_call { @element.tag_name.downcase }
|
99
96
|
end
|
100
97
|
|
101
98
|
#
|
@@ -104,13 +101,13 @@ module Watir
|
|
104
101
|
# and may not work at all.
|
105
102
|
#
|
106
103
|
# @example Click an element
|
107
|
-
# element.click
|
104
|
+
# browser.element(:name => "new_user_button").click
|
108
105
|
#
|
109
106
|
# @example Click an element with shift key pressed
|
110
|
-
# element.click(:shift)
|
107
|
+
# browser.element(:name => "new_user_button").click(:shift)
|
111
108
|
#
|
112
109
|
# @example Click an element with several modifier keys pressed
|
113
|
-
# element.click(:shift, :control)
|
110
|
+
# browser.element(:name => "new_user_button").click(:shift, :control)
|
114
111
|
#
|
115
112
|
# @param [:shift, :alt, :control, :command, :meta] Modifier key(s) to press while clicking.
|
116
113
|
#
|
@@ -119,17 +116,19 @@ module Watir
|
|
119
116
|
assert_exists
|
120
117
|
assert_enabled
|
121
118
|
|
122
|
-
|
123
|
-
|
119
|
+
element_call do
|
120
|
+
if modifiers.any?
|
121
|
+
assert_has_input_devices_for "click(#{modifiers.join ', '})"
|
124
122
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
123
|
+
action = driver.action
|
124
|
+
modifiers.each { |mod| action.key_down mod }
|
125
|
+
action.click @element
|
126
|
+
modifiers.each { |mod| action.key_up mod }
|
129
127
|
|
130
|
-
|
131
|
-
|
132
|
-
|
128
|
+
action.perform
|
129
|
+
else
|
130
|
+
@element.click
|
131
|
+
end
|
133
132
|
end
|
134
133
|
|
135
134
|
run_checkers
|
@@ -140,14 +139,14 @@ module Watir
|
|
140
139
|
# Note that browser support may vary.
|
141
140
|
#
|
142
141
|
# @example
|
143
|
-
# browser.
|
142
|
+
# browser.element(:name => "new_user_button").double_click
|
144
143
|
#
|
145
144
|
|
146
145
|
def double_click
|
147
146
|
assert_exists
|
148
147
|
assert_has_input_devices_for :double_click
|
149
148
|
|
150
|
-
driver.action.double_click(@element).perform
|
149
|
+
element_call { driver.action.double_click(@element).perform }
|
151
150
|
run_checkers
|
152
151
|
end
|
153
152
|
|
@@ -156,14 +155,14 @@ module Watir
|
|
156
155
|
# Note that browser support may vary.
|
157
156
|
#
|
158
157
|
# @example
|
159
|
-
# browser.
|
158
|
+
# browser.element(:name => "new_user_button").right_click
|
160
159
|
#
|
161
160
|
|
162
161
|
def right_click
|
163
162
|
assert_exists
|
164
163
|
assert_has_input_devices_for :right_click
|
165
164
|
|
166
|
-
driver.action.context_click(@element).perform
|
165
|
+
element_call { driver.action.context_click(@element).perform }
|
167
166
|
run_checkers
|
168
167
|
end
|
169
168
|
|
@@ -172,14 +171,14 @@ module Watir
|
|
172
171
|
# Note that browser support may vary.
|
173
172
|
#
|
174
173
|
# @example
|
175
|
-
# browser.
|
174
|
+
# browser.element(:name => "new_user_button").hover
|
176
175
|
#
|
177
176
|
|
178
177
|
def hover
|
179
178
|
assert_exists
|
180
179
|
assert_has_input_devices_for :hover
|
181
180
|
|
182
|
-
driver.action.move_to(@element).perform
|
181
|
+
element_call { driver.action.move_to(@element).perform }
|
183
182
|
end
|
184
183
|
|
185
184
|
#
|
@@ -187,9 +186,9 @@ module Watir
|
|
187
186
|
# Note that browser support may vary.
|
188
187
|
#
|
189
188
|
# @example
|
190
|
-
#
|
191
|
-
#
|
192
|
-
#
|
189
|
+
# a = browser.div(:id => "draggable")
|
190
|
+
# b = browser.div(:id => "droppable")
|
191
|
+
# a.drag_and_drop_on b
|
193
192
|
#
|
194
193
|
|
195
194
|
def drag_and_drop_on(other)
|
@@ -197,9 +196,11 @@ module Watir
|
|
197
196
|
assert_exists
|
198
197
|
assert_has_input_devices_for :drag_and_drop_on
|
199
198
|
|
200
|
-
|
201
|
-
|
202
|
-
|
199
|
+
element_call do
|
200
|
+
driver.action.
|
201
|
+
drag_and_drop(@element, other.wd).
|
202
|
+
perform
|
203
|
+
end
|
203
204
|
end
|
204
205
|
|
205
206
|
#
|
@@ -207,7 +208,7 @@ module Watir
|
|
207
208
|
# Note that browser support may vary.
|
208
209
|
#
|
209
210
|
# @example
|
210
|
-
#
|
211
|
+
# browser.div(:id => "draggable").drag_and_drop_by 100, -200
|
211
212
|
#
|
212
213
|
# @param [Fixnum] right_by
|
213
214
|
# @param [Fixnum] down_by
|
@@ -217,16 +218,18 @@ module Watir
|
|
217
218
|
assert_exists
|
218
219
|
assert_has_input_devices_for :drag_and_drop_by
|
219
220
|
|
220
|
-
|
221
|
-
|
222
|
-
|
221
|
+
element_call do
|
222
|
+
driver.action.
|
223
|
+
drag_and_drop_by(@element, right_by, down_by).
|
224
|
+
perform
|
225
|
+
end
|
223
226
|
end
|
224
227
|
|
225
228
|
#
|
226
229
|
# Flashes (change background color far a moment) element.
|
227
230
|
#
|
228
231
|
# @example
|
229
|
-
#
|
232
|
+
# browser.text_field(:name => "new_user_first_name").flash
|
230
233
|
#
|
231
234
|
|
232
235
|
def flash
|
@@ -250,44 +253,40 @@ module Watir
|
|
250
253
|
#
|
251
254
|
|
252
255
|
def value
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
@element.attribute('value') || ''
|
257
|
-
rescue Selenium::WebDriver::Error::InvalidElementStateError
|
258
|
-
""
|
259
|
-
end
|
256
|
+
attribute_value('value') || ''
|
257
|
+
rescue Selenium::WebDriver::Error::InvalidElementStateError
|
258
|
+
''
|
260
259
|
end
|
261
260
|
|
262
261
|
#
|
263
262
|
# Returns given attribute value of element.
|
264
263
|
#
|
265
264
|
# @example
|
266
|
-
# browser.a(:id => "
|
267
|
-
# #=> "
|
265
|
+
# browser.a(:id => "link_2").attribute_value "title"
|
266
|
+
# #=> "link_title_2"
|
268
267
|
#
|
269
268
|
# @param [String] attribute_name
|
270
|
-
# @return [String]
|
269
|
+
# @return [String, nil]
|
271
270
|
#
|
272
271
|
|
273
272
|
def attribute_value(attribute_name)
|
274
273
|
assert_exists
|
275
|
-
@element.attribute attribute_name
|
274
|
+
element_call { @element.attribute attribute_name }
|
276
275
|
end
|
277
276
|
|
278
277
|
#
|
279
278
|
# Returns outer (inner + element itself) HTML code of element.
|
280
279
|
#
|
281
280
|
# @example
|
282
|
-
# browser.div(:id =>
|
283
|
-
# #=> "<div id=\"foo\"><a>
|
281
|
+
# browser.div(:id => 'foo').outer_html
|
282
|
+
# #=> "<div id=\"foo\"><a href=\"#\">hello</a></div>"
|
284
283
|
#
|
285
284
|
# @return [String]
|
286
285
|
#
|
287
286
|
|
288
287
|
def outer_html
|
289
288
|
assert_exists
|
290
|
-
execute_atom(:getOuterHtml, @element).strip
|
289
|
+
element_call { execute_atom(:getOuterHtml, @element) }.strip
|
291
290
|
end
|
292
291
|
|
293
292
|
alias_method :html, :outer_html
|
@@ -296,29 +295,30 @@ module Watir
|
|
296
295
|
# Returns inner HTML code of element.
|
297
296
|
#
|
298
297
|
# @example
|
299
|
-
# browser.div(:id =>
|
300
|
-
# #=> "<a>
|
298
|
+
# browser.div(:id => 'foo').inner_html
|
299
|
+
# #=> "<a href=\"#\">hello</a>"
|
301
300
|
#
|
302
301
|
# @return [String]
|
303
302
|
#
|
304
303
|
|
305
304
|
def inner_html
|
306
305
|
assert_exists
|
307
|
-
execute_atom(:getInnerHtml, @element).strip
|
306
|
+
element_call { execute_atom(:getInnerHtml, @element) }.strip
|
308
307
|
end
|
309
308
|
|
310
309
|
#
|
311
310
|
# Sends sequence of keystrokes to element.
|
312
311
|
#
|
313
312
|
# @example
|
314
|
-
# browser.
|
313
|
+
# browser.text_field(:name => "new_user_first_name").send_keys "Watir", :return
|
315
314
|
#
|
316
315
|
# @param [String, Symbol] *args
|
317
316
|
#
|
318
317
|
|
319
318
|
def send_keys(*args)
|
320
319
|
assert_exists
|
321
|
-
|
320
|
+
assert_writable
|
321
|
+
element_call { @element.send_keys(*args) }
|
322
322
|
end
|
323
323
|
|
324
324
|
#
|
@@ -330,7 +330,7 @@ module Watir
|
|
330
330
|
|
331
331
|
def focus
|
332
332
|
assert_exists
|
333
|
-
driver.execute_script "return arguments[0].focus()", @element
|
333
|
+
element_call { driver.execute_script "return arguments[0].focus()", @element }
|
334
334
|
end
|
335
335
|
|
336
336
|
#
|
@@ -341,7 +341,7 @@ module Watir
|
|
341
341
|
|
342
342
|
def focused?
|
343
343
|
assert_exists
|
344
|
-
@element == driver.switch_to.active_element
|
344
|
+
element_call { @element == driver.switch_to.active_element }
|
345
345
|
end
|
346
346
|
|
347
347
|
#
|
@@ -349,9 +349,9 @@ module Watir
|
|
349
349
|
# Note that you may omit "on" from event name.
|
350
350
|
#
|
351
351
|
# @example
|
352
|
-
# browser.
|
353
|
-
# browser.
|
354
|
-
# browser.
|
352
|
+
# browser.button(:name => "new_user_button").fire_event :click
|
353
|
+
# browser.button(:name => "new_user_button").fire_event "mousemove"
|
354
|
+
# browser.button(:name => "new_user_button").fire_event "onmouseover"
|
355
355
|
#
|
356
356
|
# @param [String, Symbol] event_name
|
357
357
|
#
|
@@ -360,7 +360,7 @@ module Watir
|
|
360
360
|
assert_exists
|
361
361
|
event_name = event_name.to_s.sub(/^on/, '').downcase
|
362
362
|
|
363
|
-
execute_atom :fireEvent, @element, event_name
|
363
|
+
element_call { execute_atom :fireEvent, @element, event_name }
|
364
364
|
end
|
365
365
|
|
366
366
|
#
|
@@ -370,7 +370,7 @@ module Watir
|
|
370
370
|
def parent
|
371
371
|
assert_exists
|
372
372
|
|
373
|
-
e = execute_atom :getParentElement, @element
|
373
|
+
e = element_call { execute_atom :getParentElement, @element }
|
374
374
|
|
375
375
|
if e.kind_of?(Selenium::WebDriver::Element)
|
376
376
|
Watir.element_class_for(e.tag_name.downcase).new(@parent, :element => e)
|
@@ -402,7 +402,7 @@ module Watir
|
|
402
402
|
|
403
403
|
def visible?
|
404
404
|
assert_exists
|
405
|
-
@element.displayed?
|
405
|
+
element_call { @element.displayed? }
|
406
406
|
end
|
407
407
|
|
408
408
|
#
|
@@ -414,7 +414,7 @@ module Watir
|
|
414
414
|
|
415
415
|
def present?
|
416
416
|
exists? && visible?
|
417
|
-
rescue Selenium::WebDriver::Error::
|
417
|
+
rescue Selenium::WebDriver::Error::StaleElementReferenceError, UnknownObjectException
|
418
418
|
# if the element disappears between the exists? and visible? calls,
|
419
419
|
# consider it not present.
|
420
420
|
false
|
@@ -424,10 +424,8 @@ module Watir
|
|
424
424
|
# Returns given style property of this element.
|
425
425
|
#
|
426
426
|
# @example
|
427
|
-
# browser.
|
428
|
-
# #=> "
|
429
|
-
# browser.a(:id => "foo").style "display"
|
430
|
-
# #=> "block"
|
427
|
+
# browser.button(:value => "Delete").style #=> "border: 4px solid red;"
|
428
|
+
# browser.button(:value => "Delete").style("border") #=> "4px solid red"
|
431
429
|
#
|
432
430
|
# @param [String] property
|
433
431
|
# @return [String]
|
@@ -436,7 +434,7 @@ module Watir
|
|
436
434
|
def style(property = nil)
|
437
435
|
if property
|
438
436
|
assert_exists
|
439
|
-
@element.style property
|
437
|
+
element_call { @element.style property }
|
440
438
|
else
|
441
439
|
attribute_value("style").to_s.strip
|
442
440
|
end
|
@@ -497,39 +495,35 @@ module Watir
|
|
497
495
|
protected
|
498
496
|
|
499
497
|
def assert_exists
|
500
|
-
|
501
|
-
assert_not_stale
|
502
|
-
|
498
|
+
begin
|
499
|
+
assert_not_stale if @element ||= @selector[:element]
|
500
|
+
rescue UnknownObjectException => ex
|
501
|
+
raise ex if @selector[:element] || !Watir.always_locate?
|
503
502
|
end
|
504
503
|
|
505
|
-
@element
|
506
|
-
|
507
|
-
if @element
|
508
|
-
assert_not_stale
|
509
|
-
else
|
510
|
-
@element = locate
|
504
|
+
@element ||= locate
|
511
505
|
|
512
|
-
|
513
|
-
|
514
|
-
end
|
506
|
+
unless @element
|
507
|
+
raise UnknownObjectException, "unable to locate element, using #{selector_string}"
|
515
508
|
end
|
516
509
|
end
|
517
510
|
|
518
511
|
def assert_not_stale
|
512
|
+
@parent.assert_not_stale
|
513
|
+
@parent.switch_to! if @parent.is_a? IFrame
|
519
514
|
@element.enabled? # do a staleness check - any wire call will do.
|
520
515
|
rescue Selenium::WebDriver::Error::ObsoleteElementError => ex
|
521
516
|
# don't cache a stale element - it will never come back
|
522
|
-
|
517
|
+
reset!
|
523
518
|
raise UnknownObjectException, "#{ex.message} - #{selector_string}"
|
524
519
|
end
|
525
520
|
|
526
521
|
def reset!
|
527
|
-
@parent.reset!
|
528
522
|
@element = nil
|
529
523
|
end
|
530
524
|
|
531
525
|
def locate
|
532
|
-
@parent.assert_exists
|
526
|
+
@parent.is_a?(IFrame) ? @parent.switch_to! : @parent.assert_exists
|
533
527
|
locator_class.new(@parent.wd, @selector, self.class.attribute_list).locate
|
534
528
|
end
|
535
529
|
|
@@ -545,11 +539,15 @@ module Watir
|
|
545
539
|
|
546
540
|
def attribute?(attribute)
|
547
541
|
assert_exists
|
548
|
-
|
542
|
+
element_call do
|
543
|
+
!!execute_atom(:getAttribute, @element, attribute.to_s.downcase)
|
544
|
+
end
|
549
545
|
end
|
550
546
|
|
551
547
|
def assert_enabled
|
552
|
-
|
548
|
+
unless element_call { @element.enabled? }
|
549
|
+
raise ObjectDisabledException, "object is disabled #{selector_string}"
|
550
|
+
end
|
553
551
|
end
|
554
552
|
|
555
553
|
def assert_writable
|
@@ -572,6 +570,15 @@ module Watir
|
|
572
570
|
end
|
573
571
|
end
|
574
572
|
|
573
|
+
def element_call
|
574
|
+
yield
|
575
|
+
rescue Selenium::WebDriver::Error::StaleElementReferenceError
|
576
|
+
raise unless Watir.always_locate?
|
577
|
+
reset!
|
578
|
+
assert_exists
|
579
|
+
retry
|
580
|
+
end
|
581
|
+
|
575
582
|
def method_missing(meth, *args, &blk)
|
576
583
|
method = meth.to_s
|
577
584
|
if method =~ ElementLocator::WILDCARD_ATTRIBUTE
|