awetestlib 0.1.30-x86-mingw32 → 1.2.4-x86-mingw32
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 +7 -0
- data/README.md +101 -41
- data/awetestlib.gemspec +36 -47
- data/awetestlib_osx.gemspec +24 -18
- data/awetestlib_windows.gemspec +46 -0
- data/bin/awetestlib +130 -111
- data/bin/awetestlib-driver-setup.rb +0 -2
- data/bin/awetestlib-helpers.rb +43 -30
- data/lib/awetestlib.rb +196 -20
- data/lib/awetestlib/command_line.rb +44 -0
- data/lib/awetestlib/html_report.rb +57 -50
- data/lib/awetestlib/logging.rb +242 -171
- data/lib/awetestlib/regression/awetest_dsl.rb +4240 -0
- data/lib/awetestlib/regression/browser.rb +514 -397
- data/lib/awetestlib/regression/date_and_time.rb +280 -0
- data/lib/awetestlib/regression/drag_and_drop.rb +24 -0
- data/lib/awetestlib/regression/find.rb +70 -43
- data/lib/awetestlib/regression/legacy.rb +1 -1
- data/lib/awetestlib/regression/mobile.rb +293 -0
- data/lib/awetestlib/regression/reporting.rb +298 -0
- data/lib/awetestlib/regression/runner.rb +156 -200
- data/lib/awetestlib/regression/tables.rb +117 -7
- data/lib/awetestlib/regression/test_data.rb +354 -0
- data/lib/awetestlib/regression/user_input.rb +179 -93
- data/lib/awetestlib/regression/utilities.rb +755 -286
- data/lib/awetestlib/regression/validations.rb +325 -115
- data/lib/awetestlib/regression/waits.rb +60 -133
- data/lib/awetestlib/runner.rb +5 -2
- data/lib/version.rb +11 -2
- data/setup_samples/sample_cucumber/features/step_definitions/predefined_steps.rb +109 -49
- data/setup_samples/sample_mobile_app/features/support/env.rb +1 -1
- data/test/google_search2.rb +7 -6
- data/test/popup_child_0.rb +13 -0
- data/test/popup_child_1.rb +33 -0
- data/test/watir_no_require.rb +13 -0
- data/test/watir_with_require.rb +16 -0
- data/test/zoho_exercise.rb +8 -8
- metadata +216 -303
- data/AwetestLib Instructions.rtf +0 -0
- data/awetestlib.windows.gemspec +0 -42
- data/lib/patches/README +0 -2
- data/lib/patches/firewatir.rb +0 -106
- data/lib/patches/watir.rb +0 -175
@@ -0,0 +1,280 @@
|
|
1
|
+
module Awetestlib
|
2
|
+
|
3
|
+
module Regression
|
4
|
+
|
5
|
+
module DateAndTime
|
6
|
+
|
7
|
+
def get_date_names(date = Date.today, language = 'English')
|
8
|
+
this_month = date.month
|
9
|
+
next_month = this_month == 12 ? 1 : this_month + 1
|
10
|
+
prev_month = this_month == 1 ? 12 : this_month - 1
|
11
|
+
|
12
|
+
month_arr = get_months(language)
|
13
|
+
|
14
|
+
this_month_name = month_arr[this_month]
|
15
|
+
next_month_name = month_arr[next_month]
|
16
|
+
prev_month_name = month_arr[prev_month]
|
17
|
+
|
18
|
+
arr = [date.year.to_s, date.day.to_s, this_month_name, next_month_name, prev_month_name]
|
19
|
+
debug_to_log("#{__method__} #{nice_array(arr)}")
|
20
|
+
arr
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_days(language = 'English', abbrev = 0)
|
24
|
+
case language
|
25
|
+
when /english/i
|
26
|
+
full_arr = Date::DAYNAMES
|
27
|
+
|
28
|
+
# TODO: commented words with diacriticals until we can fix encoding confusion with mac/safari
|
29
|
+
when /french/i, /francais/i #, /fran�ais/i
|
30
|
+
full_arr = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"]
|
31
|
+
|
32
|
+
else
|
33
|
+
failed_to_log(with_caller("Language #{language} not yet supported."))
|
34
|
+
full_arr = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
if abbrev > 0
|
38
|
+
rtrn_arr = []
|
39
|
+
full_arr.each do |m|
|
40
|
+
rtrn_arr << m.slice(0, abbrev)
|
41
|
+
end
|
42
|
+
else
|
43
|
+
rtrn_arr = full_arr
|
44
|
+
end
|
45
|
+
|
46
|
+
rtrn_arr
|
47
|
+
rescue
|
48
|
+
failed_to_log(unable_to)
|
49
|
+
end
|
50
|
+
|
51
|
+
def next_day(yr, mo, dy, diff = 1)
|
52
|
+
tdy = DateTime.new(yr.to_i, mo.to_i, dy.to_i, 0, 0, 0)
|
53
|
+
tdy.advance(:days => diff).strftime("%Y-%m-%d")
|
54
|
+
end
|
55
|
+
|
56
|
+
def next_month(this)
|
57
|
+
unless this.is_a?(Fixnum)
|
58
|
+
this = this.to_i
|
59
|
+
end
|
60
|
+
nxt = this == 12 ? 1 : this + 1
|
61
|
+
nxt.to_s.rjust(2, '0')
|
62
|
+
end
|
63
|
+
|
64
|
+
def next_month_name(this, language = 'English')
|
65
|
+
unless this.is_a?(Fixnum)
|
66
|
+
this = get_months(language).index(this)
|
67
|
+
end
|
68
|
+
nxt = this == 12 ? 1 : this + 1
|
69
|
+
get_months(language)[nxt]
|
70
|
+
end
|
71
|
+
|
72
|
+
def prev_day(yr, mo, dy, diff = -1)
|
73
|
+
diff = diff > 0 ? -diff : diff
|
74
|
+
tdy = DateTime.new(yr.to_i, mo.to_i, dy.to_i, 0, 0, 0)
|
75
|
+
tdy.advance(:days => diff).strftime("%Y-%m-%d")
|
76
|
+
end
|
77
|
+
|
78
|
+
def prev_month(this)
|
79
|
+
prev = this.to_i == 1 ? 12 : this.to_i - 1
|
80
|
+
prev.to_s.rjust(2, '0')
|
81
|
+
end
|
82
|
+
|
83
|
+
def prev_month_name(this, language = 'English')
|
84
|
+
unless this.is_a?(Fixnum)
|
85
|
+
this = get_months(language).index(this)
|
86
|
+
end
|
87
|
+
prev = this == 1 ? 12 : this - 1
|
88
|
+
get_months(language)[prev]
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_mdyy(t = Time.now)
|
92
|
+
"#{t.month}/#{t.day}/#{t.year}"
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_month_name(this, language = 'English')
|
96
|
+
unless this.is_a?(Fixnum)
|
97
|
+
this = get_months(language).index(this)
|
98
|
+
end
|
99
|
+
get_months(language)[this]
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_month_names(date = Date.today)
|
103
|
+
this_month = date.month
|
104
|
+
if this_month == 12
|
105
|
+
next_month = 1
|
106
|
+
else
|
107
|
+
next_month = this_month + 1
|
108
|
+
end
|
109
|
+
if this_month == 1
|
110
|
+
prev_month = 12
|
111
|
+
else
|
112
|
+
prev_month = this_month - 1
|
113
|
+
end
|
114
|
+
|
115
|
+
month_arr = Date::MONTHNAMES
|
116
|
+
|
117
|
+
this_month_name = month_arr[this_month]
|
118
|
+
next_month_name = month_arr[next_month]
|
119
|
+
prev_month_name = month_arr[prev_month]
|
120
|
+
|
121
|
+
arr = [date.year, date.day, this_month_name, next_month_name, prev_month_name]
|
122
|
+
debug_to_log("#{__method__} #{nice_array(arr)}")
|
123
|
+
arr
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
def get_months(language = 'English', abbrev = 0)
|
128
|
+
case language
|
129
|
+
when /english/i
|
130
|
+
full_arr = Date::MONTHNAMES
|
131
|
+
|
132
|
+
# TODO: commented words with diacriticals until we can fix encoding confusion with mac/safari
|
133
|
+
when /french/i, /francais/i #, /fran�ais/i
|
134
|
+
full_arr = [nil, 'janvier', 'fevrier', 'mars', 'avril', 'mai', 'juin',
|
135
|
+
'juillet', 'aout', 'septembre', 'octobre', 'novembre', 'decembre']
|
136
|
+
# full_arr = [nil, 'janvier', 'f�vrier', 'mars', 'avril', 'mai', 'juin',
|
137
|
+
# 'juillet', 'ao�t', 'septembre', 'octobre', 'novembre', 'd�cembre']
|
138
|
+
else
|
139
|
+
failed_to_log(with_caller("Language #{language} not yet supported."))
|
140
|
+
full_arr = nil
|
141
|
+
end
|
142
|
+
|
143
|
+
if abbrev > 0
|
144
|
+
rtrn_arr = []
|
145
|
+
full_arr.each do |m|
|
146
|
+
if m
|
147
|
+
rtrn_arr << m.slice(0, abbrev)
|
148
|
+
else
|
149
|
+
rtrn_arr << nil
|
150
|
+
end
|
151
|
+
end
|
152
|
+
else
|
153
|
+
rtrn_arr = full_arr
|
154
|
+
end
|
155
|
+
|
156
|
+
rtrn_arr
|
157
|
+
rescue
|
158
|
+
failed_to_log(unable_to(language))
|
159
|
+
end
|
160
|
+
|
161
|
+
def translate_month_name(name, to, from = 'English')
|
162
|
+
get_months(from).index(name)
|
163
|
+
get_months(to)[get_months(from).index(name)]
|
164
|
+
end
|
165
|
+
|
166
|
+
def get_timestamp(format = 'long', offset = nil, offset_unit = :years)
|
167
|
+
t = DateTime.now
|
168
|
+
if offset
|
169
|
+
t = t.advance(offset_unit => offset)
|
170
|
+
end
|
171
|
+
case format
|
172
|
+
when 'dateonly'
|
173
|
+
t.strftime("%m/%d/%Y")
|
174
|
+
when 'condensed'
|
175
|
+
t.strftime("%Y%m%d%H%M")
|
176
|
+
when 'condensed_seconds'
|
177
|
+
t.strftime("%Y%m%d%H%M%S")
|
178
|
+
when 'long'
|
179
|
+
t.strftime("%m/%d/%Y %I:%M %p")
|
180
|
+
when 'mdyy'
|
181
|
+
get_mdyy(t)
|
182
|
+
when 'm/d/y'
|
183
|
+
get_mdyy(t)
|
184
|
+
else
|
185
|
+
Time.now.strftime("%m/%d/%Y %H:%M:%S")
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def tic(new = false)
|
190
|
+
now = Time.now.utc
|
191
|
+
if new
|
192
|
+
@tic_tic = now
|
193
|
+
else
|
194
|
+
debug_to_log(with_caller("#{now.to_f - @tic_tic.to_f}", "#{get_call_array(2)[1]}"))
|
195
|
+
@tic_tic = now
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def tic_m(msg = '')
|
200
|
+
now = Time.now.utc
|
201
|
+
debug_to_log(with_caller("#{now.to_f - @tic_tic.to_f}", "#{get_call_array(2)[1]}", msg))
|
202
|
+
@tic_tic = now
|
203
|
+
end
|
204
|
+
|
205
|
+
def time_it(container, desc, timeout = 3, &block)
|
206
|
+
start = Time.now.to_f
|
207
|
+
begin
|
208
|
+
Watir::Wait.until(timeout) { block.call(nil) }
|
209
|
+
rescue => e
|
210
|
+
if e.class.to_s =~ /TimeOutException/ or e.message =~ /timed out/
|
211
|
+
debug_to_log("#{desc} '#{$!}'")
|
212
|
+
return Time.now.to_f - start
|
213
|
+
elsif not rescue_me(e, __method__, "#{block.to_s}", "#{container.class}")
|
214
|
+
raise e
|
215
|
+
end
|
216
|
+
end
|
217
|
+
duration = Time.now.to_f - start
|
218
|
+
debug_to_report(with_caller(desc, duration.to_s))
|
219
|
+
duration
|
220
|
+
rescue
|
221
|
+
failed_to_log(unable_to(desc))
|
222
|
+
end
|
223
|
+
|
224
|
+
def sec2hms(s)
|
225
|
+
Time.at(s.to_i).gmtime.strftime('%H:%M:%S')
|
226
|
+
end
|
227
|
+
|
228
|
+
def pad_date(dt)
|
229
|
+
if dt and dt.length > 0
|
230
|
+
a, d1, b, d2, c = dt.split(/([\/\.-])/)
|
231
|
+
a = a.rjust(2, '0') unless a and a.length > 1
|
232
|
+
b = b.rjust(2, '0') unless b and b.length > 1
|
233
|
+
c = c.rjust(2, '0') unless c and c.length > 1
|
234
|
+
a + d1 + b + d2 + c
|
235
|
+
else
|
236
|
+
''
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def convert_y_m_d_to_ymd(yrs, mos, dys, fmt_out = '%Y-%m-%d', alt_fmt = '%Y-%m')
|
241
|
+
dys = [dys] unless dys.is_a?(Array)
|
242
|
+
mos = [mos] unless mos.is_a?(Array)
|
243
|
+
yrs = [yrs] unless yrs.is_a?(Array)
|
244
|
+
arr = []
|
245
|
+
if dys.size > 0
|
246
|
+
dys.each do |dy|
|
247
|
+
mo = mos[dys.index(dy)] ? mos[dys.index(dy)] : mos[0]
|
248
|
+
yr = yrs[dys.index(dy)] ? yrs[dys.index(dy)] : yrs[0]
|
249
|
+
arr << DateTime::parse("#{dy}/#{mo}/#{yr}").strftime(fmt_out).sub(/^0/, '')
|
250
|
+
end
|
251
|
+
else
|
252
|
+
mos.each do |mo|
|
253
|
+
yr = yrs[mos.index(mo)] ? yrs[mos.index(mo)] : yrs[0]
|
254
|
+
arr << DateTime::parse("1/#{mo}/#{yr}").strftime(alt_fmt).sub(/^0/, '')
|
255
|
+
end
|
256
|
+
end
|
257
|
+
arr
|
258
|
+
rescue
|
259
|
+
failed_to_log(unable_to("y:#{yrs}, m:#{mos}, d:#{dys}"))
|
260
|
+
end
|
261
|
+
|
262
|
+
def parse_mdy_to_datetime(mdy)
|
263
|
+
if mdy and mdy.length > 0
|
264
|
+
m, d1, d, d2, y = mdy.split(/([\/\.-])/)
|
265
|
+
y = "20#{y}" unless y.length == 4
|
266
|
+
ymd = "#{y}#{d1}#{m}#{d1}#{d}"
|
267
|
+
DateTime.parse(ymd)
|
268
|
+
end
|
269
|
+
rescue
|
270
|
+
failed_to_log(unable_to)
|
271
|
+
end
|
272
|
+
|
273
|
+
def diff_datetimes_in_days(beg_dt, end_dt)
|
274
|
+
(end_dt - beg_dt).to_i
|
275
|
+
end
|
276
|
+
|
277
|
+
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
@@ -7,6 +7,30 @@ module Awetestlib
|
|
7
7
|
# Rdoc is work in progress
|
8
8
|
module DragAndDrop
|
9
9
|
|
10
|
+
def viewport_size(browser)
|
11
|
+
if @targetBrowser.abbrev == 'IE' and get_browser_version(browser).to_i < 9
|
12
|
+
insert_viewport_div(browser)
|
13
|
+
else
|
14
|
+
x = browser.execute_script("return window.innerWidth")
|
15
|
+
y = browser.execute_script("return window.innerHeight")
|
16
|
+
[x, y]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def insert_viewport_div(browser)
|
21
|
+
browser.execute_script(
|
22
|
+
'var test = document.createElement( "div" );' +
|
23
|
+
'test.style.cssText = "position: fixed;top: 0;left: 0;bottom: 0;right: 0;"; ' +
|
24
|
+
'test.id = "awetest-temp-viewport"; ' +
|
25
|
+
'document.documentElement.insertBefore( test, document.documentElement.firstChild ); '
|
26
|
+
)
|
27
|
+
viewport = browser.div(:id, 'awetest-temp-viewport')
|
28
|
+
x = browser.execute_script("return arguments[0].offsetWidth", viewport)
|
29
|
+
y = browser.execute_script("return arguments[0].offsetHeight", viewport)
|
30
|
+
browser.execute_script("document.documentElement.removeChild( arguments[0] )", viewport)
|
31
|
+
[x, y]
|
32
|
+
end
|
33
|
+
|
10
34
|
# Verify that specified *inner_element* is fully enclosed by *outer_element*.
|
11
35
|
# @param [Watir::Element] inner_element A reference to a DOM element
|
12
36
|
# @param [Watir::Element] outer_element A reference to a DOM element
|
@@ -19,47 +19,12 @@ module Awetestlib
|
|
19
19
|
# @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
|
20
20
|
# @param [String, Regexp] value A string or a regular expression to be found in the *:value* attribute that uniquely identifies the element.
|
21
21
|
# @param [String] desc Contains a message or description intended to appear in the log and/or report output
|
22
|
-
def get_element(
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
target = browser.link(how, what)
|
29
|
-
when :button
|
30
|
-
target = browser.button(how, what)
|
31
|
-
when :div
|
32
|
-
target = browser.div(how, what)
|
33
|
-
when :checkbox
|
34
|
-
target = browser.checkbox(how, what, value)
|
35
|
-
when :text_field, :textfield
|
36
|
-
target = browser.text_field(how, what)
|
37
|
-
when :image
|
38
|
-
target = browser.image(how, what)
|
39
|
-
when :file_field, :filefield
|
40
|
-
target = browser.file_field(how, what)
|
41
|
-
when :form
|
42
|
-
target = browser.form(how, what)
|
43
|
-
when :frame
|
44
|
-
target = browser.frame(how, what)
|
45
|
-
when :radio
|
46
|
-
target = browser.radio(how, what, value)
|
47
|
-
when :span
|
48
|
-
target = browser.span(how, what)
|
49
|
-
when :table
|
50
|
-
target = browser.table(how, what)
|
51
|
-
when :li
|
52
|
-
target = browser.li(how, what)
|
53
|
-
when :select_list, :selectlist
|
54
|
-
target = browser.select_list(how, what)
|
55
|
-
when :hidden
|
56
|
-
target = browser.hidden(how, what)
|
57
|
-
when :area
|
58
|
-
target = browser.area(how, what)
|
59
|
-
else
|
60
|
-
target = browser.element(how, what)
|
61
|
-
end
|
62
|
-
if target.exists?
|
22
|
+
def get_element(container, element, how, what, value = nil, desc = '', options = {})
|
23
|
+
value, desc, options = capture_value_desc(value, desc, options) # for backwards compatibility
|
24
|
+
msg = build_message("Return #{element} with :#{how}=>'#{what}'", value, desc)
|
25
|
+
code = build_webdriver_fetch(element, how, what, options)
|
26
|
+
target = eval(code)
|
27
|
+
if target and target.exists?
|
63
28
|
passed_to_log(msg)
|
64
29
|
target
|
65
30
|
else
|
@@ -67,12 +32,13 @@ module Awetestlib
|
|
67
32
|
nil
|
68
33
|
end
|
69
34
|
rescue => e
|
70
|
-
unless rescue_me(e, __method__, rescue_me_command(target, how, what), "#{
|
35
|
+
unless rescue_me(e, __method__, rescue_me_command(target, how, what), "#{container.class}", target)
|
71
36
|
raise e
|
72
37
|
end
|
73
38
|
end
|
74
39
|
|
75
40
|
def get_attribute_value(browser, element, how, what, attribute, desc = '')
|
41
|
+
#TODO: eliminate case statement by using eval with build_webdriver_fetch
|
76
42
|
msg = build_message("Value of #{attribute} in #{element} #{how}=>#{what}.", desc)
|
77
43
|
case element
|
78
44
|
when :link
|
@@ -80,7 +46,7 @@ module Awetestlib
|
|
80
46
|
when :button
|
81
47
|
value = browser.button(how => what).attribute_value attribute
|
82
48
|
else
|
83
|
-
if browser.element(how => what).responds_to('attribute_value')
|
49
|
+
if browser.element(how => what).responds_to?('attribute_value')
|
84
50
|
value = browser.element(how => what).attribute_value attribute
|
85
51
|
end
|
86
52
|
end
|
@@ -89,6 +55,67 @@ module Awetestlib
|
|
89
55
|
failed_to_log(" Unable to #{msg}: '#{$!}'")
|
90
56
|
end
|
91
57
|
|
58
|
+
def get_directory(path)
|
59
|
+
if File.directory?(path)
|
60
|
+
debug_to_log("Directory already exists, '#{path}'.")
|
61
|
+
else
|
62
|
+
Dir::mkdir(path)
|
63
|
+
debug_to_log("Directory was created, '#{path}'.")
|
64
|
+
end
|
65
|
+
path
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_ancestor(descendant, element, how, what, desc = '')
|
69
|
+
found = false
|
70
|
+
how = 'class_name' if how.to_s == 'class'
|
71
|
+
tag = element.to_s.downcase
|
72
|
+
debug_to_log("target: #{descendant.tag_name} :id=>#{descendant.id}")
|
73
|
+
debug_to_log("goal: #{element} :#{how}=>#{what} #{desc}")
|
74
|
+
ancestor = target.parent
|
75
|
+
debug_to_log("#{ancestor.tag_name}: :class=>'#{ancestor.class_name}'")
|
76
|
+
code = "ancestor.#{how}"
|
77
|
+
what.is_a?(Regexp) ? code << " =~ /#{what.source}/" : code << " == '#{what}'"
|
78
|
+
debug_to_log("#{code}")
|
79
|
+
until found do
|
80
|
+
debug_to_log("#{ancestor.tag_name}: :class=>'#{ancestor.class_name}'")
|
81
|
+
if ancestor.tag_name == tag
|
82
|
+
if eval(code)
|
83
|
+
found = true
|
84
|
+
break
|
85
|
+
end
|
86
|
+
end
|
87
|
+
break unless ancestor
|
88
|
+
ancestor = ancestor.parent
|
89
|
+
end
|
90
|
+
ancestor
|
91
|
+
rescue
|
92
|
+
failed_to_log(unable_to)
|
93
|
+
end
|
94
|
+
|
95
|
+
def capture_value_desc(value, desc, options = nil)
|
96
|
+
opt = options.dup if options
|
97
|
+
unless opt.kind_of?(Hash)
|
98
|
+
opt = Hash.new
|
99
|
+
end
|
100
|
+
if value
|
101
|
+
vlu = value.dup
|
102
|
+
if opt[:value]
|
103
|
+
vlu = nil
|
104
|
+
else
|
105
|
+
opt[:value] = vlu
|
106
|
+
end
|
107
|
+
end
|
108
|
+
if desc
|
109
|
+
dsc = desc.dup
|
110
|
+
unless opt[:desc]
|
111
|
+
opt[:desc] = dsc
|
112
|
+
end
|
113
|
+
end
|
114
|
+
[vlu, dsc, opt]
|
115
|
+
rescue
|
116
|
+
failed_to_log(unable_to)
|
117
|
+
end
|
118
|
+
|
92
119
|
# Return an array containing the options available for selection in a select_list identifified by
|
93
120
|
# its attribute *how*, and the contents of that attribute *what*.
|
94
121
|
# @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
|