awetestlib 0.1.2 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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
+