watir-webdriver 0.6.1 → 0.6.2
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.
- data/.gitignore +2 -1
- data/.travis.yml +1 -0
- data/CHANGES.md +1693 -0
- data/Gemfile +0 -1
- data/Rakefile +22 -0
- data/lib/watir-webdriver/alert.rb +46 -0
- data/lib/watir-webdriver/aliases.rb +2 -2
- data/lib/watir-webdriver/atoms.rb +2 -2
- data/lib/watir-webdriver/atoms/README +0 -1
- data/lib/watir-webdriver/browser.rb +195 -14
- data/lib/watir-webdriver/cell_container.rb +14 -2
- data/lib/watir-webdriver/container.rb +22 -0
- data/lib/watir-webdriver/cookies.rb +41 -0
- data/lib/watir-webdriver/element_collection.rb +13 -3
- data/lib/watir-webdriver/elements/button.rb +3 -1
- data/lib/watir-webdriver/elements/checkbox.rb +8 -6
- data/lib/watir-webdriver/elements/dlist.rb +4 -4
- data/lib/watir-webdriver/elements/element.rb +153 -28
- data/lib/watir-webdriver/elements/file_field.rb +6 -4
- data/lib/watir-webdriver/elements/generated.rb +12 -8
- data/lib/watir-webdriver/elements/image.rb +10 -5
- data/lib/watir-webdriver/elements/input.rb +6 -0
- data/lib/watir-webdriver/elements/option.rb +28 -2
- data/lib/watir-webdriver/elements/radio.rb +5 -1
- data/lib/watir-webdriver/elements/select.rb +11 -9
- data/lib/watir-webdriver/elements/table.rb +8 -1
- data/lib/watir-webdriver/elements/table_cell.rb +3 -3
- data/lib/watir-webdriver/elements/table_row.rb +0 -1
- data/lib/watir-webdriver/elements/table_section.rb +8 -2
- data/lib/watir-webdriver/elements/text_area.rb +2 -2
- data/lib/watir-webdriver/elements/text_field.rb +2 -2
- data/lib/watir-webdriver/extensions/alerts.rb +3 -3
- data/lib/watir-webdriver/extensions/nokogiri.rb +2 -2
- data/lib/watir-webdriver/extensions/select_text.rb +2 -2
- data/lib/watir-webdriver/has_window.rb +23 -1
- data/lib/watir-webdriver/html.rb +2 -0
- data/lib/watir-webdriver/html/visitor.rb +2 -2
- data/lib/watir-webdriver/locators/element_locator.rb +8 -0
- data/lib/watir-webdriver/locators/text_field_locator.rb +1 -1
- data/lib/watir-webdriver/row_container.rb +11 -3
- data/lib/watir-webdriver/screenshot.rb +11 -0
- data/lib/watir-webdriver/user_editable.rb +10 -4
- data/lib/watir-webdriver/version.rb +2 -2
- data/lib/watir-webdriver/wait.rb +32 -11
- data/lib/watir-webdriver/window.rb +104 -1
- data/lib/watir-webdriver/xpath_support.rb +4 -0
- data/lib/yard/handlers/watir.rb +1 -1
- data/spec/element_locator_spec.rb +14 -1
- data/spec/html/clicks.html +1 -1
- data/spec/implementation.rb +29 -6
- data/spec/wait_spec.rb +2 -2
- data/support/travis.sh +5 -3
- data/support/version_differ.rb +59 -0
- data/watir-webdriver.gemspec +4 -3
- metadata +146 -149
- data/spec/alert_spec.rb +0 -91
- data/spec/html/alerts.html +0 -12
- data/spec/screenshot_spec.rb +0 -25
- data/support/html5.html +0 -102577
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -2,6 +2,7 @@ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'bundler'
|
5
|
+
require 'watir-webdriver/version'
|
5
6
|
Bundler::GemHelper.install_tasks
|
6
7
|
|
7
8
|
require 'rspec/core/rake_task'
|
@@ -91,4 +92,25 @@ YARD::Rake::YardocTask.new do |task|
|
|
91
92
|
task.options = %w[--debug] # this is pretty slow, so nice with some output
|
92
93
|
end
|
93
94
|
|
95
|
+
namespace :changes do
|
96
|
+
task :differ do
|
97
|
+
require './support/version_differ'
|
98
|
+
end
|
99
|
+
|
100
|
+
desc 'Update CHANGES.md'
|
101
|
+
task :update => :differ do
|
102
|
+
VersionDiffer.new.update('CHANGES.md')
|
103
|
+
end
|
104
|
+
|
105
|
+
desc 'Generate CHANGES.md from scratch'
|
106
|
+
task :generate => :differ do
|
107
|
+
VersionDiffer.new.generate('CHANGES.md')
|
108
|
+
end
|
109
|
+
|
110
|
+
desc 'Print latest diff'
|
111
|
+
task :print => :differ do
|
112
|
+
VersionDiffer.new.print_latest(STDOUT)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
94
116
|
load "spec/watirspec/watirspec.rake" if File.exist?("spec/watirspec/watirspec.rake")
|
@@ -9,26 +9,68 @@ module Watir
|
|
9
9
|
@alert = nil
|
10
10
|
end
|
11
11
|
|
12
|
+
#
|
13
|
+
# Returns text of alert.
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
# browser.alert.text
|
17
|
+
# #=> "This is alert text"
|
18
|
+
#
|
19
|
+
# @return [String]
|
20
|
+
#
|
21
|
+
|
12
22
|
def text
|
13
23
|
assert_exists
|
14
24
|
@alert.text
|
15
25
|
end
|
16
26
|
|
27
|
+
#
|
28
|
+
# Closes alert or accepts prompts/confirms.
|
29
|
+
#
|
30
|
+
# @example
|
31
|
+
# browser.alert.ok
|
32
|
+
# browser.alert.exists?
|
33
|
+
# #=> false
|
34
|
+
#
|
35
|
+
|
17
36
|
def ok
|
18
37
|
assert_exists
|
19
38
|
@alert.accept
|
20
39
|
end
|
21
40
|
|
41
|
+
#
|
42
|
+
# Closes alert or cancels prompts/confirms.
|
43
|
+
#
|
44
|
+
# @example
|
45
|
+
# browser.alert.close
|
46
|
+
# browser.alert.exists?
|
47
|
+
# #=> false
|
48
|
+
#
|
49
|
+
|
22
50
|
def close
|
23
51
|
assert_exists
|
24
52
|
@alert.dismiss
|
25
53
|
end
|
26
54
|
|
55
|
+
#
|
56
|
+
# Enters text to prompt.
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
# browser.alert.set "Text for prompt"
|
60
|
+
# browser.alert.ok
|
61
|
+
#
|
62
|
+
# @param [String] value
|
63
|
+
#
|
64
|
+
|
27
65
|
def set(value)
|
28
66
|
assert_exists
|
29
67
|
@alert.send_keys(value)
|
30
68
|
end
|
31
69
|
|
70
|
+
#
|
71
|
+
# Returns true if alert, confirm or prompt is present and false otherwise.
|
72
|
+
#
|
73
|
+
|
32
74
|
def exists?
|
33
75
|
assert_exists
|
34
76
|
true
|
@@ -37,6 +79,10 @@ module Watir
|
|
37
79
|
end
|
38
80
|
alias_method :present?, :exists?
|
39
81
|
|
82
|
+
#
|
83
|
+
# @api private
|
84
|
+
#
|
85
|
+
|
40
86
|
def selector_string
|
41
87
|
'alert'
|
42
88
|
end
|
@@ -14,8 +14,19 @@ module Watir
|
|
14
14
|
alias_method :wd, :driver # ensures duck typing with Watir::Element
|
15
15
|
|
16
16
|
class << self
|
17
|
-
|
18
|
-
|
17
|
+
#
|
18
|
+
# Creates a Watir::Browser instance and goes to URL.
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# browser = Watir::Browser.start "www.google.com", :chrome
|
22
|
+
# #=> #<Watir::Browser:0x..fa45a499cb41e1752 url="http://www.google.com" title="Google">
|
23
|
+
#
|
24
|
+
# @param [String] url
|
25
|
+
# @param [Symbol, Selenium::WebDriver] browser :firefox, :ie, :chrome, :remote or Selenium::WebDriver instance
|
26
|
+
# @return [Watir::Browser]
|
27
|
+
#
|
28
|
+
def start(url, browser = :firefox, *args)
|
29
|
+
b = new(browser, *args)
|
19
30
|
b.goto url
|
20
31
|
|
21
32
|
b
|
@@ -23,9 +34,9 @@ module Watir
|
|
23
34
|
end
|
24
35
|
|
25
36
|
#
|
26
|
-
#
|
37
|
+
# Creates a Watir::Browser instance.
|
27
38
|
#
|
28
|
-
# @param [:firefox, :ie, :chrome, :remote
|
39
|
+
# @param [Symbol, Selenium::WebDriver] browser :firefox, :ie, :chrome, :remote or Selenium::WebDriver instance
|
29
40
|
# @param args Passed to the underlying driver
|
30
41
|
#
|
31
42
|
|
@@ -51,7 +62,10 @@ module Watir
|
|
51
62
|
end
|
52
63
|
|
53
64
|
#
|
54
|
-
#
|
65
|
+
# Goes to the given URL.
|
66
|
+
#
|
67
|
+
# @example
|
68
|
+
# browser.goto "www.google.com"
|
55
69
|
#
|
56
70
|
# @param [String] uri The url.
|
57
71
|
# @return [String] The url you end up at.
|
@@ -66,22 +80,56 @@ module Watir
|
|
66
80
|
url
|
67
81
|
end
|
68
82
|
|
83
|
+
#
|
84
|
+
# Navigates back in history.
|
85
|
+
#
|
86
|
+
|
69
87
|
def back
|
70
88
|
@driver.navigate.back
|
71
89
|
end
|
72
90
|
|
91
|
+
#
|
92
|
+
# Navigates forward in history.
|
93
|
+
#
|
94
|
+
|
73
95
|
def forward
|
74
96
|
@driver.navigate.forward
|
75
97
|
end
|
76
98
|
|
99
|
+
#
|
100
|
+
# Returns URL of current page.
|
101
|
+
#
|
102
|
+
# @example
|
103
|
+
# browser.goto "http://www.google.com"
|
104
|
+
# browser.url
|
105
|
+
# #=> "http://www.google.com"
|
106
|
+
#
|
107
|
+
# @return [String]
|
108
|
+
#
|
109
|
+
|
77
110
|
def url
|
78
111
|
@driver.current_url
|
79
112
|
end
|
80
113
|
|
114
|
+
#
|
115
|
+
# Returns title of current page.
|
116
|
+
#
|
117
|
+
# @example
|
118
|
+
# browser.goto "http://www.google.com"
|
119
|
+
# browser.title
|
120
|
+
# #=> "Google"
|
121
|
+
#
|
122
|
+
# @return [String]
|
123
|
+
#
|
124
|
+
|
81
125
|
def title
|
82
126
|
@driver.title
|
83
127
|
end
|
84
128
|
|
129
|
+
#
|
130
|
+
# Closes browser.
|
131
|
+
#
|
132
|
+
|
85
133
|
def close
|
86
134
|
return if @closed
|
87
135
|
@driver.quit
|
@@ -89,42 +137,123 @@ module Watir
|
|
89
137
|
end
|
90
138
|
alias_method :quit, :close # TODO: close vs quit
|
91
139
|
|
140
|
+
#
|
141
|
+
# Handles cookies.
|
142
|
+
#
|
143
|
+
# @return [Watir::Cookies]
|
144
|
+
#
|
145
|
+
|
92
146
|
def cookies
|
93
147
|
@cookies ||= Cookies.new driver.manage
|
94
148
|
end
|
95
149
|
|
150
|
+
#
|
151
|
+
# Returns browser name.
|
152
|
+
#
|
153
|
+
# @example
|
154
|
+
# browser = Watir::Browser.new :chrome
|
155
|
+
# browser.name
|
156
|
+
# #=> :chrome
|
157
|
+
#
|
158
|
+
# @return [String]
|
159
|
+
#
|
160
|
+
|
161
|
+
def name
|
162
|
+
@driver.browser
|
163
|
+
end
|
164
|
+
|
165
|
+
#
|
166
|
+
# Returns text of page body.
|
167
|
+
#
|
168
|
+
# @return [String]
|
169
|
+
#
|
170
|
+
|
96
171
|
def text
|
97
172
|
@driver.find_element(:tag_name, "body").text
|
98
173
|
end
|
99
174
|
|
175
|
+
#
|
176
|
+
# Returns HTML code of current page.
|
177
|
+
#
|
178
|
+
# @return [String]
|
179
|
+
#
|
180
|
+
|
100
181
|
def html
|
101
182
|
# use body.html instead?
|
102
183
|
@driver.page_source
|
103
184
|
end
|
104
185
|
|
186
|
+
#
|
187
|
+
# Handles JavaScript alerts, confirms and prompts.
|
188
|
+
#
|
189
|
+
# @return [Watir::Alert]
|
190
|
+
#
|
191
|
+
|
105
192
|
def alert
|
106
193
|
Alert.new driver.switch_to
|
107
194
|
end
|
108
195
|
|
196
|
+
#
|
197
|
+
# Refreshes current page.
|
198
|
+
#
|
199
|
+
|
109
200
|
def refresh
|
110
201
|
@driver.navigate.refresh
|
111
202
|
run_checkers
|
112
203
|
end
|
113
204
|
|
205
|
+
#
|
206
|
+
# Waits until readyState of document is complete.
|
207
|
+
#
|
208
|
+
# @param [Fixnum] timeout
|
209
|
+
# @raise [Watir::Wait::TimeoutError] if timeout is exceeded
|
210
|
+
#
|
211
|
+
|
114
212
|
def wait(timeout = 5)
|
115
213
|
wait_until(timeout, "waiting for document.readyState == 'complete'") do
|
116
214
|
ready_state == "complete"
|
117
215
|
end
|
118
216
|
end
|
119
217
|
|
218
|
+
#
|
219
|
+
# Returns readyState of document.
|
220
|
+
#
|
221
|
+
# @return [String]
|
222
|
+
#
|
223
|
+
|
120
224
|
def ready_state
|
121
225
|
execute_script 'return document.readyState'
|
122
226
|
end
|
123
227
|
|
228
|
+
#
|
229
|
+
# Returns the text of status bar.
|
230
|
+
#
|
231
|
+
# @return [String]
|
232
|
+
#
|
233
|
+
|
124
234
|
def status
|
125
235
|
execute_script "return window.status;"
|
126
236
|
end
|
127
237
|
|
238
|
+
#
|
239
|
+
# Executes JavaScript snippet.
|
240
|
+
#
|
241
|
+
# If you are going to use the value snippet returns, make sure to use
|
242
|
+
# `return` explicitly.
|
243
|
+
#
|
244
|
+
# @example Check that Ajax requests are completed with jQuery
|
245
|
+
# browser.execute_script("return jQuery.active") == '0'
|
246
|
+
# #=> true
|
247
|
+
#
|
248
|
+
# @example Get inner HTML of element
|
249
|
+
# span = browser.span(class: "someclass")
|
250
|
+
# browser.execute_script "return arguments[0].innerHTML", span
|
251
|
+
# #=> "Span innerHTML"
|
252
|
+
#
|
253
|
+
# @param [String] script JavaScript snippet to execute
|
254
|
+
# @param *args Arguments will be available in the given script in the 'arguments' pseudo-array
|
255
|
+
#
|
256
|
+
|
128
257
|
def execute_script(script, *args)
|
129
258
|
args.map! { |e| e.kind_of?(Watir::Element) ? e.wd : e }
|
130
259
|
returned = @driver.execute_script(script, *args)
|
@@ -132,15 +261,22 @@ module Watir
|
|
132
261
|
wrap_elements_in(returned)
|
133
262
|
end
|
134
263
|
|
264
|
+
#
|
265
|
+
# Sends sequence of keystrokes to currently active element.
|
266
|
+
#
|
267
|
+
# @example
|
268
|
+
# browser.goto "http://www.google.com"
|
269
|
+
# browser.send_keys "Watir", :return
|
270
|
+
#
|
271
|
+
# @param [String, Symbol] *args
|
272
|
+
#
|
273
|
+
|
135
274
|
def send_keys(*args)
|
136
275
|
@driver.switch_to.active_element.send_keys(*args)
|
137
276
|
end
|
138
277
|
|
139
278
|
#
|
140
|
-
# Handles
|
141
|
-
#
|
142
|
-
# @example
|
143
|
-
# browser.screenshot.save("screenshot.png")
|
279
|
+
# Handles screenshots of current pages.
|
144
280
|
#
|
145
281
|
# @return [Watir::Screenshot]
|
146
282
|
#
|
@@ -149,6 +285,27 @@ module Watir
|
|
149
285
|
Screenshot.new driver
|
150
286
|
end
|
151
287
|
|
288
|
+
#
|
289
|
+
# Adds new checker.
|
290
|
+
#
|
291
|
+
# Checkers are generally used to ensure application under test does not encounter
|
292
|
+
# any error. They are automatically executed after following events:
|
293
|
+
# 1. Open URL
|
294
|
+
# 2. Refresh page
|
295
|
+
# 3. Click, double-click or right-click on element
|
296
|
+
#
|
297
|
+
# @example
|
298
|
+
# browser.add_checker do |page|
|
299
|
+
# page.text.include?("Server Error") and puts "Application exception or 500 error!"
|
300
|
+
# end
|
301
|
+
# browser.goto "www.mywebsite.com/page-with-error"
|
302
|
+
# "Server error! (RuntimeError)"
|
303
|
+
#
|
304
|
+
# @param [#call] checker Object responding to call
|
305
|
+
# @yield Checker block
|
306
|
+
# @yieldparam [Watir::Browser]
|
307
|
+
#
|
308
|
+
|
152
309
|
def add_checker(checker = nil, &block)
|
153
310
|
if block_given?
|
154
311
|
@error_checkers << block
|
@@ -159,14 +316,43 @@ module Watir
|
|
159
316
|
end
|
160
317
|
end
|
161
318
|
|
319
|
+
#
|
320
|
+
# Deletes checker.
|
321
|
+
#
|
322
|
+
# @example
|
323
|
+
# checker = lambda do |page|
|
324
|
+
# page.text.include?("Server Error") and puts "Application exception or 500 error!"
|
325
|
+
# end
|
326
|
+
# browser.add_checker checker
|
327
|
+
# browser.goto "www.mywebsite.com/page-with-error"
|
328
|
+
# "Server error! (RuntimeError)"
|
329
|
+
# browser.disable_checker checker
|
330
|
+
# browser.refresh
|
331
|
+
#
|
332
|
+
|
162
333
|
def disable_checker(checker)
|
163
334
|
@error_checkers.delete(checker)
|
164
335
|
end
|
165
336
|
|
337
|
+
#
|
338
|
+
# Runs checkers.
|
339
|
+
#
|
340
|
+
|
166
341
|
def run_checkers
|
167
342
|
@error_checkers.each { |e| e.call(self) }
|
168
343
|
end
|
169
344
|
|
345
|
+
#
|
346
|
+
# Returns true if browser is not closed and false otherwise.
|
347
|
+
#
|
348
|
+
# @return [Boolean]
|
349
|
+
#
|
350
|
+
|
351
|
+
def exist?
|
352
|
+
not @closed
|
353
|
+
end
|
354
|
+
alias_method :exists?, :exist?
|
355
|
+
|
170
356
|
#
|
171
357
|
# Protocol shared with Watir::Element
|
172
358
|
#
|
@@ -182,11 +368,6 @@ module Watir
|
|
182
368
|
end
|
183
369
|
end
|
184
370
|
|
185
|
-
def exist?
|
186
|
-
not @closed
|
187
|
-
end
|
188
|
-
alias_method :exists?, :exist?
|
189
|
-
|
190
371
|
def reset!
|
191
372
|
# no-op
|
192
373
|
end
|