safariwatir 0.2.0 → 0.2.1
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/safariwatir.rb +29 -0
- data/safariwatir/scripter.rb +47 -8
- data/safariwatir_script.rb +17 -8
- metadata +2 -2
data/safariwatir.rb
CHANGED
@@ -94,6 +94,7 @@ module Watir
|
|
94
94
|
def operate_by_value(&block)
|
95
95
|
@scripter.operate_by_input_value(self, &block)
|
96
96
|
end
|
97
|
+
alias_method :operate_by_caption, :operate_by_value
|
97
98
|
end
|
98
99
|
|
99
100
|
class Form < HtmlElement
|
@@ -234,6 +235,8 @@ module Watir
|
|
234
235
|
def column_count
|
235
236
|
# TODO
|
236
237
|
end
|
238
|
+
|
239
|
+
def tag; "TABLE"; end
|
237
240
|
end
|
238
241
|
|
239
242
|
class TableRow
|
@@ -257,6 +260,8 @@ module Watir
|
|
257
260
|
def column_count
|
258
261
|
# TODO
|
259
262
|
end
|
263
|
+
|
264
|
+
def tag; "TR"; end
|
260
265
|
end
|
261
266
|
|
262
267
|
class TableCell < ContentElement
|
@@ -272,16 +277,20 @@ module Watir
|
|
272
277
|
def operate(&block)
|
273
278
|
@scripter.operate_by_table_cell(self, &block)
|
274
279
|
end
|
280
|
+
|
281
|
+
def tag; "TD"; end
|
275
282
|
end
|
276
283
|
|
277
284
|
class TextField < InputElement
|
278
285
|
def set(value)
|
286
|
+
@scripter.focus(self)
|
279
287
|
@scripter.highlight(self) do
|
280
288
|
clear_text_input
|
281
289
|
value.length.times do |i|
|
282
290
|
append_text_input(value[i, 1])
|
283
291
|
end
|
284
292
|
end
|
293
|
+
@scripter.blur(self)
|
285
294
|
end
|
286
295
|
|
287
296
|
def getContents
|
@@ -385,6 +394,8 @@ module Watir
|
|
385
394
|
include Container
|
386
395
|
include PageContainer
|
387
396
|
|
397
|
+
DEFAULT_TYPING_LAG = 0.08
|
398
|
+
|
388
399
|
def self.start(url = nil)
|
389
400
|
safari = new
|
390
401
|
safari.goto(url) if url
|
@@ -394,8 +405,26 @@ module Watir
|
|
394
405
|
def initialize
|
395
406
|
@scripter = AppleScripter.new
|
396
407
|
@scripter.ensure_window_ready
|
408
|
+
set_slow_speed
|
409
|
+
end
|
410
|
+
|
411
|
+
def set_fast_speed
|
412
|
+
@scripter.typing_lag = 0
|
397
413
|
end
|
398
414
|
|
415
|
+
def set_slow_speed
|
416
|
+
@scripter.typing_lag = DEFAULT_TYPING_LAG
|
417
|
+
end
|
418
|
+
|
419
|
+
def speed=(how_fast)
|
420
|
+
case how_fast
|
421
|
+
when :fast : set_fast_speed
|
422
|
+
when :slow : set_slow_speed
|
423
|
+
else
|
424
|
+
raise ArgumentError, "Invalid speed: #{how_fast}"
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
399
428
|
def close
|
400
429
|
scripter.close
|
401
430
|
end
|
data/safariwatir/scripter.rb
CHANGED
@@ -8,9 +8,18 @@ module Watir
|
|
8
8
|
NO_RESPONSE = "__safari_watir_no_response__"
|
9
9
|
TABLE_CELL_NOT_FOUND = "__safari_watir_cell_unfound__"
|
10
10
|
|
11
|
+
JS_LIBRARY = %|
|
12
|
+
function dispatchOnChange(element) {
|
13
|
+
var event = document.createEvent('HTMLEvents');
|
14
|
+
event.initEvent('change', true, true);
|
15
|
+
element.dispatchEvent(event);
|
16
|
+
}
|
17
|
+
|
|
18
|
+
|
11
19
|
class JavaScripter
|
12
20
|
def operate(locator, operation)
|
13
|
-
%|#{
|
21
|
+
%|#{JS_LIBRARY}
|
22
|
+
#{locator}
|
14
23
|
if (element) {
|
15
24
|
#{operation}
|
16
25
|
} else {
|
@@ -76,10 +85,11 @@ if (element) {
|
|
76
85
|
include Watir::Exception
|
77
86
|
|
78
87
|
attr_reader :js
|
88
|
+
attr_accessor :typing_lag
|
79
89
|
private :js
|
80
90
|
|
81
91
|
TIMEOUT = 10
|
82
|
-
|
92
|
+
|
83
93
|
def initialize(scripter = JavaScripter.new)
|
84
94
|
@js = scripter
|
85
95
|
@app = AS.app("Safari")
|
@@ -125,11 +135,22 @@ if (element == undefined) {
|
|
125
135
|
def document_text
|
126
136
|
execute(%|document.getElementsByTagName('BODY').item(0).innerText;|)
|
127
137
|
end
|
138
|
+
|
139
|
+
def document_html
|
140
|
+
execute(%|document.getElementsByTagName('BODY').item(0).outerHTML;|)
|
141
|
+
end
|
142
|
+
|
143
|
+
def focus(element)
|
144
|
+
execute(element.operate { %|element.focus();| }, element)
|
145
|
+
end
|
146
|
+
|
147
|
+
def blur(element)
|
148
|
+
execute(element.operate { %|element.blur();| }, element)
|
149
|
+
end
|
128
150
|
|
129
151
|
def highlight(element, &block)
|
130
152
|
execute(element.operate do
|
131
|
-
%|element.
|
132
|
-
element.originalColor = element.style.backgroundColor;
|
153
|
+
%|element.originalColor = element.style.backgroundColor;
|
133
154
|
element.style.backgroundColor = 'yellow';|
|
134
155
|
end, element)
|
135
156
|
|
@@ -150,7 +171,23 @@ element.style.backgroundColor = 'yellow';|
|
|
150
171
|
|
151
172
|
def select_option(element = @element)
|
152
173
|
execute(element.operate do
|
153
|
-
|
174
|
+
%|var selected = -1;
|
175
|
+
var previous_selection = 0;
|
176
|
+
for (var i = 0; i < element.options.length; i++) {
|
177
|
+
if (element.options[i].selected) {
|
178
|
+
previous_selection = i;
|
179
|
+
}
|
180
|
+
if (element.options[i].#{element.how} == '#{element.what}') {
|
181
|
+
element.options[i].selected = true;
|
182
|
+
selected = i;
|
183
|
+
}
|
184
|
+
}
|
185
|
+
if (selected == -1) {
|
186
|
+
return '#{ELEMENT_NOT_FOUND}';
|
187
|
+
} else if (previous_selection != selected) {
|
188
|
+
dispatchOnChange(element.options[selected]);
|
189
|
+
}
|
190
|
+
|
|
154
191
|
end, element)
|
155
192
|
end
|
156
193
|
|
@@ -177,8 +214,10 @@ if (!option_found) {
|
|
177
214
|
end
|
178
215
|
|
179
216
|
def append_text_input(value, element = @element)
|
217
|
+
sleep typing_lag
|
180
218
|
execute(element.operate do
|
181
219
|
%|element.value += '#{value}';
|
220
|
+
dispatchOnChange(element);
|
182
221
|
element.setSelectionRange(element.value.length, element.value.length);|
|
183
222
|
end, element)
|
184
223
|
end
|
@@ -419,22 +458,22 @@ SCRIPT`
|
|
419
458
|
nil
|
420
459
|
end
|
421
460
|
|
422
|
-
def page_load
|
461
|
+
def page_load
|
423
462
|
last_location = current_location
|
424
463
|
yield
|
425
464
|
sleep 1
|
426
|
-
return if last_location == current_location
|
427
465
|
|
428
466
|
tries = 0
|
429
467
|
TIMEOUT.times do |tries|
|
430
468
|
if "complete" == eval_js("DOCUMENT.readyState")
|
469
|
+
sleep 0.4
|
431
470
|
handle_client_redirect
|
432
471
|
break
|
433
472
|
else
|
434
473
|
sleep 1
|
435
474
|
end
|
436
475
|
end
|
437
|
-
raise "Unable to load page
|
476
|
+
raise "Unable to load page within #{TIMEOUT} seconds" if tries == TIMEOUT-1
|
438
477
|
end
|
439
478
|
|
440
479
|
def handle_client_redirect
|
data/safariwatir_script.rb
CHANGED
@@ -2,11 +2,13 @@ require 'rubygems'
|
|
2
2
|
require 'safariwatir'
|
3
3
|
|
4
4
|
# TODO
|
5
|
-
# Be more attached to the Safari window.
|
5
|
+
# Be more attached to the Safari window.
|
6
|
+
# Currently, if a different window is selected, the AppleScript executes against it.
|
6
7
|
# Verify onclick is working for buttons and links
|
7
8
|
# TextFields should not respond to button method, etc.
|
8
9
|
|
9
|
-
# Unsupported Elements: Test that P/Div/Span/TD handle link, button, etc.,
|
10
|
+
# Unsupported Elements: Test that P/Div/Span/TD handle link, button, etc.,
|
11
|
+
# Javascript confirm [OK/CANCEL], Javascript prompt, Javascript popup windows
|
10
12
|
|
11
13
|
# Need to find a better way to distinguish between a submit button and a checkbox, re: page_load
|
12
14
|
|
@@ -24,9 +26,7 @@ def safari.google_to_prag
|
|
24
26
|
link(:text, "Programming Ruby, 2nd Ed.").click
|
25
27
|
link(:url, "http://www.pragmaticprogrammer.com/titles/ruby/code/index.html").click
|
26
28
|
link(:text, "Catalog").click
|
27
|
-
# site was down
|
28
29
|
link(:text, "All Books").click
|
29
|
-
# goto("http://pragmaticprogrammer.com/bookshelf/") # workaround
|
30
30
|
link(:text, /Agile Retrospectives/).click
|
31
31
|
puts "FAILURE prag" unless contains_text("Dave Hoover")
|
32
32
|
end
|
@@ -57,7 +57,7 @@ def safari.google_advanced
|
|
57
57
|
radio(:id, "ss").set
|
58
58
|
text_field(:name, "as_q").set("obtiva")
|
59
59
|
button(:name, "btnG").click
|
60
|
-
puts "FAILURE google" unless contains_text("
|
60
|
+
puts "FAILURE google" unless contains_text("Training, Coaching, and Software Development")
|
61
61
|
end
|
62
62
|
|
63
63
|
def safari.reddit
|
@@ -100,8 +100,9 @@ def safari.weinberg
|
|
100
100
|
end
|
101
101
|
|
102
102
|
def safari.tables
|
103
|
-
|
104
|
-
|
103
|
+
# Site Redesign, need to update test
|
104
|
+
# goto("http://basecamphq.com/")
|
105
|
+
# puts "FAILURE basecamp content" unless table(:index, 1)[1][2].text =~ /What is Basecamp\?/
|
105
106
|
|
106
107
|
goto("http://www.jimthatcher.com/webcourse9.htm")
|
107
108
|
puts "FAILURE thatcher" unless cell(:id, "c5").text == "subtotals"
|
@@ -119,6 +120,13 @@ def safari.tables
|
|
119
120
|
puts "FAILURE dreamweaver" unless table(:id, "titletable")[1][1].text =~ /CSS/
|
120
121
|
end
|
121
122
|
|
123
|
+
def safari.onchange
|
124
|
+
goto("http://www.gr8cardeal.co.uk/?s=1")
|
125
|
+
select_list(:name, "manufacturer").select_value("BMW")
|
126
|
+
sleep 0.3 # There's an Ajax call here
|
127
|
+
select_list(:name, "model").select_value("Z4 ROADSTER")
|
128
|
+
end
|
129
|
+
|
122
130
|
begin
|
123
131
|
safari.google_to_prag
|
124
132
|
safari.ala
|
@@ -129,6 +137,7 @@ begin
|
|
129
137
|
safari.redsquirrel
|
130
138
|
safari.weinberg
|
131
139
|
safari.tables
|
140
|
+
safari.onchange
|
132
141
|
ensure
|
133
142
|
safari.close
|
134
|
-
end
|
143
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: safariwatir
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.2.1
|
7
|
+
date: 2006-12-24 00:00:00 -06:00
|
8
8
|
summary: Automated testing tool for web applications.
|
9
9
|
require_paths:
|
10
10
|
- .
|