watir-webdriver 0.8.0 → 0.9.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 +13 -10
- data/CHANGES.md +16 -0
- data/README.md +5 -2
- data/Rakefile +21 -0
- data/lib/watir-webdriver.rb +1 -0
- data/lib/watir-webdriver/after_hooks.rb +132 -0
- data/lib/watir-webdriver/alert.rb +5 -3
- data/lib/watir-webdriver/browser.rb +21 -60
- data/lib/watir-webdriver/element_collection.rb +2 -0
- data/lib/watir-webdriver/elements/checkbox.rb +1 -0
- data/lib/watir-webdriver/elements/element.rb +13 -11
- data/lib/watir-webdriver/elements/form.rb +1 -1
- data/lib/watir-webdriver/elements/select.rb +19 -9
- data/lib/watir-webdriver/version.rb +1 -1
- data/lib/watir-webdriver/wait.rb +61 -11
- data/spec/click_spec.rb +0 -24
- data/spec/implementation.rb +2 -1
- data/support/doctest_helper.rb +0 -5
- data/support/travis.sh +2 -21
- data/watir-webdriver.gemspec +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97a842500bc21408f519b175ca58df6c8533491a
|
4
|
+
data.tar.gz: 65dd8b201a511705730c8e21c6e691e615b984c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06f2ac29fc1ba7ade5cc45b5291757fe1d6c4f907a205ddb9aaf21a78208dc603afcb3aea128ff83ac4e677378cef87f8135724559b59f9c6a699b85c8f8ff27
|
7
|
+
data.tar.gz: 01b2df0459f6fba07f5e4739e1bbd5ae3b7654c0eaf4d316725f1aa0a91c1e0e38508393d901f91f070c1994879b4cb58e555dbad9448907af08bd92fc997fdf
|
data/.travis.yml
CHANGED
@@ -1,13 +1,21 @@
|
|
1
|
+
sudo: false
|
1
2
|
rvm:
|
2
3
|
- 2.0
|
3
4
|
- 2.1
|
5
|
+
- 2.2
|
6
|
+
addons:
|
7
|
+
apt:
|
8
|
+
packages:
|
9
|
+
- unzip
|
10
|
+
- libxss1
|
11
|
+
cache: bundler
|
4
12
|
notifications:
|
5
13
|
recipients:
|
6
14
|
- p0deje@gmail.com
|
7
15
|
- jarmo.p@gmail.com
|
16
|
+
- titusfortner@gmail.com
|
8
17
|
irc: "irc.freenode.net#watir"
|
9
|
-
before_script:
|
10
|
-
- support/travis.sh
|
18
|
+
before_script: support/travis.sh
|
11
19
|
script: bundle exec rake $RAKE_TASK
|
12
20
|
env:
|
13
21
|
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=firefox
|
@@ -16,12 +24,7 @@ env:
|
|
16
24
|
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=chrome
|
17
25
|
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=chrome ALWAYS_LOCATE=false
|
18
26
|
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=chrome PREFER_CSS=1 SELECTOR_STATS=1
|
19
|
-
|
20
|
-
|
21
|
-
|
27
|
+
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs
|
28
|
+
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
|
29
|
+
- RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
|
22
30
|
- RAKE_TASK=yard:doctest
|
23
|
-
matrix:
|
24
|
-
allow_failures:
|
25
|
-
- env: RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs
|
26
|
-
- env: RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
|
27
|
-
- env: RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
### 0.9.0 (2015-10-08)
|
2
|
+
|
3
|
+
* Improve performance for Select#include? (#375, thanks @Conky5)
|
4
|
+
* Add support for waiting for elements to be enabled (#370, thanks @Rodney-QAGeek)
|
5
|
+
* Remove unnecessary wire calls for navigation (#369)
|
6
|
+
* Improve performance for Select#selected? with large drop-down lists (#367)
|
7
|
+
* Add stale element protection and correct context assurance for Browser#text (#366)
|
8
|
+
* Restore behavior for Wait#until to return result of block (#362, thanks @chrismikehogan)
|
9
|
+
* Fix context switching between frames for element collections (#361)
|
10
|
+
* AfterHooks run after closing an alert (#352)
|
11
|
+
* New AfterHooks API that deprecates Checkers:
|
12
|
+
* Use `Browser#after_hooks#add` instead of `Browser#add_checker`
|
13
|
+
* Use `Browser#after_hooks#delete` instead of `Browser#disable_checker`
|
14
|
+
* Use `Browser#after_hooks#run` instead of `Browser#run_checkers`
|
15
|
+
* Use `Browser#after_hooks#without` instead of `Browser#without_checkers`
|
16
|
+
|
1
17
|
### 0.8.0 (2015-06-26)
|
2
18
|
|
3
19
|
* Ruby 1.8 is no longer supported. Ruby 1.9 still works, but not supported as well (#327)
|
data/README.md
CHANGED
@@ -27,9 +27,12 @@ browser.close
|
|
27
27
|
Description
|
28
28
|
-----------
|
29
29
|
|
30
|
-
The
|
30
|
+
The majority of element methods Watir provides with is autogenerated from specifications.
|
31
|
+
This is done by extracting the IDL parts from the spec and processing them with the WebIDL gem (link below).
|
32
|
+
Currently supported specifications are:
|
31
33
|
|
32
|
-
|
34
|
+
* [HTML](https://www.whatwg.org/specs/web-apps/current-work/) (`lib/watir-webdriver/elements/html_generated.rb`)
|
35
|
+
* [SVG](http://www.w3.org/TR/SVG2/single-page.html) (`lib/watir-webdriver/elements/svg_generated.rb`)
|
33
36
|
|
34
37
|
Specs
|
35
38
|
-----
|
data/Rakefile
CHANGED
@@ -121,3 +121,24 @@ end
|
|
121
121
|
load "spec/watirspec/watirspec.rake" if File.exist?("spec/watirspec/watirspec.rake")
|
122
122
|
|
123
123
|
task default: [:spec, 'yard:doctest']
|
124
|
+
|
125
|
+
namespace :spec do
|
126
|
+
require 'selenium-webdriver'
|
127
|
+
|
128
|
+
desc 'Run specs in all browsers'
|
129
|
+
task all_browsers: [:firefox,
|
130
|
+
:firefox_nightly,
|
131
|
+
:chrome,
|
132
|
+
(:safari if Selenium::WebDriver::Platform.os == :macosx),
|
133
|
+
(:ie if Selenium::WebDriver::Platform.os == :windows),
|
134
|
+
(:edge if Selenium::WebDriver::Platform.os == :windows),
|
135
|
+
:phantomjs].compact
|
136
|
+
|
137
|
+
%w(firefox firefox_nightly chrome safari phantomjs ie edge).each do |browser|
|
138
|
+
desc "Run specs in #{browser}"
|
139
|
+
task browser do
|
140
|
+
ENV['WATIR_WEBDRIVER_BROWSER'] = browser
|
141
|
+
Rake::Task['spec'].execute
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
data/lib/watir-webdriver.rb
CHANGED
@@ -18,6 +18,7 @@ require 'watir-webdriver/locators/child_row_locator'
|
|
18
18
|
require 'watir-webdriver/locators/child_cell_locator'
|
19
19
|
require 'watir-webdriver/browser'
|
20
20
|
require 'watir-webdriver/screenshot'
|
21
|
+
require 'watir-webdriver/after_hooks'
|
21
22
|
|
22
23
|
module Watir
|
23
24
|
@always_locate = true
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Watir
|
2
|
+
|
3
|
+
#
|
4
|
+
# After hooks are blocks that run after certain browser events.
|
5
|
+
# They are generally used to ensure application under test does not encounter
|
6
|
+
# any error and are automatically executed after following events:
|
7
|
+
# 1. Open URL.
|
8
|
+
# 2. Refresh page.
|
9
|
+
# 3. Click, double-click or right-click on element.
|
10
|
+
# 4. Alert closing.
|
11
|
+
#
|
12
|
+
|
13
|
+
class AfterHooks
|
14
|
+
include Enumerable
|
15
|
+
|
16
|
+
def initialize(browser)
|
17
|
+
@browser = browser
|
18
|
+
@after_hooks = []
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
# Adds new after hook.
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# browser.after_hooks.add do |browser|
|
26
|
+
# browser.text.include?("Server Error") and puts "Application exception or 500 error!"
|
27
|
+
# end
|
28
|
+
# browser.goto "www.watir.com/404"
|
29
|
+
# "Application exception or 500 error!"
|
30
|
+
#
|
31
|
+
# @param [#call] after_hook Object responding to call
|
32
|
+
# @yield after_hook block
|
33
|
+
# @yieldparam [Watir::Browser]
|
34
|
+
#
|
35
|
+
|
36
|
+
def add(after_hook = nil, &block)
|
37
|
+
if block_given?
|
38
|
+
@after_hooks << block
|
39
|
+
elsif after_hook.respond_to? :call
|
40
|
+
@after_hooks << after_hook
|
41
|
+
else
|
42
|
+
raise ArgumentError, "expected block or object responding to #call"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
alias_method :<<, :add
|
46
|
+
|
47
|
+
#
|
48
|
+
# Deletes after hook.
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
# browser.after_hooks.add do |browser|
|
52
|
+
# browser.text.include?("Server Error") and puts "Application exception or 500 error!"
|
53
|
+
# end
|
54
|
+
# browser.goto "www.watir.com/404"
|
55
|
+
# "Application exception or 500 error!"
|
56
|
+
# browser.after_hooks.delete browser.after_hooks[0]
|
57
|
+
# browser.refresh
|
58
|
+
#
|
59
|
+
|
60
|
+
def delete(after_hook)
|
61
|
+
@after_hooks.delete(after_hook)
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# Runs after hooks.
|
66
|
+
#
|
67
|
+
|
68
|
+
def run
|
69
|
+
if @after_hooks.any? && @browser.window.present?
|
70
|
+
each { |after_hook| after_hook.call(@browser) }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# Executes a block without running error after hooks.
|
76
|
+
#
|
77
|
+
# @example
|
78
|
+
# browser.after_hooks.without do |browser|
|
79
|
+
# browser.element(name: "new_user_button").click
|
80
|
+
# end
|
81
|
+
#
|
82
|
+
# @yield Block that is executed without after hooks being run
|
83
|
+
# @yieldparam [Watir::Browser]
|
84
|
+
#
|
85
|
+
|
86
|
+
def without
|
87
|
+
current_after_hooks = @after_hooks
|
88
|
+
@after_hooks = []
|
89
|
+
yield(@browser)
|
90
|
+
ensure
|
91
|
+
@after_hooks = current_after_hooks
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# Yields each after hook.
|
96
|
+
#
|
97
|
+
# @yieldparam [#call] after_hook Object responding to call
|
98
|
+
#
|
99
|
+
|
100
|
+
def each
|
101
|
+
@after_hooks.each { |after_hook| yield after_hook }
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
# Returns number of after hooks.
|
106
|
+
#
|
107
|
+
# @example
|
108
|
+
# browser.after_hooks.add { puts 'Some after_hook.' }
|
109
|
+
# browser.after_hooks.length
|
110
|
+
# #=> 1
|
111
|
+
#
|
112
|
+
# @return [Fixnum]
|
113
|
+
#
|
114
|
+
|
115
|
+
def length
|
116
|
+
@after_hooks.length
|
117
|
+
end
|
118
|
+
alias_method :size, :length
|
119
|
+
|
120
|
+
#
|
121
|
+
# Gets the after hook at the given index.
|
122
|
+
#
|
123
|
+
# @param [Fixnum] index
|
124
|
+
# @return [#call]
|
125
|
+
#
|
126
|
+
|
127
|
+
def [](index)
|
128
|
+
@after_hooks[index]
|
129
|
+
end
|
130
|
+
|
131
|
+
end # AfterHooks
|
132
|
+
end # Watir
|
@@ -3,8 +3,8 @@ module Watir
|
|
3
3
|
|
4
4
|
include EventuallyPresent
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(browser)
|
7
|
+
@browser = browser
|
8
8
|
@alert = nil
|
9
9
|
end
|
10
10
|
|
@@ -35,6 +35,7 @@ module Watir
|
|
35
35
|
def ok
|
36
36
|
assert_exists
|
37
37
|
@alert.accept
|
38
|
+
@browser.after_hooks.run
|
38
39
|
end
|
39
40
|
|
40
41
|
#
|
@@ -49,6 +50,7 @@ module Watir
|
|
49
50
|
def close
|
50
51
|
assert_exists
|
51
52
|
@alert.dismiss
|
53
|
+
@browser.after_hooks.run
|
52
54
|
end
|
53
55
|
|
54
56
|
#
|
@@ -93,7 +95,7 @@ module Watir
|
|
93
95
|
private
|
94
96
|
|
95
97
|
def assert_exists
|
96
|
-
@alert = @
|
98
|
+
@alert = @browser.driver.switch_to.alert
|
97
99
|
rescue Selenium::WebDriver::Error::NoAlertPresentError
|
98
100
|
raise Exception::UnknownObjectException, 'unable to locate alert'
|
99
101
|
end
|
@@ -10,6 +10,7 @@ module Watir
|
|
10
10
|
include Waitable
|
11
11
|
|
12
12
|
attr_reader :driver
|
13
|
+
attr_reader :after_hooks
|
13
14
|
alias_method :wd, :driver # ensures duck typing with Watir::Element
|
14
15
|
|
15
16
|
class << self
|
@@ -49,9 +50,9 @@ module Watir
|
|
49
50
|
raise ArgumentError, "expected Symbol or Selenium::WebDriver::Driver, got #{browser.class}"
|
50
51
|
end
|
51
52
|
|
52
|
-
@
|
53
|
+
@after_hooks = AfterHooks.new(self)
|
53
54
|
@current_frame = nil
|
54
|
-
@closed
|
55
|
+
@closed = false
|
55
56
|
end
|
56
57
|
|
57
58
|
def inspect
|
@@ -74,9 +75,9 @@ module Watir
|
|
74
75
|
uri = "http://#{uri}" unless uri =~ URI.regexp
|
75
76
|
|
76
77
|
@driver.navigate.to uri
|
77
|
-
|
78
|
+
@after_hooks.run
|
78
79
|
|
79
|
-
|
80
|
+
uri
|
80
81
|
end
|
81
82
|
|
82
83
|
#
|
@@ -169,7 +170,7 @@ module Watir
|
|
169
170
|
#
|
170
171
|
|
171
172
|
def text
|
172
|
-
|
173
|
+
body.text
|
173
174
|
end
|
174
175
|
|
175
176
|
#
|
@@ -190,7 +191,7 @@ module Watir
|
|
190
191
|
#
|
191
192
|
|
192
193
|
def alert
|
193
|
-
Alert.new
|
194
|
+
Alert.new(self)
|
194
195
|
end
|
195
196
|
|
196
197
|
#
|
@@ -199,7 +200,7 @@ module Watir
|
|
199
200
|
|
200
201
|
def refresh
|
201
202
|
@driver.navigate.refresh
|
202
|
-
|
203
|
+
@after_hooks.run
|
203
204
|
end
|
204
205
|
|
205
206
|
#
|
@@ -281,79 +282,39 @@ module Watir
|
|
281
282
|
end
|
282
283
|
|
283
284
|
#
|
284
|
-
#
|
285
|
-
#
|
286
|
-
# Checkers are generally used to ensure application under test does not encounter
|
287
|
-
# any error. They are automatically executed after following events:
|
288
|
-
# 1. Open URL
|
289
|
-
# 2. Refresh page
|
290
|
-
# 3. Click, double-click or right-click on element
|
291
|
-
#
|
292
|
-
# @example
|
293
|
-
# browser.add_checker do |page|
|
294
|
-
# page.text.include?("Server Error") and puts "Application exception or 500 error!"
|
295
|
-
# end
|
296
|
-
# browser.goto "www.watir.com/404"
|
297
|
-
# "Application exception or 500 error!"
|
298
|
-
#
|
299
|
-
# @param [#call] checker Object responding to call
|
300
|
-
# @yield Checker block
|
301
|
-
# @yieldparam [Watir::Browser]
|
285
|
+
# @deprecated Use `Watir::AfterHooks#add` instead
|
302
286
|
#
|
303
287
|
|
304
288
|
def add_checker(checker = nil, &block)
|
305
|
-
|
306
|
-
|
307
|
-
elsif checker.respond_to? :call
|
308
|
-
@error_checkers << checker
|
309
|
-
else
|
310
|
-
raise ArgumentError, "expected block or object responding to #call"
|
311
|
-
end
|
289
|
+
warn 'Browser#add_checker is deprecated. Use Browser#after_hooks#add instead.'
|
290
|
+
@after_hooks.add(checker, &block)
|
312
291
|
end
|
313
292
|
|
314
293
|
#
|
315
|
-
#
|
316
|
-
#
|
317
|
-
# @example
|
318
|
-
# checker = lambda do |page|
|
319
|
-
# page.text.include?("Server Error") and puts "Application exception or 500 error!"
|
320
|
-
# end
|
321
|
-
# browser.add_checker checker
|
322
|
-
# browser.goto "www.watir.com/404"
|
323
|
-
# "Application exception or 500 error!"
|
324
|
-
# browser.disable_checker checker
|
325
|
-
# browser.refresh
|
294
|
+
# @deprecated Use `Watir::AfterHooks#delete` instead
|
326
295
|
#
|
327
296
|
|
328
297
|
def disable_checker(checker)
|
329
|
-
|
298
|
+
warn 'Browser#disable_checker is deprecated. Use Browser#after_hooks#delete instead.'
|
299
|
+
@after_hooks.delete(checker)
|
330
300
|
end
|
331
301
|
|
332
302
|
#
|
333
|
-
#
|
303
|
+
# @deprecated Use `Watir::AfterHooks#run` instead
|
334
304
|
#
|
335
305
|
|
336
306
|
def run_checkers
|
337
|
-
|
307
|
+
warn 'Browser#run_checkers is deprecated. Use Browser#after_hooks#run instead.'
|
308
|
+
@after_hooks.run
|
338
309
|
end
|
339
310
|
|
340
311
|
#
|
341
|
-
#
|
342
|
-
#
|
343
|
-
# @example
|
344
|
-
# browser.without_checkers do
|
345
|
-
# browser.element(name: "new_user_button").click
|
346
|
-
# end
|
347
|
-
#
|
348
|
-
# @yieldparam [Watir::Browser]
|
312
|
+
# @deprecated Use `Watir::AfterHooks#without` instead
|
349
313
|
#
|
350
314
|
|
351
|
-
def without_checkers
|
352
|
-
|
353
|
-
@
|
354
|
-
yield(self)
|
355
|
-
ensure
|
356
|
-
@error_checkers = current_checkers
|
315
|
+
def without_checkers(&block)
|
316
|
+
warn 'Browser#without_checkers is deprecated. Use Browser#after_hooks#without instead.'
|
317
|
+
@after_hooks.without(&block)
|
357
318
|
end
|
358
319
|
|
359
320
|
#
|
@@ -129,7 +129,7 @@ module Watir
|
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
|
-
|
132
|
+
browser.after_hooks.run
|
133
133
|
end
|
134
134
|
|
135
135
|
#
|
@@ -145,7 +145,7 @@ module Watir
|
|
145
145
|
assert_has_input_devices_for :double_click
|
146
146
|
|
147
147
|
element_call { driver.action.double_click(@element).perform }
|
148
|
-
|
148
|
+
browser.after_hooks.run
|
149
149
|
end
|
150
150
|
|
151
151
|
#
|
@@ -161,7 +161,7 @@ module Watir
|
|
161
161
|
assert_has_input_devices_for :right_click
|
162
162
|
|
163
163
|
element_call { driver.action.context_click(@element).perform }
|
164
|
-
|
164
|
+
browser.after_hooks.run
|
165
165
|
end
|
166
166
|
|
167
167
|
#
|
@@ -403,6 +403,16 @@ module Watir
|
|
403
403
|
element_call { @element.displayed? }
|
404
404
|
end
|
405
405
|
|
406
|
+
#
|
407
|
+
# Returns true if this element is present and enabled on the page.
|
408
|
+
#
|
409
|
+
# @return [Boolean]
|
410
|
+
#
|
411
|
+
|
412
|
+
def enabled?
|
413
|
+
present? && element_call { @element.enabled? }
|
414
|
+
end
|
415
|
+
|
406
416
|
#
|
407
417
|
# Returns true if the element exists and is visible on the page.
|
408
418
|
#
|
@@ -438,14 +448,6 @@ module Watir
|
|
438
448
|
end
|
439
449
|
end
|
440
450
|
|
441
|
-
#
|
442
|
-
# Runs checkers.
|
443
|
-
#
|
444
|
-
|
445
|
-
def run_checkers
|
446
|
-
@parent.run_checkers
|
447
|
-
end
|
448
|
-
|
449
451
|
#
|
450
452
|
# Cast this Element instance to a more specific subtype.
|
451
453
|
#
|
@@ -45,8 +45,13 @@ module Watir
|
|
45
45
|
#
|
46
46
|
|
47
47
|
def include?(str_or_rx)
|
48
|
-
|
49
|
-
|
48
|
+
assert_exists
|
49
|
+
|
50
|
+
element_call do
|
51
|
+
@element.find_elements(:tag_name, 'option').any? do |e|
|
52
|
+
str_or_rx === e.text || str_or_rx === e.attribute(:label)
|
53
|
+
end
|
54
|
+
end
|
50
55
|
end
|
51
56
|
|
52
57
|
#
|
@@ -86,17 +91,22 @@ module Watir
|
|
86
91
|
|
87
92
|
def selected?(str_or_rx)
|
88
93
|
assert_exists
|
89
|
-
|
90
|
-
|
91
|
-
|
94
|
+
|
95
|
+
match_found = false
|
96
|
+
|
97
|
+
element_call do
|
98
|
+
@element.find_elements(:tag_name, 'option').each do |e|
|
99
|
+
matched = str_or_rx === e.text || str_or_rx === e.attribute(:label)
|
100
|
+
if matched
|
101
|
+
return true if e.selected?
|
102
|
+
match_found = true
|
103
|
+
end
|
92
104
|
end
|
93
105
|
end
|
94
106
|
|
95
|
-
|
96
|
-
raise UnknownObjectException, "Unable to locate option matching #{str_or_rx.inspect}"
|
97
|
-
end
|
107
|
+
raise(UnknownObjectException, "Unable to locate option matching #{str_or_rx.inspect}") unless match_found
|
98
108
|
|
99
|
-
|
109
|
+
false
|
100
110
|
end
|
101
111
|
|
102
112
|
#
|
data/lib/watir-webdriver/wait.rb
CHANGED
@@ -37,7 +37,10 @@ module Watir
|
|
37
37
|
|
38
38
|
def until(timeout = nil, message = nil)
|
39
39
|
timeout ||= Watir.default_timeout
|
40
|
-
run_with_timer(timeout)
|
40
|
+
run_with_timer(timeout) do
|
41
|
+
result = yield(self)
|
42
|
+
return result if result
|
43
|
+
end
|
41
44
|
raise TimeoutError, message_for(timeout, message)
|
42
45
|
end
|
43
46
|
|
@@ -91,15 +94,7 @@ module Watir
|
|
91
94
|
end
|
92
95
|
end
|
93
96
|
|
94
|
-
|
95
|
-
# Wraps an Element so that any subsequent method calls are
|
96
|
-
# put on hold until the element is present (exists and is visible) on the page.
|
97
|
-
#
|
98
|
-
|
99
|
-
class WhenPresentDecorator
|
100
|
-
extend Forwardable
|
101
|
-
|
102
|
-
def_delegator :@element, :present?
|
97
|
+
class BaseDecorator
|
103
98
|
|
104
99
|
def initialize(element, timeout, message = nil)
|
105
100
|
@element = element
|
@@ -116,12 +111,43 @@ module Watir
|
|
116
111
|
raise NoMethodError, "undefined method `#{m}' for #{@element.inspect}:#{@element.class}"
|
117
112
|
end
|
118
113
|
|
119
|
-
Watir::Wait.until(@timeout, @message) {
|
114
|
+
Watir::Wait.until(@timeout, @message) { wait_until }
|
120
115
|
|
121
116
|
@element.__send__(m, *args, &block)
|
122
117
|
end
|
118
|
+
end
|
119
|
+
|
120
|
+
#
|
121
|
+
# Wraps an Element so that any subsequent method calls are
|
122
|
+
# put on hold until the element is present (exists and is visible) on the page.
|
123
|
+
#
|
124
|
+
|
125
|
+
class WhenPresentDecorator < BaseDecorator
|
126
|
+
extend Forwardable
|
127
|
+
|
128
|
+
def_delegator :@element, :present?
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def wait_until
|
133
|
+
@element.present?
|
134
|
+
end
|
123
135
|
end # WhenPresentDecorator
|
124
136
|
|
137
|
+
#
|
138
|
+
# Wraps an Element so that any subsequent method calls are
|
139
|
+
# put on hold until the element is enabled (exists and is enabled) on the page.
|
140
|
+
#
|
141
|
+
|
142
|
+
class WhenEnabledDecorator < BaseDecorator
|
143
|
+
|
144
|
+
private
|
145
|
+
|
146
|
+
def wait_until
|
147
|
+
@element.enabled?
|
148
|
+
end
|
149
|
+
end # WhenEnabledDecorator
|
150
|
+
|
125
151
|
#
|
126
152
|
# Convenience methods for things that eventually become present.
|
127
153
|
#
|
@@ -155,6 +181,30 @@ module Watir
|
|
155
181
|
end
|
156
182
|
end
|
157
183
|
|
184
|
+
#
|
185
|
+
# Waits until the element is enabled.
|
186
|
+
#
|
187
|
+
# @example
|
188
|
+
# browser.button(name: "new_user_button_2").when_enabled.click
|
189
|
+
#
|
190
|
+
# @param [Fixnum] timeout seconds to wait before timing out
|
191
|
+
#
|
192
|
+
# @see Watir::Wait
|
193
|
+
# @see Watir::Element#enabled?
|
194
|
+
#
|
195
|
+
|
196
|
+
def when_enabled(timeout = nil)
|
197
|
+
timeout ||= Watir.default_timeout
|
198
|
+
message = "waiting for #{selector_string} to become enabled"
|
199
|
+
|
200
|
+
if block_given?
|
201
|
+
Watir::Wait.until(timeout, message) { enabled? }
|
202
|
+
yield self
|
203
|
+
else
|
204
|
+
WhenEnabledDecorator.new(self, timeout, message)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
158
208
|
#
|
159
209
|
# Waits until the element is present.
|
160
210
|
#
|
data/spec/click_spec.rb
CHANGED
@@ -15,29 +15,5 @@ describe Watir::Element do
|
|
15
15
|
expect(browser.element(text: "You Clicked It!")).to exist
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
19
|
-
# TODO: make guards more flexible, in reality this currently only works on linux with native events
|
20
|
-
compliant_on %i(webdriver firefox native_events) do
|
21
|
-
it "should perform a click with no modifier keys" do
|
22
|
-
clicker.click
|
23
|
-
expect(log).to eq ["shift=false alt=false"]
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should perform a click with the shift key pressed" do
|
27
|
-
clicker.click(:shift)
|
28
|
-
expect(log).to eq ["shift=true alt=false"]
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should perform a click with the alt key pressed" do
|
32
|
-
clicker.click(:alt)
|
33
|
-
expect(log).to eq ["shift=false alt=true"]
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should perform a click with the shift and alt keys pressed" do
|
37
|
-
clicker.click(:shift, :alt)
|
38
|
-
expect(log).to eq ["shift=true alt=true"]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
18
|
end
|
43
19
|
end
|
data/spec/implementation.rb
CHANGED
@@ -72,7 +72,8 @@ class ImplementationConfig
|
|
72
72
|
matching_browser, # guard only applies to this browser
|
73
73
|
matching_browser_with_version, # guard only applies to this browser with specific version
|
74
74
|
[:webdriver, matching_browser], # guard only applies to this browser on webdriver
|
75
|
-
[:webdriver, matching_browser_with_version] # guard only applies to this browser with specific version on webdriver
|
75
|
+
[:webdriver, matching_browser_with_version], # guard only applies to this browser with specific version on webdriver
|
76
|
+
[matching_browser, Selenium::WebDriver::Platform.os] # guard only applies to this browser with this OS
|
76
77
|
]
|
77
78
|
|
78
79
|
if native_events?
|
data/support/doctest_helper.rb
CHANGED
@@ -33,11 +33,6 @@ YARD::Doctest.configure do |doctest|
|
|
33
33
|
browser.button(id: 'prompt').click
|
34
34
|
end
|
35
35
|
|
36
|
-
doctest.before('Watir::CheckBox#set') do
|
37
|
-
browser.goto WatirSpec.url_for('forms_with_input_elements.html')
|
38
|
-
checkbox = browser.checkbox(id: 'new_user_interests_cars')
|
39
|
-
end
|
40
|
-
|
41
36
|
%w[Watir::Browser#execute_script Watir::Element#drag_and_drop].each do |name|
|
42
37
|
doctest.before(name) do
|
43
38
|
browser.goto WatirSpec.url_for('drag_and_drop.html')
|
data/support/travis.sh
CHANGED
@@ -3,9 +3,6 @@
|
|
3
3
|
set -e
|
4
4
|
set -x
|
5
5
|
|
6
|
-
export CHROME_REVISION=228611
|
7
|
-
export CHROMEDRIVER_VERSION=2.9
|
8
|
-
|
9
6
|
sh -e /etc/init.d/xvfb start
|
10
7
|
git submodule update --init
|
11
8
|
|
@@ -13,31 +10,15 @@ mkdir ~/.yard
|
|
13
10
|
bundle exec yard config -a autoload_plugins yard-doctest
|
14
11
|
|
15
12
|
if [[ "$WATIR_WEBDRIVER_BROWSER" = "chrome" ]]; then
|
16
|
-
|
17
|
-
|
18
|
-
sudo apt-get update
|
19
|
-
sudo apt-get install -y unzip libxss1
|
13
|
+
export CHROME_REVISION=`curl -s http://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/LAST_CHANGE`
|
14
|
+
export CHROMEDRIVER_VERSION=`curl -s http://chromedriver.storage.googleapis.com/LATEST_RELEASE`
|
20
15
|
|
21
16
|
curl -L -O "http://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/${CHROME_REVISION}/chrome-linux.zip"
|
22
17
|
unzip chrome-linux.zip
|
23
18
|
|
24
|
-
# chrome sandbox doesn't currently work on travis: https://github.com/travis-ci/travis-ci/issues/938
|
25
|
-
sudo chown root:root chrome-linux/chrome_sandbox
|
26
|
-
sudo chmod 4755 chrome-linux/chrome_sandbox
|
27
|
-
export CHROME_DEVEL_SANDBOX="$PWD/chrome-linux/chrome_sandbox"
|
28
|
-
|
29
19
|
curl -L -O "http://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip"
|
30
20
|
unzip chromedriver_linux64.zip
|
31
21
|
|
32
22
|
mv chromedriver chrome-linux/chromedriver
|
33
23
|
chmod +x chrome-linux/chromedriver
|
34
24
|
fi
|
35
|
-
|
36
|
-
if [[ "$WATIR_WEBDRIVER_BROWSER" = "phantomjs" ]]; then
|
37
|
-
PHANTOMJS_NAME=phantomjs-1.9.0-linux-x86_64
|
38
|
-
curl -L -O "https://phantomjs.googlecode.com/files/$PHANTOMJS_NAME.tar.bz2"
|
39
|
-
tar -xvjf $PHANTOMJS_NAME.tar.bz2
|
40
|
-
chmod +x $PHANTOMJS_NAME/bin/phantomjs
|
41
|
-
sudo cp $PHANTOMJS_NAME/bin/phantomjs /usr/local/phantomjs/bin/phantomjs
|
42
|
-
phantomjs --version
|
43
|
-
fi
|
data/watir-webdriver.gemspec
CHANGED
@@ -32,5 +32,5 @@ Gem::Specification.new do |s|
|
|
32
32
|
s.add_development_dependency "activesupport", "~> 3.0" # for pluralization during code generation
|
33
33
|
s.add_development_dependency "pry"
|
34
34
|
s.add_development_dependency "coveralls"
|
35
|
-
s.add_development_dependency "yard-doctest", "0.1.
|
35
|
+
s.add_development_dependency "yard-doctest", "~> 0.1.5"
|
36
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watir-webdriver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jari Bakken
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
@@ -168,16 +168,16 @@ dependencies:
|
|
168
168
|
name: yard-doctest
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
|
-
- -
|
171
|
+
- - "~>"
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version: 0.1.
|
173
|
+
version: 0.1.5
|
174
174
|
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
|
-
- -
|
178
|
+
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: 0.1.
|
180
|
+
version: 0.1.5
|
181
181
|
description: WebDriver-backed Watir
|
182
182
|
email:
|
183
183
|
- jari.bakken@gmail.com
|
@@ -195,6 +195,7 @@ files:
|
|
195
195
|
- README.md
|
196
196
|
- Rakefile
|
197
197
|
- lib/watir-webdriver.rb
|
198
|
+
- lib/watir-webdriver/after_hooks.rb
|
198
199
|
- lib/watir-webdriver/alert.rb
|
199
200
|
- lib/watir-webdriver/aliases.rb
|
200
201
|
- lib/watir-webdriver/atoms.rb
|
@@ -308,7 +309,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
308
309
|
version: '0'
|
309
310
|
requirements: []
|
310
311
|
rubyforge_project: watir-webdriver
|
311
|
-
rubygems_version: 2.
|
312
|
+
rubygems_version: 2.4.5
|
312
313
|
signing_key:
|
313
314
|
specification_version: 4
|
314
315
|
summary: Watir on WebDriver
|