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