awetestlib 0.1.2 → 0.1.5

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.
Files changed (54) hide show
  1. data/README.md +55 -0
  2. data/awetestlib.windows.gemspec +1 -1
  3. data/awetestlib_osx.gemspec +1 -0
  4. data/bin/AutoItX3.dll +0 -0
  5. data/bin/awetestlib +23 -3
  6. data/bin/awetestlib-helpers.rb +39 -0
  7. data/bin/awetestlib-netbeans-setup.rb +39 -0
  8. data/bin/awetestlib-regression-setup.rb +16 -0
  9. data/bin/awetestlib-rubymine-setup.rb +33 -0
  10. data/images/logo.png +0 -0
  11. data/lib/awetestlib.rb +4 -4
  12. data/lib/awetestlib/html_report.rb +171 -0
  13. data/lib/{regression → awetestlib}/logging.rb +13 -46
  14. data/lib/awetestlib/regression/browser.rb +1233 -0
  15. data/lib/awetestlib/regression/drag_and_drop.rb +379 -0
  16. data/lib/awetestlib/regression/find.rb +431 -0
  17. data/lib/awetestlib/regression/legacy.rb +45 -0
  18. data/lib/awetestlib/regression/page_data.rb +190 -0
  19. data/lib/awetestlib/regression/runner.rb +307 -0
  20. data/lib/awetestlib/regression/tables.rb +491 -0
  21. data/lib/awetestlib/regression/user_input.rb +1256 -0
  22. data/lib/awetestlib/regression/utilities.rb +895 -0
  23. data/lib/awetestlib/regression/validations.rb +1184 -0
  24. data/lib/awetestlib/regression/waits.rb +391 -0
  25. data/lib/awetestlib/runner.rb +16 -0
  26. data/lib/version.rb +2 -2
  27. data/setup_samples/sample_netbeans/demo.rb +86 -0
  28. data/setup_samples/sample_netbeans/nbproject/configs/Demo.properties +2 -0
  29. data/setup_samples/sample_netbeans/nbproject/private/config.properties +1 -0
  30. data/setup_samples/sample_netbeans/nbproject/private/configs/Demo.properties +1 -0
  31. data/setup_samples/sample_netbeans/nbproject/private/private.properties +2 -0
  32. data/setup_samples/sample_netbeans/nbproject/project.properties +5 -0
  33. data/setup_samples/sample_netbeans/nbproject/project.xml +13 -0
  34. data/setup_samples/sample_rubymine/.idea/.name +1 -0
  35. data/setup_samples/sample_rubymine/.idea/encodings.xml +5 -0
  36. data/setup_samples/sample_rubymine/.idea/misc.xml +5 -0
  37. data/setup_samples/sample_rubymine/.idea/modules.xml +9 -0
  38. data/setup_samples/sample_rubymine/.idea/sample_rubymine.iml +9 -0
  39. data/setup_samples/sample_rubymine/.idea/scopes/scope_settings.xml +5 -0
  40. data/setup_samples/sample_rubymine/.idea/vcs.xml +7 -0
  41. data/setup_samples/sample_rubymine/.idea/workspace.xml +213 -0
  42. data/setup_samples/sample_rubymine/demo.rb +86 -0
  43. metadata +64 -17
  44. data/lib/regression/browser.rb +0 -1259
  45. data/lib/regression/drag_and_drop.rb +0 -374
  46. data/lib/regression/find.rb +0 -426
  47. data/lib/regression/legacy.rb +0 -40
  48. data/lib/regression/page_data.rb +0 -185
  49. data/lib/regression/runner.rb +0 -278
  50. data/lib/regression/tables.rb +0 -486
  51. data/lib/regression/user_input.rb +0 -1255
  52. data/lib/regression/utilities.rb +0 -891
  53. data/lib/regression/validations.rb +0 -1179
  54. data/lib/regression/waits.rb +0 -387
@@ -0,0 +1,379 @@
1
+ module Awetestlib
2
+ module Regression
3
+ module DragAndDrop
4
+
5
+ def verify_element_inside(inner_element, outer_element, desc = '')
6
+ mark_testlevel("#{__method__.to_s.titleize}", 3)
7
+ msg = "#{inner_element.class.to_s} (:id=#{inner_element.id}) is fully enclosed by #{outer_element.class.to_s} (:id=#{outer_element.id})."
8
+ msg << " #{desc}" if desc.length > 0
9
+ if overlay?(inner_element, outer_element, :inside)
10
+ failed_to_log(msg)
11
+ else
12
+ passed_to_log(msg)
13
+ true
14
+ end
15
+ rescue
16
+ failed_to_log("Unable to verify that #{msg} '#{$!}'")
17
+ end
18
+
19
+ def verify_no_element_overlap(browser, above_element, above_how, above_what, below_element, below_how, below_what, side, desc = '')
20
+ mark_testlevel("#{__method__.to_s.titleize}", 3)
21
+ msg = "#{above_element.to_s.titleize} #{above_how}=>#{above_what} does not overlap "+
22
+ "#{below_element.to_s.titleize} #{below_how}=>#{below_what} at the #{side}."
23
+ msg << " #{desc}" if desc.length > 0
24
+ above = browser.element(above_how, above_what)
25
+ below = browser.element(below_how, below_what)
26
+ if overlay?(above, below, side)
27
+ failed_to_log(msg)
28
+ else
29
+ passed_to_log(msg)
30
+ true
31
+ end
32
+ rescue
33
+ failed_to_log("Unable to verify that #{msg} '#{$!}'")
34
+ end
35
+
36
+ def overlay?(inner, outer, side = :bottom)
37
+ #mark_testlevel("#{__method__.to_s.titleize}", 3)
38
+ inner_t, inner_b, inner_l, inner_r = inner.bounding_rectangle_offsets
39
+ outer_t, outer_b, outer_l, outer_r = outer.bounding_rectangle_offsets
40
+ #overlay = false
41
+ case side
42
+ when :bottom
43
+ overlay = inner_b > outer_t
44
+ when :top
45
+ overlay = inner_t > outer_t
46
+ when :left
47
+ overlay = inner_l < outer_r
48
+ when :right
49
+ overlay = inner_r > outer_r
50
+ when :inside
51
+ overlay = !(inner_t > outer_t and
52
+ inner_r < outer_r and
53
+ inner_l > outer_l and
54
+ inner_b < outer_b)
55
+ else
56
+ overlay = (inner_t > outer_b or
57
+ inner_r > outer_l or
58
+ inner_l < outer_r or
59
+ inner_b < outer_t)
60
+ end
61
+ overlay
62
+ rescue
63
+ failed_to_log("Unable to determine overlay. '#{$!}'")
64
+ end
65
+
66
+ def hover(browser, element, wait = 2)
67
+ w1, h1, x1, y1, xc1, yc1, xlr1, ylr1 = get_element_coordinates(browser, element, true)
68
+ @ai.MoveMouse(xc1, yc1)
69
+ sleep_for(1)
70
+ end
71
+
72
+ def move_element_with_handle(browser, element, handle_id, dx, dy)
73
+ # msg = "Move element "
74
+ # w1, h1, x1, y1, xc1, yc1, xlr1, ylr1 = get_element_coordinates(browser, element, true)
75
+ # newx = w1 + dx
76
+ # newy = h1 + dy
77
+ # msg << " by [#{dx}, #{dy}] to expected [[#{newx}, #{newy}] "
78
+ # handle = get_resize_handle(element, handle_id)
79
+ # hw, hh, hx, hy, hxc, hyc, hxlr, hylr = get_element_coordinates(browser, handle, true)
80
+
81
+ # drag_and_drop(hxc, hyc, dx, dy)
82
+
83
+ # w2, h2, x2, y2, xc2, yc2, xlr2, ylr2 = get_element_coordinates(browser, element, true)
84
+
85
+ # xerr = x2 - newx
86
+ # yerr = y2 - newy
87
+ # xdsp = (x1 - x2).abs
88
+ # ydsp = (y1 - y2).abs
89
+
90
+ # if x2 == newx and y2 == newy
91
+ # msg << "succeeded."
92
+ # passed_to_log(msg)
93
+ # else
94
+ # msg << "failed. "
95
+ # failed_to_log(msg)
96
+ # debug_to_log("x: actual #{x2}, error #{xerr}, displace #{xdsp}. y: actual #{y2}, error #{yerr}, displace #{ydsp}.")
97
+ # end
98
+
99
+ end
100
+
101
+ def resize_element_with_handle(browser, element, target, dx, dy=nil)
102
+ #TODO enhance to accept differing percentages in each direction
103
+ msg = "Resize element "
104
+ w1, h1, x1, y1, xc1, yc1, xlr1, ylr1 = get_element_coordinates(browser, element, true)
105
+ if dy
106
+ deltax = dx
107
+ deltay = dy
108
+ neww = w1 + dx
109
+ newh = h1 + dy
110
+ msg << " by [#{dx}, #{dy}] " #"" to expected dimension [#{neww}, #{newh}] "
111
+ else
112
+ deltax, deltay, neww, newh = adjust_dimensions_by_percent(w1, h1, dx, true)
113
+ msg << "by #{dx} percent " #"" to expected dimension [#{neww}, #{newh}] "
114
+ end
115
+ handle = get_resize_handle_by_class(element, target) #, true)
116
+ sleep_for(0.5)
117
+ hw, hh, hx, hy, hxc, hyc, hxlr, hylr = get_element_coordinates(browser, handle, true)
118
+ hxlr_diff = 0
119
+ hylr_diff = 0
120
+
121
+ # TODO These adjustments are adhoc and empirical. Need to be derived more rigorously
122
+ if @browserAbbrev == 'IE'
123
+ hxlr_diff = (xlr1 - hxlr)
124
+ hylr_diff = (ylr1 - hylr)
125
+ x_start = hxlr - 2
126
+ y_start = hylr - 2
127
+ else
128
+ hxlr_diff = (xlr1 - hxlr) / 2 unless (xlr1 - hxlr) == 0
129
+ hylr_diff = (ylr1 - hylr) / 2 unless (ylr1 - hylr) == 0
130
+ x_start = hxlr
131
+ y_start = hylr
132
+ end
133
+
134
+ newxlr = xlr1 + deltax
135
+ newylr = ylr1 + deltay
136
+ # msg << ", lower right [#{newxlr}, #{newylr}] - "
137
+ sleep_for(0.5)
138
+
139
+ drag_and_drop(x_start, y_start, deltax, deltay)
140
+
141
+ sleep_for(1.5)
142
+ w2, h2, x2, y2, xc2, yc2, xlr2, ylr2 = get_element_coordinates(browser, element, true)
143
+
144
+ werr = w2 - neww
145
+ herr = h2 - newh
146
+
147
+ # TODO This adjustment is adhoc and empirical. Needs to be derived more rigorously
148
+ xlrerr = xlr2 - newxlr + hxlr_diff
149
+ ylrerr = ylr2 - newylr + hylr_diff
150
+
151
+ xlrdsp = (xlr1 - xlr2).abs
152
+ ylrdsp = (ylr1 - ylr2).abs
153
+
154
+ debug_to_log("\n" +
155
+ "\t\t hxlr_diff: #{hxlr_diff}\n" +
156
+ "\t\t hylr_diff: #{hylr_diff}\n" +
157
+ "\t\t werr: #{werr}\n" +
158
+ "\t\t herr: #{herr}\n" +
159
+ "\t\t xlrerr: #{xlrerr}\n" +
160
+ "\t\t ylrerr: #{ylrerr}\n" +
161
+ "\t\t xlrdsp: #{xlrdsp}\n" +
162
+ "\t\t ylrdsp: #{ylrdsp}\n" +
163
+ "\t\t @min_width: #{@min_width}\n" +
164
+ "\t\t@min_height: #{@min_height}\n" +
165
+ "\t\t x tol: #{@x_tolerance}\n" +
166
+ "\t\t y tol: #{@y_tolerance}\n"
167
+ )
168
+
169
+ #TODO Add check that window _was_ resized.
170
+ x_ok, x_msg = validate_move(w2, xlrerr, @x_tolerance, @min_width, xlr2)
171
+ y_ok, y_msg = validate_move(h2, ylrerr, @y_tolerance, @min_height, ylr2)
172
+ msg = msg + "x: #{x_msg}, y: #{y_msg}"
173
+
174
+ if x_ok and y_ok
175
+ passed_to_log(msg)
176
+ else
177
+ failed_to_log(msg)
178
+ debug_to_log("x - actual #{xlr2}, error #{xlrerr}, displace #{xlrdsp}, y - actual #{ylr2}, error #{ylrerr}, displace #{ylrdsp}.")
179
+ end
180
+ sleep_for(1)
181
+ rescue
182
+ failed_to_log("Unable to validate resize. #{$!} (#{__LINE__})")
183
+ sleep_for(1)
184
+ end
185
+
186
+ # :category: GUI
187
+ def get_resize_handle_by_id(element, id, dbg=nil)
188
+ handle = get_div_by_id(element, id, dbg)
189
+ sleep_for(1)
190
+ handle.flash(5)
191
+ return handle
192
+ end
193
+
194
+ # :category: GUI
195
+ def get_resize_handle_by_class(element, strg, dbg=nil)
196
+ handle = get_div_by_class(element, strg, dbg)
197
+ sleep_for(0.5)
198
+ handle.flash(5)
199
+ return handle
200
+ end
201
+
202
+ # :category: GUI
203
+ def get_element_coordinates(browser, element, dbg=nil)
204
+ bx, by, bw, bh = get_browser_coord(browser, dbg)
205
+ if @browserAbbrev == 'IE'
206
+ x_hack = @horizontal_hack_ie
207
+ y_hack = @vertical_hack_ie
208
+ elsif @browserAbbrev == 'FF'
209
+ x_hack = @horizontal_hack_ff
210
+ y_hack = @vertical_hack_ff
211
+ end
212
+ sleep_for(1)
213
+ w, h = element.dimensions.to_a
214
+ xc, yc = element.client_offset.to_a
215
+ # xcc, ycc = element.client_center.to_a
216
+ xcc = xc + w/2
217
+ ycc = yc + h/2
218
+ # screen offset:
219
+ xs = bx + x_hack + xc - 1
220
+ ys = by + y_hack + yc - 1
221
+ # screen center:
222
+ xsc = xs + w/2
223
+ ysc = ys + h/2
224
+ xslr = xs + w
225
+ yslr = ys + h
226
+ if dbg
227
+ debug_to_log(
228
+ "\n\t\tElement: #{element.inspect}"+
229
+ "\n\t\tbrowser screen offset: x: #{bx} y: #{by}"+
230
+ "\n\t\t dimensions: x: #{w} y: #{h}"+
231
+ "\n\t\t client offset x: #{xc} y: #{yc}"+
232
+ "\n\t\t screen offset x: #{xs} y: #{ys}"+
233
+ "\n\t\t client center x: #{xcc} y: #{ycc}"+
234
+ "\n\t\t screen center x: #{xsc} y: #{ysc}"+
235
+ "\n\t\t screen lower right x: #{xslr} y: #{yslr}")
236
+ end
237
+ [w, h, xs, ys, xsc, ysc, xslr, yslr]
238
+ end
239
+
240
+ def adjust_dimensions_by_percent(w, h, p, returnnew=nil)
241
+ p += 100
242
+ nw = (w * (p/100.0)).to_i
243
+ nh = (h * (p/100.0)).to_i
244
+ deltaw = nw - w
245
+ deltah = nh - h
246
+ if returnnew
247
+ [deltaw, deltah, nw, nh]
248
+ else
249
+ [deltaw, deltah]
250
+ end
251
+ end
252
+
253
+ def get_browser_coord(browser=nil, dbg=nil)
254
+ browser = @myBrowser if not browser
255
+ title = browser.title
256
+ x = @ai.WinGetPosX(title)
257
+ y = @ai.WinGetPosY(title)
258
+ w = @ai.WinGetPosWidth(title)
259
+ h = @ai.WinGetPosHeight(title)
260
+ if dbg
261
+ debug_to_log("\n\t\tBrowser #{browser.inspect}\n"+
262
+ "\t\tdimensions: x: #{w} y: #{h}"+
263
+ "\t\tscreen offset x: #{x} y: #{y}")
264
+ end
265
+ [x, y, w, h]
266
+ end
267
+
268
+ def drag_and_drop(x1, y1, dx, dy, speed=nil)
269
+ speed = 10 if not speed
270
+ x2 = x1 + dx
271
+ y2 = y1 + dy
272
+ debug_to_log("drag_and_drop: start: [#{x1}, #{y1}] end: [#{x2}, #{y2}]")
273
+
274
+ @ai.MouseMove(x1, y1, speed)
275
+ @ai.MouseClick("primary", x1, y1)
276
+ sleep_for(0.5)
277
+ @ai.MouseClick("primary", x1, y1)
278
+ sleep_for(0.5)
279
+ @ai.MouseClickDrag("primary", x1, y1, x2, y2, speed)
280
+ end
281
+
282
+ def drag_and_drop_element(browser, element, dx, dy, speed = nil)
283
+ speed = 10 if not speed
284
+ w1, h1, x1, y1, xc1, yc1, xlr1, ylr1 = get_element_coordinates(browser, element, true)
285
+ msg = "Move #{element} by [#{dx}, #{dy}] from center[#{xc1}, #{yc1}] "
286
+ newxc = xc1 + dx
287
+ newyc = yc1 + dy
288
+ msg << "to center[[#{newxc}, #{newyc}]"
289
+ sleep_for(0.5)
290
+
291
+ drag_and_drop(xc1, yc1, dx, dy)
292
+
293
+ sleep_for(1)
294
+ w2, h2, x2, y2, xc2, yc2, xlr2, ylr2 = get_element_coordinates(browser, element, true)
295
+
296
+ # TODO This adjustment is adhoc and empirical. Needs to be derived more rigorously
297
+ xcerr = xc2 - xc1
298
+ ycerr = yc2 - yc1
299
+
300
+ debug_to_log("\n" +
301
+ "\t\t xc1: #{xc1}\n" +
302
+ "\t\t yc1: #{yc1}\n" +
303
+ "\t\t xc2: #{xc2}\n" +
304
+ "\t\t yc2: #{yc2}\n" +
305
+ "\t\t xcerr: #{xlrerr}\n" +
306
+ "\t\t ycerr: #{ylrerr}\n" +
307
+ "\t\t x tol: #{@x_tolerance}\n" +
308
+ "\t\t y tol: #{@y_tolerance}\n"
309
+ )
310
+
311
+ #TODO Add check that window _was_ resized.
312
+ x_ok, x_msg = validate_drag_drop(xcerr, @x_tolerance, newxc, xc2)
313
+ y_ok, y_msg = validate_drag_drop(ycerr, @y_tolerance, newyc, yc2)
314
+ msg = msg + "x: #{x_msg}, y: #{y_msg}"
315
+
316
+ if x_ok and y_ok
317
+ passed_to_log(msg)
318
+ else
319
+ failed_to_log(msg)
320
+ end
321
+ sleep_for(1)
322
+ rescue
323
+ failed_to_log("Unable to validate drag and drop. #{$!} (#{__LINE__})")
324
+ sleep_for(1)
325
+ end
326
+
327
+ def right_click(element)
328
+ x = element.left_edge_absolute + 2
329
+ y = element.top_edge_absolute + 2
330
+ @ai.MouseClick("secondary", x, y)
331
+ end
332
+
333
+ def left_click(element)
334
+ x = element.left_edge_absolute + 2
335
+ y = element.top_edge_absolute + 2
336
+ @ai.MouseClick("primary", x, y)
337
+ end
338
+
339
+ def screen_offset(element, browser=nil)
340
+ bx, by, bw, bh = get_browser_coord(browser)
341
+ ex = element.left_edge
342
+ ey = element.top_edge
343
+ [bx + ex, by + ey]
344
+ end
345
+
346
+ def screen_center(element, browser=nil)
347
+ bx, by, bw, bh = get_browser_coord(browser)
348
+ w, h = element.dimensions.to_a
349
+ cx = bx + w/2
350
+ cy = by + h/2
351
+ [cx, cy]
352
+ end
353
+
354
+ def screen_lower_right(element, browser=nil)
355
+ bx, by, bw, bh = get_browser_coord(browser)
356
+ w, h = element.dimensions.to_a
357
+ [bx + w, by + h]
358
+ end
359
+
360
+ def verify_resize(d, err, tol, min, act)
361
+ ary = [false, "failed, actual #{act} err #{err}"]
362
+ if err == 0
363
+ ary = [true, 'succeeded ']
364
+ #TODO need to find way to calculate this adjustment
365
+ elsif d <= min + 4
366
+ ary = [true, "reached minimum (#{min}) "]
367
+ elsif err.abs <= tol
368
+ ary = [true, "within tolerance (+-#{tol}px) "]
369
+ end
370
+ ary
371
+ end
372
+
373
+ alias validate_move verify_resize
374
+ alias validate_resize verify_resize
375
+
376
+ end
377
+ end
378
+ end
379
+
@@ -0,0 +1,431 @@
1
+ module Awetestlib
2
+ module Regression
3
+ module Find
4
+
5
+ def get_select_list(browser, how, what, desc = '')
6
+ list = browser.select_list(how, what)
7
+ if validate(browser, @myName, __LINE__)
8
+ passed_to_log("Select list #{how}='#{what}' found and returned.")
9
+ return list
10
+ end
11
+ rescue
12
+ failed_to_log("Unable to return select list #{how}='#{what}': '#{$!}' (#{__LINE__})")
13
+ end
14
+
15
+ def get_select_options(browser, how, what, dump = false)
16
+ list = browser.select_list(how, what)
17
+ dump_select_list_options(list) if dump
18
+ list.options
19
+ rescue
20
+ failed_to_log("Unable to get select options for #{how}=>#{what}. '#{$!}'")
21
+ end
22
+
23
+ def get_select_options_by_id(browser, strg, dump = false)
24
+ get_select_options(browser, :id, strg, dump)
25
+ end
26
+
27
+ def get_select_options_by_name(browser, strg, dump = false)
28
+ get_select_options(browser, :name, strg, dump)
29
+ end
30
+
31
+ def get_selected_options(browser, how, what)
32
+ begin
33
+ list = browser.select_list(how, what)
34
+ rescue => e
35
+ if not rescue_me(e, __method__, "browser.select_list(#{how}, '#{what}')", "#{browser.class}")
36
+ raise e
37
+ end
38
+ end
39
+ list.selected_options
40
+ end
41
+
42
+ def get_selected_options_by_id(browser, strg)
43
+ get_selected_options(browser, :id, strg)
44
+ end
45
+
46
+ alias get_selected_option_by_id get_selected_options_by_id
47
+
48
+ def get_selected_options_by_name(browser, strg)
49
+ get_selected_options(browser, :name, strg)
50
+ end
51
+
52
+ alias get_selected_option_by_name get_selected_options_by_name
53
+
54
+ =begin rdoc
55
+ :category: A_rdoc_test
56
+ Returns a reference to a division element. Used to assign a div element to a variable
57
+ which can then be passed to methods that require a *browser* parameter.
58
+
59
+ _Parameters_::
60
+
61
+ *browser* - a reference to the browser window or container element to be tested
62
+
63
+ *how* - the element attribute used to identify the specific element. Valid values depend on the kind of element.
64
+ Common values: :text, :id, :title, :name, :class, :href (:link only)
65
+
66
+ *what* - a string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
67
+
68
+ *desc* - a string containing a message or description intended to appear in the log and/or report output
69
+
70
+ _Example_
71
+
72
+ mainwindow = open_browser('www.myapp.com') # open a browser to www.google.com
73
+ click(mainwindow, :button, :id, 'an id string') # click a button that opens another browser window
74
+ popup = attach_browser(mainwindow, :url, '[url of new window]') *or*
75
+ popup = attach_browser(mainwindow, :title, '[title of new window]')
76
+
77
+ =end
78
+
79
+ def get_div(browser, how, what, desc = '', dbg = false)
80
+ msg = "Get division #{how}=>#{what}."
81
+ msg << " #{desc}" if desc.length > 0
82
+ Watir::Wait.until { browser.div(how, what).exists? }
83
+ div = browser.div(how, what)
84
+ debug_to_log(div.inspect) if dbg
85
+ if validate(browser, @myName, __LINE__)
86
+ if div
87
+ passed_to_log(msg)
88
+ return div
89
+ else
90
+ failed_to_log(msg)
91
+ end
92
+ end
93
+ rescue
94
+ failed_to_log("Unable to '#{msg}' '#{$!}'")
95
+ end
96
+
97
+ def get_div_by_id(browser, strg, desc = '', dbg = false)
98
+ get_div(browser, :id, strg, desc, dbg)
99
+ end
100
+
101
+ =begin rdoc
102
+ :category: A_rdoc_test
103
+ Returns a reference to a division element identified by the value in its class attribute. Calls get_div()
104
+
105
+ _Parameters_::
106
+
107
+ *browser* - a reference to the browser window or container element to be tested
108
+
109
+ *strg* - a string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
110
+
111
+ *desc* - a string containing a message or description intended to appear in the log and/or report output
112
+
113
+ _Example_
114
+
115
+ mainwindow = open_browser('www.myapp.com') # open a browser to www.google.com
116
+ click(mainwindow, :button, :id, 'an id string') # click a button that opens another browser window
117
+ popup = attach_browser(mainwindow, :url, '[url of new window]') *or*
118
+ popup = attach_browser(mainwindow, :title, '[title of new window]')
119
+
120
+ =end
121
+
122
+ def get_div_by_class(browser, strg, desc = '', dbg = false)
123
+ get_div(browser, :class, strg, desc, dbg)
124
+ end
125
+
126
+ def get_div_by_text(browser, strg, desc = '', dbg = false)
127
+ get_div(browser, :text, strg, desc, dbg)
128
+ end
129
+
130
+ def get_form(browser, how, strg)
131
+ begin
132
+ # Watir::Wait.until( browser.form(how, strg).exists? ) # fails in wait_until
133
+ rescue => e
134
+ if not rescue_me(e, __method__, "browser.form(#{how}, '#{strg}').exists?", "#{browser.class}")
135
+ raise e
136
+ end
137
+ end
138
+ myForm = browser.form(how, strg)
139
+ if validate(browser, @myName, __LINE__)
140
+ passed_to_log("Form #{how}='#{strg}' found and returned.")
141
+ return myForm
142
+ end
143
+ rescue
144
+ failed_to_log("Unable to return form #{how}='#{strg}': '#{$!}' (#{__LINE__})")
145
+ end
146
+
147
+ def get_form_by_id(browser, strg)
148
+ get_form(browser, :id, strg)
149
+ end
150
+
151
+ def get_frame(browser, how, strg, desc = '')
152
+ # begin
153
+ # Watir::Wait.until(browser.frame(how, strg).exists?) # fails in wait_until
154
+ # rescue => e
155
+ # if not rescue_me(e, __method__, "browser.frame(#{how}, '#{strg}').exists?", "#{browser.class}")
156
+ # raise e
157
+ # end
158
+ # end
159
+ begin
160
+ frame = browser.frame(how, strg)
161
+ rescue => e
162
+ if not rescue_me(e, __method__, "browser.frame(#{how}, '#{strg}').exists?", "#{browser.class}")
163
+ raise e
164
+ end
165
+ end
166
+ if validate(browser, @myName, __LINE__)
167
+ passed_to_log("Frame #{how}='#{strg}' found and returned. #{desc}")
168
+ return frame
169
+ end
170
+ rescue
171
+ failed_to_log("Unable to return frame #{how}='#{strg}'. #{desc}: '#{$!}' (#{__LINE__})")
172
+ end
173
+
174
+ def get_frame_by_id(browser, strg, desc = '')
175
+ get_frame(browser, :id, strg, desc)
176
+ end
177
+
178
+ def get_frame_by_index(browser, index, desc = '')
179
+ get_frame(browser, :index, index, desc)
180
+ end
181
+
182
+ def get_frame_by_name(browser, strg, desc = '')
183
+ get_frame(browser, :name, strg, desc)
184
+ end
185
+
186
+ def get_span(browser, how, strg, desc = '')
187
+ begin
188
+ #TODO: use LegacyExtensions#wait_until
189
+ Watir::Wait.until { browser.span(how, strg).exists? }
190
+ rescue => e
191
+ if not rescue_me(e, __method__, "browser.span(#{how}, '#{strg}').exists?", "#{browser.class}")
192
+ raise e
193
+ end
194
+ end
195
+ begin
196
+ span = browser.span(how, strg)
197
+ rescue => e
198
+ if not rescue_me(e, __method__, "browser.span(#{how}, '#{strg}').exists?", "#{browser.class}")
199
+ raise e
200
+ end
201
+ end
202
+ if validate(browser, @myName, __LINE__)
203
+ passed_to_log("Span #{how}='#{strg}' found and returned. #{desc}")
204
+ return span
205
+ end
206
+ rescue
207
+ failed_to_log("Unable to return span #{how}='#{strg}'. #{desc}: '#{$!}' (#{__LINE__})")
208
+ end
209
+
210
+ def get_span_by_id(browser, strg, desc = '')
211
+ get_span(browser, :id, strg, desc)
212
+ end
213
+
214
+ =begin rdoc
215
+ :category: A_rdoc_test
216
+ Returns a reference to a table element. Used to assign a table element to a variable
217
+ which can then be used directly or passed to methods that require a *browser* or *table* parameter.
218
+
219
+ _Parameters_::
220
+
221
+ *browser* - a reference to the browser window or container element to be tested
222
+
223
+ *how* - the element attribute used to identify the specific element. Valid values depend on the kind of element.
224
+ Common values: :text, :id, :title, :name, :class, :href (:link only)
225
+
226
+ *what* - a string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
227
+
228
+ *desc* - a string containing a message or description intended to appear in the log and/or report output
229
+
230
+ _Example_
231
+
232
+ a_table = get_table(browser, :id, 'table1')
233
+ a_table_cell = a_table[2][1] # The cell in the first column of the second row of the table
234
+
235
+ =end
236
+
237
+ def get_table(browser, how, what, desc = '')
238
+ msg = "Return table :#{how}='#{what}'. #{desc}"
239
+ tbl = browser.table(how, what)
240
+ if validate(browser, @myName, __LINE__)
241
+ passed_to_log(msg)
242
+ tbl
243
+ end
244
+ rescue
245
+ failed_to_log("#{msg}': '#{$!}'")
246
+ end
247
+
248
+ def get_table_by_id(browser, strg, desc = '')
249
+ get_table(browser, :id, strg, desc)
250
+ end
251
+
252
+ def get_table_by_index(browser, idx)
253
+ get_table(browser, :index, idx, desc)
254
+ end
255
+
256
+ def get_table_by_text(browser, strg)
257
+ get_table(browser, :text, strg, desc)
258
+ end
259
+
260
+ def get_table_headers(table, header_index = 1)
261
+ headers = Hash.new
262
+ headers['index'] = Hash.new
263
+ headers['name'] = Hash.new
264
+ count = 1
265
+ table[header_index].each do |cell|
266
+ if cell.text.length > 0
267
+ name = cell.text.gsub(/\s+/, ' ')
268
+ headers['index'][count] = name
269
+ headers['name'][name] = count
270
+ end
271
+ count += 1
272
+ end
273
+ #debug_to_log("#{__method__}:****** headers:\n#{headers.to_yaml}")
274
+ headers
275
+ rescue
276
+ failed_to_log("Unable to get content headers. '#{$!}'")
277
+ end
278
+
279
+ def get_element(browser, element, how, what, value = nil)
280
+ target = nil
281
+ what = Regexp.new(Regexp.escape(what)) unless how == :index or what.is_a?(Regexp)
282
+ case element
283
+ when :link
284
+ target = browser.link(how, what)
285
+ when :button
286
+ target = browser.button(how, what)
287
+ when :div
288
+ target = browser.div(how, what)
289
+ when :checkbox
290
+ target = browser.checkbox(how, what, value)
291
+ when :text_field, :textfield
292
+ target = browser.text_field(how, what)
293
+ when :image
294
+ target = browser.image(how, what)
295
+ when :file_field, :filefield
296
+ target = browser.file_field(how, what)
297
+ when :form
298
+ target = browser.form(how, what)
299
+ when :frame
300
+ target = browser.frame(how, what)
301
+ when :radio
302
+ target = browser.radio(how, what, value)
303
+ when :span
304
+ target = browser.span(how, what)
305
+ when :table
306
+ target = browser.table(how, what)
307
+ when :li
308
+ target = browser.li(how, what)
309
+ when :select_list, :selectlist
310
+ target = browser.select_list(how, what)
311
+ when :hidden
312
+ target = browser.hidden(how, what)
313
+ when :area
314
+ target = browser.area(how, what)
315
+ end
316
+ if target.exists?
317
+ target
318
+ else
319
+ nil
320
+ end
321
+ rescue => e
322
+ if not rescue_me(e, __method__, "browser.#{element}(#{how}, '#{what}')", "#{browser.class}", target)
323
+ raise e
324
+ end
325
+ end
326
+
327
+ def get_objects(browser, which, dbg=false)
328
+ cnt = 0
329
+ case which
330
+ when :links
331
+ list = browser.links
332
+ sleep(1)
333
+ when :tables
334
+ list = browser.tables
335
+ when :divs
336
+ list = browser.divs
337
+ when :buttons
338
+ list = browser.buttons
339
+ when :checkboxes
340
+ list = browser.checkboxes
341
+ when :radios
342
+ list = browser.radios
343
+ when :selectlists
344
+ list = browser.selectlists
345
+ when :textfields
346
+ list = browser.textfields
347
+ when :lis
348
+ list = browser.lis
349
+ else
350
+ debug_to_log("Unrecognized dom object '#{which}'")
351
+ end
352
+ if dbg
353
+ list.each do |obj|
354
+ cnt += 1
355
+ debug_to_log("\n==========#{which}:\nindex: #{cnt}\n#{obj}\n#{obj.to_yaml}")
356
+ end
357
+ end
358
+ list
359
+ end
360
+
361
+ def get_ole(element)
362
+ ole = element.ole_object
363
+ if ole
364
+ passed_to_log("Found ole_object for #{element}.")
365
+ ole
366
+ else
367
+ failed_to_log("Did not find ole_object for #{element}.")
368
+ end
369
+ rescue
370
+ failed_to_log("Unable to find ole_object for #{element}. #{$!}")
371
+ end
372
+
373
+ def find_all_links_with_exact_href(browser, href)
374
+ links = browser.links
375
+ hash = Hash.new
376
+ idx = 0
377
+ links.each do |l|
378
+ idx += 1
379
+ an_href = href
380
+ my_href = l.href
381
+ if my_href == an_href
382
+ hash[idx] = l
383
+ debug_to_log("#{__method__}:#{idx}\n********\n#{l.to_s}\n\n#{l.to_yaml}")
384
+ end
385
+ end
386
+ hash
387
+ end
388
+
389
+ def find_link_with_exact_href(browser, href)
390
+ links = browser.links
391
+ link = nil
392
+ index = 0
393
+ links.each do |l|
394
+ index += 1
395
+ an_href = href
396
+ my_href = l.href
397
+ if my_href == an_href
398
+ link = l
399
+ # debug_to_log("#{__method__}:#{__LINE__}\n********\n#{l.to_s}\n\n#{l.to_yaml}")
400
+ break
401
+ end
402
+ end
403
+ link
404
+ end
405
+
406
+ def find_index_for_object(browser, obj, how, ord, strg)
407
+ obj_sym = (obj.to_s.pluralize).to_sym
408
+ how_str = how.to_s
409
+ ptrn = /#{how}:\s+#{strg}/i
410
+ list = get_objects(browser, obj_sym, true)
411
+ cnt = 0
412
+ idx = 0
413
+ list.each do |nty|
414
+ s = nty.to_s
415
+ # a = nty.to_a
416
+ if s =~ ptrn
417
+ cnt += 1
418
+ if cnt == ord
419
+ break
420
+ end
421
+ end
422
+ idx += 1
423
+ end
424
+ idx
425
+ end
426
+
427
+
428
+ end
429
+ end
430
+ end
431
+