watir-webdriver 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|