awetestlib 0.1.28 → 0.1.29pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/.gitattributes +22 -22
  2. data/.gitignore +69 -69
  3. data/.yardopts +7 -7
  4. data/README.md +108 -108
  5. data/awetestlib.gemspec +57 -57
  6. data/awetestlib.windows.gemspec +41 -41
  7. data/awetestlib_notes.txt +4 -4
  8. data/awetestlib_osx.gemspec +47 -48
  9. data/bin/awetestlib +99 -99
  10. data/bin/awetestlib-android-setup.rb +26 -26
  11. data/bin/awetestlib-cucumber-setup.rb +28 -28
  12. data/bin/awetestlib-driver-setup.rb +21 -21
  13. data/bin/awetestlib-helpers.rb +41 -41
  14. data/bin/awetestlib-mobile-app-setup.rb +31 -31
  15. data/bin/awetestlib-netbeans-setup.rb +58 -58
  16. data/bin/awetestlib-regression-setup.rb +15 -15
  17. data/bin/awetestlib-rubymine-setup.rb +39 -39
  18. data/drivers/chromedriver.exe +0 -0
  19. data/ext/Rakefile +1 -1
  20. data/ext/mkrf_conf.rb +27 -27
  21. data/lib/awetestlib/html_report.rb +142 -142
  22. data/lib/awetestlib/logging.rb +366 -366
  23. data/lib/awetestlib/regression/browser.rb +1380 -1375
  24. data/lib/awetestlib/regression/drag_and_drop.rb +421 -420
  25. data/lib/awetestlib/regression/find.rb +345 -345
  26. data/lib/awetestlib/regression/legacy.rb +1187 -1187
  27. data/lib/awetestlib/regression/page_data.rb +191 -191
  28. data/lib/awetestlib/regression/runner.rb +307 -307
  29. data/lib/awetestlib/regression/tables.rb +627 -619
  30. data/lib/awetestlib/regression/user_input.rb +576 -576
  31. data/lib/awetestlib/regression/utilities.rb +1046 -988
  32. data/lib/awetestlib/regression/validations.rb +1093 -1074
  33. data/lib/awetestlib/regression/waits.rb +470 -470
  34. data/lib/awetestlib/runner.rb +18 -18
  35. data/lib/awetestlib.rb +41 -41
  36. data/lib/patches/README +2 -2
  37. data/lib/patches/firewatir.rb +106 -106
  38. data/lib/patches/watir.rb +175 -175
  39. data/lib/version.rb +2 -2
  40. data/license.txt +13 -13
  41. data/netbeans_setup.md +29 -29
  42. data/rdoc_test.bat +1 -1
  43. data/rubymine_setup.md +23 -23
  44. data/setup_samples/sample_android/features/dk.mejer.hansen.control.FlyingColorsPlayerAidActivity.apk +0 -0
  45. data/setup_samples/sample_android/features/sample_android.feature +5 -5
  46. data/setup_samples/sample_android/features/step_definitions/calabash_steps.rb +1 -1
  47. data/setup_samples/sample_android/features/support/app_installation_hooks.rb +36 -36
  48. data/setup_samples/sample_android/features/support/app_life_cycle_hooks.rb +14 -14
  49. data/setup_samples/sample_android/features/test_servers/8ba795a0288381ae346b67867b586881_0.3.2.apk +0 -0
  50. data/setup_samples/sample_cucumber/features/step_definitions/predefined_steps.rb +76 -76
  51. data/setup_samples/sample_cucumber/features/yahoo_mail.feature +11 -11
  52. data/setup_samples/sample_mobile_app/features/my_first.feature +14 -14
  53. data/setup_samples/sample_mobile_app/features/step_definitions/predefined_webview_steps.rb +80 -80
  54. data/setup_samples/sample_mobile_app/features/support/env.rb +2 -2
  55. data/setup_samples/sample_netbeans/demo.rb +86 -86
  56. data/setup_samples/sample_netbeans/nbproject/configs/Demo.properties +2 -2
  57. data/setup_samples/sample_netbeans/nbproject/private/config.properties +1 -1
  58. data/setup_samples/sample_netbeans/nbproject/private/configs/Demo.properties +2 -2
  59. data/setup_samples/sample_netbeans/nbproject/private/private.properties +2 -2
  60. data/setup_samples/sample_netbeans/nbproject/project.properties +5 -5
  61. data/setup_samples/sample_netbeans/nbproject/project.xml +13 -13
  62. data/setup_samples/sample_rubymine/.idea/encodings.xml +5 -5
  63. data/setup_samples/sample_rubymine/.idea/misc.xml +5 -5
  64. data/setup_samples/sample_rubymine/.idea/modules.xml +9 -9
  65. data/setup_samples/sample_rubymine/.idea/sample_rubymine.iml +9 -9
  66. data/setup_samples/sample_rubymine/.idea/scopes/scope_settings.xml +4 -4
  67. data/setup_samples/sample_rubymine/.idea/vcs.xml +7 -7
  68. data/setup_samples/sample_rubymine/.idea/workspace.xml +213 -213
  69. data/setup_samples/sample_rubymine/demo.rb +86 -86
  70. data/test/create_zoho.rb +66 -66
  71. data/test/create_zoho_account1.rb +68 -68
  72. data/test/create_zoho_account2.rb +72 -72
  73. data/test/demo.rb +87 -87
  74. data/test/google_search1.rb +16 -16
  75. data/test/google_search2.rb +19 -19
  76. data/test/login_1.rb +37 -37
  77. data/test/login_1a.rb +37 -37
  78. data/test/login_2.rb +32 -32
  79. data/test/zoho_exercise.rb +21 -21
  80. data/test/zoho_util.rb +487 -487
  81. data/tmp/placeholder.html +71 -71
  82. metadata +18 -49
@@ -1,470 +1,470 @@
1
- module Awetestlib
2
- module Regression
3
- # Methods for waiting until something has happened, or waiting while a condition exists, in the browser or DOM.
4
- # sleep_for() is the basic technique. Its disadvantage is that it needs to be set for the longest likely wait time.
5
- # The wait methods take advantage of the Watir and Watir Webdriver wait functionality to pause only as long as necessary for
6
- # the element in question to be in the state needed.
7
- module Waits
8
-
9
- # @!group Core
10
-
11
- # Sleep for *seconds* seconds before continuing execution of the script.
12
- # A message is logged (but not reported) which, by default, includes a trace showing where in the script the sleep was invoked.
13
- # @param [Fixnum] seconds The number of seconds to wait.
14
- # @param [Boolean] dbg If true, includes a trace in the message
15
- # @param [String] desc Contains a message or description intended to appear in the log and/or report output.
16
- def sleep_for(seconds, dbg = true, desc = '')
17
- trace = "\n#{get_debug_list}" if dbg
18
- msg = build_message("Sleeping for #{seconds} seconds.", desc, trace)
19
- info_to_log(msg)
20
- sleep(seconds)
21
- end
22
-
23
- # Wait while an element identified by attribute *how* with value *what* 1) exists, disappears, and exists again.
24
- # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
25
- # @param [Symbol] how The element attribute used to identify the specific element.
26
- # Valid values depend on the kind of element.
27
- # Common values: :text, :id, :title, :name, :class, :href (:link only)
28
- # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
29
- # @param [String] desc Contains a message or description intended to appear in the log and/or report output
30
- # @param [Fixnum] timeout
31
- # @return [Boolean] Returns true if disappears and reappears, each within the *timeout* limit
32
- def wait_for_element_to_reappear(browser, how, what, desc = '', timeout = 20)
33
- msg = "Element #{how}=#{what} exists. #{desc}"
34
- wait_while(browser, "While: #{msg}", timeout) { browser.element(how, what).exists? }
35
- wait_until(browser, "Until: #{msg}", timeout) { browser.element(how, what).exists? }
36
- end
37
-
38
- # Wait until element of type *element*, identified by attribute *how* with value *what* exists on the page.
39
- # Timeout is the default used by watir (60 seconds)
40
- # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
41
- # @param [Symbol] element The kind of element to click. Must be one of the elements recognized by Watir.
42
- # Some common values are :link, :button, :image, :div, :span.
43
- # @param [Symbol] how The element attribute used to identify the specific element.
44
- # Valid values depend on the kind of element.
45
- # Common values: :text, :id, :title, :name, :class, :href (:link only)
46
- # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
47
- # @param [String] desc Contains a message or description intended to appear in the log and/or report output
48
- # @return [Boolean] True if element exists within timeout limit
49
- def wait_until_exists(browser, element, how, what, desc = '')
50
- msg = build_message("Wait until (:#{element} :#{how}=>'#{what}') exists.", desc)
51
- start = Time.now.to_f
52
- # TODO: try Watir::Wait.until { browser.element(how, what).exists? } instead of this (cumbersome) case statement
53
- # TODO: above fails on frame
54
- Watir::Wait.until { browser.exists? }
55
- begin
56
- case element
57
- when :link
58
- Watir::Wait.until { browser.link(how, what).exists? }
59
- when :button
60
- Watir::Wait.until { browser.button(how, what).exists? }
61
- when :radio
62
- Watir::Wait.until { browser.radio(how, what).exists? }
63
- when :checkbox
64
- Watir::Wait.until { browser.checkbox(how, what).exists? }
65
- when :div
66
- Watir::Wait.until { browser.div(how, what).exists? }
67
- when :select_list
68
- Watir::Wait.until { browser.select_list(how, what).exists? }
69
- when :text_field
70
- Watir::Wait.until { browser.text_field(how, what).exists? }
71
- when :frame
72
- Watir::Wait.until { browser.frame(how, what).exists? }
73
- when :form
74
- Watir::Wait.until { browser.form(how, what).exists? }
75
- when :cell
76
- Watir::Wait.until { browser.cell(how, what).exists? }
77
- when :image
78
- Watir::Wait.until { browser.image(how, what).exists? }
79
- else
80
- Watir::Wait.until { browser.element(how, what).exists? }
81
- end
82
- rescue => e
83
- if e.class.to_s =~ /TimeOutException/
84
- failed_to_log("#{msg}: '#{$!}'")
85
- return false
86
- elsif not rescue_me(e, __method__, rescue_me_command(element, how, what, :exists?), "#{browser.class}")
87
- raise e
88
- end
89
- end
90
- stop = Time.now.to_f
91
- #debug_to_log("#{__method__}: start:#{start} stop:#{stop}")
92
- # sleep 1
93
- passed_to_log("#{msg} (#{stop - start} seconds)")
94
- true
95
- rescue
96
- failed_to_log("Unable to complete #{msg}: '#{$!}'")
97
- end
98
-
99
- # Wait _while_ expression in *&block* returns true.
100
- # @example
101
- # wait_while(browser, 'Textfield is enabled.', 10) { browser.text_field(:id, 'this text field').enabled?}
102
- #
103
- # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
104
- # @param [String] desc Contains a message or description intended to appear in the log and/or report output
105
- # @param [Fixnum] timeout Maximum time to wait, in seconds.
106
- # @param [Proc] &block A ruby expression that evaluates to true or false. The expression
107
- # is usually a watir or watir-webdriver command like .exists?, enabled?, etc. on a
108
- # specific DOM element. Note that *&block* is listed as the last parameter inside the signature
109
- # parentheses, but is passed in curly braces outside the signature parentheses in the call. This is
110
- # the way Ruby works.
111
- # @return [Boolean] True if condition returns false within time limit.
112
- def wait_while(browser, desc, timeout = 45, &block)
113
- #TODO: Would like to be able to see the block code in the log message instead of the identification
114
- msg = "Wait while #{desc}:"
115
- start = Time.now.to_f
116
- Watir::Wait.until { browser.exists? }
117
- begin
118
- #Watir::Wait.until(timeout) { block.call(nil) }
119
- if block.call(nil)
120
- Watir::Wait.while(timeout) { block.call(nil) }
121
- end
122
- rescue => e
123
- if e.class.to_s =~ /TimeOutException/ or e.message =~ /timed out/
124
- failed_to_log("#{msg}: '#{$!}' ")
125
- return false
126
- elsif not rescue_me(e, __method__, "#{block.to_s}", "#{browser.class}")
127
- raise e
128
- end
129
- end
130
- stop = Time.now.to_f
131
- #debug_to_log("#{__method__}: start:#{start} stop:#{stop} block: #{block.to_s}")
132
- # sleep 1
133
- passed_to_log("#{msg} (#{"%.5f" % (stop - start)} seconds)") # {#{block.to_s}}")
134
- true
135
- rescue
136
- failed_to_log("Unable to complete #{msg}. '#{$!}'")
137
- end
138
-
139
- alias wait_while_true wait_while
140
-
141
- # Wait _until_ expression in *&block* returns true.
142
- # @example
143
- # wait_until(browser, 'Textfield is enabled.', 10) { browser.text_field(:id, 'this text field').exists?}
144
- #
145
- # @param (see #wait_while)
146
- # @return [Boolean] True if condition in *&block* returns true within time limit.
147
- def wait_until(browser, desc, timeout = 45, skip_pass = false, &block)
148
- #TODO: Would like to be able to see the block code in the log message instead of the identification
149
- msg = "Wait until #{desc}"
150
- start = Time.now.to_f
151
- Watir::Wait.until { browser.exists? }
152
- begin
153
- Watir::Wait.until(timeout) { block.call(nil) }
154
- rescue => e
155
- if e.class.to_s =~ /TimeOutException/ or e.message =~ /timed out/
156
- failed_to_log("#{msg} '#{$!}'")
157
- return false
158
- elsif not rescue_me(e, __method__, "#{block.to_s}", "#{browser.class}")
159
- raise e
160
- end
161
- end
162
- stop = Time.now.to_f
163
- #debug_to_log("#{__method__}: start:#{start} stop:#{stop} block: #{block.to_s}")
164
- # sleep 1
165
- passed_to_log("#{msg} (#{"%.5f" % (stop - start)} seconds)") unless skip_pass # {#{block.to_s}}")
166
- true
167
- rescue
168
- failed_to_log("Unable to complete #{msg} '#{$!}'")
169
- end
170
-
171
- alias wait_until_true wait_until
172
-
173
- # Wait _until_ element, identified by attribute *how* and its value *what*, exists.
174
- # If it exists within *timeout* seconds then wait _until_ it is enabled.
175
- # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
176
- # @param [Symbol] how The element attribute used to identify the specific element.
177
- # Valid values depend on the kind of element.
178
- # Common values: :text, :id, :title, :name, :class, :href (:link only)
179
- # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
180
- # @param [String] desc Contains a message or description intended to appear in the log and/or report output
181
- # @param [Fixnum] timeout Maximum time to wait, in seconds.
182
- # @param [Boolean] verbose When set to true, more debug information is written to the log and
183
- # all steps return pass/fail messages in the report.
184
- # @return [Boolean] True if condition returns false within time limit.
185
- def wait_until_ready(browser, how, what, desc = '', timeout = 90, verbose = false)
186
- msg = "#{__method__.to_s.titleize}: element: #{how}='#{what}'"
187
- msg << " #{desc}" if desc.length > 0
188
- proc_exists = Proc.new { browser.element(how, what).exists? }
189
- proc_enabled = Proc.new { browser.element(how, what).enabled? }
190
- case how
191
- when :href
192
- proc_exists = Proc.new { browser.link(how, what).exists? }
193
- proc_enabled = Proc.new { browser.link(how, what).enabled? }
194
- end
195
- if verbose
196
- if wait_until(browser, "#{msg} Element exists.", timeout) { proc_exists.call(nil) }
197
- if wait_until(browser, "#{msg} Element enabled.", timeout) { proc_enabled.call(nil) }
198
- passed_to_log(msg)
199
- true
200
- else
201
- failed_to_log(msg)
202
- end
203
- else
204
- failed_to_log(msg)
205
- end
206
- else
207
- start = Time.now.to_f
208
- Watir::Wait.until { browser.exists? }
209
- if Watir::Wait.until(timeout) { proc_exists.call(nil) }
210
- if Watir::Wait.until(timeout) { proc_enabled.call(nil) }
211
- stop = Time.now.to_f
212
- #debug_to_log("#{__method__}: start:#{"%.5f" % start} stop:#{"%.5f" % stop}")
213
- passed_to_log("#{msg} (#{"%.5f" % (stop - start)} seconds)")
214
- true
215
- else
216
- failed_to_log(msg)
217
- end
218
- else
219
- failed_to_log(msg)
220
- end
221
- end
222
- rescue
223
- failed_to_log("Unable to #{msg}. '#{$!}'")
224
- end
225
-
226
- # Wait _until_ element, identified by attribute *how* and its value *what*, exists.
227
- # If it exists within *timeout* seconds then wait _until_ it is enabled. Report only failures.
228
- # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
229
- # @param [Symbol] how The element attribute used to identify the specific element.
230
- # Valid values depend on the kind of element.
231
- # Common values: :text, :id, :title, :name, :class, :href (:link only)
232
- # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
233
- # @param [String] desc Contains a message or description intended to appear in the log and/or report output
234
- # @param [Fixnum] timeout Maximum time to wait, in seconds.
235
- # @param [Boolean] quiet When set to true, only fail messages are logged and reported.
236
- # @return [Boolean] True if condition returns false within time limit.
237
- def wait_until_ready_quiet(browser, how, what, desc = '', timeout = 45, quiet = true)
238
- msg = "#{__method__.to_s.titleize}: element: #{how}='#{what}'"
239
- msg << " #{desc}" if desc.length > 0
240
- proc_exists = Proc.new { browser.element(how, what).exists? }
241
- proc_enabled = Proc.new { browser.element(how, what).enabled? }
242
- case how
243
- when :href
244
- proc_exists = Proc.new { browser.link(how, what).exists? }
245
- proc_enabled = Proc.new { browser.link(how, what).enabled? }
246
- end
247
- start = Time.now.to_f
248
- Watir::Wait.until { browser.exists? }
249
- sleep_for(1)
250
- if Watir::Wait.until(timeout) { proc_exists.call(nil) }
251
- if Watir::Wait.until(timeout) { proc_enabled.call(nil) }
252
- stop = Time.now.to_f
253
- #debug_to_log("#{msg}: start:#{"%.5f" % start} stop:#{"%.5f" % stop}")
254
- passed_to_log("#{msg} (#{"%.5f" % (stop - start)} seconds)") unless quiet
255
- true
256
- else
257
- failed_to_log(msg)
258
- end
259
- else
260
- failed_to_log(msg)
261
- end
262
- rescue
263
- failed_to_log("Unable to #{msg}. '#{$!}'")
264
- end
265
-
266
- def wait_until_text(browser, strg, desc = '', timeout = 60)
267
- if not strg.class.to_s.match('String')
268
- raise "#{__method__} requires String for search target. #{strg.class} is not supported."
269
- end
270
- wait_until(browser, "'#{strg}' #{desc}", timeout) { browser.text.include? strg }
271
- end
272
-
273
- alias wait_until_by_text wait_until_text
274
-
275
- def wait_until_enabled(browser, what, how, value, desc = '')
276
- # TODO: This can be simplified
277
- start = Time.now.to_f
278
- Watir::Wait.until { browser.exists? }
279
- sleep_for(1)
280
- begin
281
- case what
282
- when :link
283
- Watir::Wait.until { browser.link(how, value).enabled? }
284
- when :button
285
- Watir::Wait.until { browser.button(how, value).enabled? }
286
- when :radio
287
- Watir::Wait.until { browser.radio(how, value).enabled? }
288
- when :checkbox
289
- Watir::Wait.until { browser.checkbox(how, value).enabled? }
290
- when :div
291
- Watir::Wait.until { browser.div(how, value).enabled? }
292
- when :select_list
293
- Watir::Wait.until { browser.select_list(how, value).enabled? }
294
- when :text_field
295
- Watir::Wait.until { browser.text_field(how, value).enabled? }
296
- when :table
297
- Watir::Wait.until { browser.table(how, value).enabled? }
298
- else
299
- Watir::Wait.until { browser.element(how, value).enabled? }
300
- end
301
- rescue => e
302
- if e.class.to_s =~ /TimeOutException/
303
- failed_to_log("Wait until (#{what} :#{how}=>#{value}) enabled. #{desc}: '#{$!}' #{desc}")
304
- return false
305
- elsif not rescue_me(e, __method__, "#{block.to_s}", "#{browser.class}")
306
- raise e
307
- end
308
- end
309
- stop = Time.now.to_f
310
- #debug_to_log("#{__method__}: start:#{start} stop:#{stop}")
311
- # sleep 1
312
- passed_to_log("Wait until (#{what} :#{how}=>#{value}) enabled. #{desc} (#{stop - start} seconds)")
313
- true
314
- rescue
315
- failed_to_log("Unable to complete wait until (#{what} :#{how}=>#{value}) enabled. #{desc}: '#{$!}'")
316
- end
317
-
318
- def wait_until_visible(browser, element, how, what, desc = '')
319
- start = Time.now.to_f
320
- Watir::Wait.until { browser.exists? }
321
- sleep_for(1)
322
- Watir::Wait.until(20) { browser.element(how, what).exists? }
323
- begin
324
- case element
325
- when :link
326
- Watir::Wait.until { browser.link(how, what).visible? }
327
- when :button
328
- Watir::Wait.until { browser.button(how, what).visible? }
329
- when :radio
330
- Watir::Wait.until { browser.radio(how, what).visible? }
331
- when :checkbox
332
- Watir::Wait.until { browser.checkbox(how, what).visible? }
333
- when :div
334
- Watir::Wait.until { browser.div(how, what).visible? }
335
- when :select_list
336
- Watir::Wait.until { browser.select_list(how, what).visible? }
337
- when :text_field
338
- Watir::Wait.until { browser.text_field(how, what).visible? }
339
- else
340
- Watir::Wait.until { browser.element(how, what).visible? }
341
- # raise "#{__method__}: Element #{what} not supported."
342
- end
343
- rescue => e
344
- if e.class.to_s =~ /TimeOutException/
345
- failed_to_log("Wait until (#{what} :#{how}=>#{what}) visible. #{desc}: '#{$!}' #{desc}")
346
- return false
347
- elsif not rescue_me(e, __method__, rescue_me_command(element, how, what, :visible?), "#{browser.class}")
348
- raise e
349
- end
350
- end
351
- stop = Time.now.to_f
352
- #debug_to_log("#{__method__}: start:#{start} stop:#{stop}")
353
- # sleep 1
354
- passed_to_log("Wait until (#{element} :#{how}=>#{what}) visible. #{desc} (#{stop - start} seconds)")
355
- true
356
- rescue
357
- failed_to_log("Unable to complete wait until (#{element} :#{how}=>#{what}) visible. #{desc}: '#{$!}'")
358
- end
359
-
360
- # @!endgroup Core
361
-
362
- # @!group Altenatives
363
-
364
- # Wait for a specific text to appear in the *browser*.
365
- # @note This is a last resort method when other wait or wait until avenues have been exhausted.
366
- # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
367
- # @param [String, Regexp] text A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
368
- # @param [String] desc Contains a message or description intended to appear in the log and/or report output
369
- # @param [Fixnum] threshold The number of seconds after which a warning is added to the report message.
370
- # @param [Fixnum] interval The time between checks that the text exists.
371
- # @return [Boolean] Returns true if the text appears before *how_long* has expired.
372
- def hold_for_text(browser, how_long, text, desc = '', threshold = 20, interval = 0.25)
373
- countdown = how_long
374
- Watir::Wait.until { browser.exists? }
375
- sleep_for(1)
376
- while ((not browser.contains_text(text)) and countdown > 0)
377
- sleep(interval)
378
- countdown = countdown - interval
379
- end
380
- if countdown < how_long
381
- waittime = how_long - countdown
382
- passed_to_log("#{__method__} '#{text}' found after #{waittime} second(s) #{desc}")
383
- if waittime > threshold
384
- failed_to_log("#{__method__} '#{text}' took #{waittime} second(s). (threshold: #{threshold} seconds) #{desc}")
385
- end
386
- true
387
- else
388
- failed_to_log("#{__method__} '#{text}' not found after #{how_long} second(s) #{desc}")
389
- false
390
- end
391
- rescue
392
- failed_to_log("Unable to #{__method__} '#{text}'. '#{$!}' #{desc}")
393
- end
394
-
395
- alias wait_for_text hold_for_text
396
-
397
- # Wait up to *how_long* seconds for DOM element *what_for* to exist in the page.
398
- # @note This is a last resort method when other wait or wait until avenues have been exhausted.
399
- # @param [Fixnum] how_long Timeout limit
400
- # @param [Watir::Element] what_for A reference to a Dom element to wait for.
401
- def wait_for_exists(how_long, what_for)
402
- wait_for(how_long, what_for)
403
- end
404
-
405
- # Wait up to *how_long* seconds for DOM element *what_for* to exist in the page.
406
- # @note This is a last resort method when other wait or wait until avenues have
407
- # been exhausted.
408
- # @param [Fixnum] how_long Timeout limit
409
- # @param [Watir::Element] what_for A reference to a Dom element to wait for.
410
- def wait_for(how_long, what_for, interval = 0.25)
411
- countdown = how_long
412
- while ((not what_for.exists?) and countdown > 0)
413
- sleep(interval)
414
- puts what_for.inspect+':'+countdown.to_s
415
- countdown = countdown - interval
416
- end
417
- if countdown
418
- puts 'found '+what_for.inspect
419
- passed_tolog("wait_for (#{how_long} found "+what_for.inspect)
420
- else
421
- puts 'Did not find '+what_for.inspect
422
- failed_tolog("wait_for (#{how_long} did not find "+what_for.inspect)
423
- end
424
- countdown
425
- end
426
-
427
- # Wait up to *how_long* seconds for DOM element identified by attribute *how* and its value
428
- # *what* to exist in the page.
429
- # @note This is a last resort method when other wait or wait until avenues have been exhausted.
430
- # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
431
- # @param [Symbol] how The element attribute used to identify the specific element.
432
- # Valid values depend on the kind of element.
433
- # Common values: :text, :id, :title, :name, :class, :href (:link only)
434
- # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
435
- # @param [Fixnum] wait Timeout limit.
436
- # @param [Fixnum] interval How long to wait before checking again.
437
- # @return [Boolean] True if element exists within *wait* time
438
- def wait_the_hard_way(browser, how, what, wait = 6, interval = 0.25)
439
- count = (wait / interval).to_i + 1
440
- tally = 0
441
- ok = (1 / interval).to_i + 1
442
- debug_to_log("#{__method__}: wait: #{wait} secs; interval: #{interval} secs; count; #{count}; thresh: #{ok}")
443
- Watir::Wait.until { browser.exists? }
444
- sleep_for(1)
445
- (1..count).each do |x|
446
- begin
447
- if browser.element(how, what).exists?
448
- tally += 1
449
- debug_to_log("#{x}: #{(x - 1) * interval}: #{what} exists.")
450
- else
451
- tally = 0
452
- debug_to_log("#{x}: #{(x - 1) * interval}: #{what} does not exist.")
453
- end
454
- rescue
455
- tally = 0
456
- debug_to_log("#{x}: #{(x - 1) * interval}: #{what} rescue: #{$!}")
457
- end
458
- if tally >= ok
459
- return true
460
- end
461
- sleep(interval)
462
- end
463
- end
464
-
465
- # @!endgroup Alternatives
466
-
467
- end
468
- end
469
- end
470
-
1
+ module Awetestlib
2
+ module Regression
3
+ # Methods for waiting until something has happened, or waiting while a condition exists, in the browser or DOM.
4
+ # sleep_for() is the basic technique. Its disadvantage is that it needs to be set for the longest likely wait time.
5
+ # The wait methods take advantage of the Watir and Watir Webdriver wait functionality to pause only as long as necessary for
6
+ # the element in question to be in the state needed.
7
+ module Waits
8
+
9
+ # @!group Core
10
+
11
+ # Sleep for *seconds* seconds before continuing execution of the script.
12
+ # A message is logged (but not reported) which, by default, includes a trace showing where in the script the sleep was invoked.
13
+ # @param [Fixnum] seconds The number of seconds to wait.
14
+ # @param [Boolean] dbg If true, includes a trace in the message
15
+ # @param [String] desc Contains a message or description intended to appear in the log and/or report output.
16
+ def sleep_for(seconds, dbg = true, desc = '')
17
+ trace = "\n#{get_debug_list}" if dbg
18
+ msg = build_message("Sleeping for #{seconds} seconds.", desc, trace)
19
+ info_to_log(msg)
20
+ sleep(seconds)
21
+ end
22
+
23
+ # Wait while an element identified by attribute *how* with value *what* 1) exists, disappears, and exists again.
24
+ # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
25
+ # @param [Symbol] how The element attribute used to identify the specific element.
26
+ # Valid values depend on the kind of element.
27
+ # Common values: :text, :id, :title, :name, :class, :href (:link only)
28
+ # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
29
+ # @param [String] desc Contains a message or description intended to appear in the log and/or report output
30
+ # @param [Fixnum] timeout
31
+ # @return [Boolean] Returns true if disappears and reappears, each within the *timeout* limit
32
+ def wait_for_element_to_reappear(browser, how, what, desc = '', timeout = 20)
33
+ msg = "Element #{how}=#{what} exists. #{desc}"
34
+ wait_while(browser, "While: #{msg}", timeout) { browser.element(how, what).exists? }
35
+ wait_until(browser, "Until: #{msg}", timeout) { browser.element(how, what).exists? }
36
+ end
37
+
38
+ # Wait until element of type *element*, identified by attribute *how* with value *what* exists on the page.
39
+ # Timeout is the default used by watir (60 seconds)
40
+ # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
41
+ # @param [Symbol] element The kind of element to click. Must be one of the elements recognized by Watir.
42
+ # Some common values are :link, :button, :image, :div, :span.
43
+ # @param [Symbol] how The element attribute used to identify the specific element.
44
+ # Valid values depend on the kind of element.
45
+ # Common values: :text, :id, :title, :name, :class, :href (:link only)
46
+ # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
47
+ # @param [String] desc Contains a message or description intended to appear in the log and/or report output
48
+ # @return [Boolean] True if element exists within timeout limit
49
+ def wait_until_exists(browser, element, how, what, desc = '')
50
+ msg = build_message("Wait until (:#{element} :#{how}=>'#{what}') exists.", desc)
51
+ start = Time.now.to_f
52
+ # TODO: try Watir::Wait.until { browser.element(how, what).exists? } instead of this (cumbersome) case statement
53
+ # TODO: above fails on frame
54
+ Watir::Wait.until { browser.exists? }
55
+ begin
56
+ case element
57
+ when :link
58
+ Watir::Wait.until { browser.link(how, what).exists? }
59
+ when :button
60
+ Watir::Wait.until { browser.button(how, what).exists? }
61
+ when :radio
62
+ Watir::Wait.until { browser.radio(how, what).exists? }
63
+ when :checkbox
64
+ Watir::Wait.until { browser.checkbox(how, what).exists? }
65
+ when :div
66
+ Watir::Wait.until { browser.div(how, what).exists? }
67
+ when :select_list
68
+ Watir::Wait.until { browser.select_list(how, what).exists? }
69
+ when :text_field
70
+ Watir::Wait.until { browser.text_field(how, what).exists? }
71
+ when :frame
72
+ Watir::Wait.until { browser.frame(how, what).exists? }
73
+ when :form
74
+ Watir::Wait.until { browser.form(how, what).exists? }
75
+ when :cell
76
+ Watir::Wait.until { browser.cell(how, what).exists? }
77
+ when :image
78
+ Watir::Wait.until { browser.image(how, what).exists? }
79
+ else
80
+ Watir::Wait.until { browser.element(how, what).exists? }
81
+ end
82
+ rescue => e
83
+ if e.class.to_s =~ /TimeOutException/
84
+ failed_to_log("#{msg}: '#{$!}'")
85
+ return false
86
+ elsif not rescue_me(e, __method__, rescue_me_command(element, how, what, :exists?), "#{browser.class}")
87
+ raise e
88
+ end
89
+ end
90
+ stop = Time.now.to_f
91
+ #debug_to_log("#{__method__}: start:#{start} stop:#{stop}")
92
+ # sleep 1
93
+ passed_to_log("#{msg} (#{stop - start} seconds)")
94
+ true
95
+ rescue
96
+ failed_to_log("Unable to complete #{msg}: '#{$!}'")
97
+ end
98
+
99
+ # Wait _while_ expression in *&block* returns true.
100
+ # @example
101
+ # wait_while(browser, 'Textfield is enabled.', 10) { browser.text_field(:id, 'this text field').enabled?}
102
+ #
103
+ # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
104
+ # @param [String] desc Contains a message or description intended to appear in the log and/or report output
105
+ # @param [Fixnum] timeout Maximum time to wait, in seconds.
106
+ # @param [Proc] &block A ruby expression that evaluates to true or false. The expression
107
+ # is usually a watir or watir-webdriver command like .exists?, enabled?, etc. on a
108
+ # specific DOM element. Note that *&block* is listed as the last parameter inside the signature
109
+ # parentheses, but is passed in curly braces outside the signature parentheses in the call. This is
110
+ # the way Ruby works.
111
+ # @return [Boolean] True if condition returns false within time limit.
112
+ def wait_while(browser, desc, timeout = 45, &block)
113
+ #TODO: Would like to be able to see the block code in the log message instead of the identification
114
+ msg = "Wait while #{desc}:"
115
+ start = Time.now.to_f
116
+ Watir::Wait.until { browser.exists? }
117
+ begin
118
+ #Watir::Wait.until(timeout) { block.call(nil) }
119
+ if block.call(nil)
120
+ Watir::Wait.while(timeout) { block.call(nil) }
121
+ end
122
+ rescue => e
123
+ if e.class.to_s =~ /TimeOutException/ or e.message =~ /timed out/
124
+ failed_to_log("#{msg}: '#{$!}' ")
125
+ return false
126
+ elsif not rescue_me(e, __method__, "#{block.to_s}", "#{browser.class}")
127
+ raise e
128
+ end
129
+ end
130
+ stop = Time.now.to_f
131
+ #debug_to_log("#{__method__}: start:#{start} stop:#{stop} block: #{block.to_s}")
132
+ # sleep 1
133
+ passed_to_log("#{msg} (#{"%.5f" % (stop - start)} seconds)") # {#{block.to_s}}")
134
+ true
135
+ rescue
136
+ failed_to_log("Unable to complete #{msg}. '#{$!}'")
137
+ end
138
+
139
+ alias wait_while_true wait_while
140
+
141
+ # Wait _until_ expression in *&block* returns true.
142
+ # @example
143
+ # wait_until(browser, 'Textfield is enabled.', 10) { browser.text_field(:id, 'this text field').exists?}
144
+ #
145
+ # @param (see #wait_while)
146
+ # @return [Boolean] True if condition in *&block* returns true within time limit.
147
+ def wait_until(browser, desc, timeout = 45, skip_pass = false, &block)
148
+ #TODO: Would like to be able to see the block code in the log message instead of the identification
149
+ msg = "Wait until #{desc}"
150
+ start = Time.now.to_f
151
+ Watir::Wait.until { browser.exists? }
152
+ begin
153
+ Watir::Wait.until(timeout) { block.call(nil) }
154
+ rescue => e
155
+ if e.class.to_s =~ /TimeOutException/ or e.message =~ /timed out/
156
+ failed_to_log("#{msg} '#{$!}'")
157
+ return false
158
+ elsif not rescue_me(e, __method__, "#{block.to_s}", "#{browser.class}")
159
+ raise e
160
+ end
161
+ end
162
+ stop = Time.now.to_f
163
+ #debug_to_log("#{__method__}: start:#{start} stop:#{stop} block: #{block.to_s}")
164
+ # sleep 1
165
+ passed_to_log("#{msg} (#{"%.5f" % (stop - start)} seconds)") unless skip_pass # {#{block.to_s}}")
166
+ true
167
+ rescue
168
+ failed_to_log("Unable to complete #{msg} '#{$!}'")
169
+ end
170
+
171
+ alias wait_until_true wait_until
172
+
173
+ # Wait _until_ element, identified by attribute *how* and its value *what*, exists.
174
+ # If it exists within *timeout* seconds then wait _until_ it is enabled.
175
+ # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
176
+ # @param [Symbol] how The element attribute used to identify the specific element.
177
+ # Valid values depend on the kind of element.
178
+ # Common values: :text, :id, :title, :name, :class, :href (:link only)
179
+ # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
180
+ # @param [String] desc Contains a message or description intended to appear in the log and/or report output
181
+ # @param [Fixnum] timeout Maximum time to wait, in seconds.
182
+ # @param [Boolean] verbose When set to true, more debug information is written to the log and
183
+ # all steps return pass/fail messages in the report.
184
+ # @return [Boolean] True if condition returns false within time limit.
185
+ def wait_until_ready(browser, how, what, desc = '', timeout = 90, verbose = false)
186
+ msg = "#{__method__.to_s.titleize}: element: #{how}='#{what}'"
187
+ msg << " #{desc}" if desc.length > 0
188
+ proc_exists = Proc.new { browser.element(how, what).exists? }
189
+ proc_enabled = Proc.new { browser.element(how, what).enabled? }
190
+ case how
191
+ when :href
192
+ proc_exists = Proc.new { browser.link(how, what).exists? }
193
+ proc_enabled = Proc.new { browser.link(how, what).enabled? }
194
+ end
195
+ if verbose
196
+ if wait_until(browser, "#{msg} Element exists.", timeout) { proc_exists.call(nil) }
197
+ if wait_until(browser, "#{msg} Element enabled.", timeout) { proc_enabled.call(nil) }
198
+ passed_to_log(msg)
199
+ true
200
+ else
201
+ failed_to_log(msg)
202
+ end
203
+ else
204
+ failed_to_log(msg)
205
+ end
206
+ else
207
+ start = Time.now.to_f
208
+ Watir::Wait.until { browser.exists? }
209
+ if Watir::Wait.until(timeout) { proc_exists.call(nil) }
210
+ if Watir::Wait.until(timeout) { proc_enabled.call(nil) }
211
+ stop = Time.now.to_f
212
+ #debug_to_log("#{__method__}: start:#{"%.5f" % start} stop:#{"%.5f" % stop}")
213
+ passed_to_log("#{msg} (#{"%.5f" % (stop - start)} seconds)")
214
+ true
215
+ else
216
+ failed_to_log(msg)
217
+ end
218
+ else
219
+ failed_to_log(msg)
220
+ end
221
+ end
222
+ rescue
223
+ failed_to_log("Unable to #{msg}. '#{$!}'")
224
+ end
225
+
226
+ # Wait _until_ element, identified by attribute *how* and its value *what*, exists.
227
+ # If it exists within *timeout* seconds then wait _until_ it is enabled. Report only failures.
228
+ # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
229
+ # @param [Symbol] how The element attribute used to identify the specific element.
230
+ # Valid values depend on the kind of element.
231
+ # Common values: :text, :id, :title, :name, :class, :href (:link only)
232
+ # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
233
+ # @param [String] desc Contains a message or description intended to appear in the log and/or report output
234
+ # @param [Fixnum] timeout Maximum time to wait, in seconds.
235
+ # @param [Boolean] quiet When set to true, only fail messages are logged and reported.
236
+ # @return [Boolean] True if condition returns false within time limit.
237
+ def wait_until_ready_quiet(browser, how, what, desc = '', timeout = 45, quiet = true)
238
+ msg = "#{__method__.to_s.titleize}: element: #{how}='#{what}'"
239
+ msg << " #{desc}" if desc.length > 0
240
+ proc_exists = Proc.new { browser.element(how, what).exists? }
241
+ proc_enabled = Proc.new { browser.element(how, what).enabled? }
242
+ case how
243
+ when :href
244
+ proc_exists = Proc.new { browser.link(how, what).exists? }
245
+ proc_enabled = Proc.new { browser.link(how, what).enabled? }
246
+ end
247
+ start = Time.now.to_f
248
+ Watir::Wait.until { browser.exists? }
249
+ sleep_for(1)
250
+ if Watir::Wait.until(timeout) { proc_exists.call(nil) }
251
+ if Watir::Wait.until(timeout) { proc_enabled.call(nil) }
252
+ stop = Time.now.to_f
253
+ #debug_to_log("#{msg}: start:#{"%.5f" % start} stop:#{"%.5f" % stop}")
254
+ passed_to_log("#{msg} (#{"%.5f" % (stop - start)} seconds)") unless quiet
255
+ true
256
+ else
257
+ failed_to_log(msg)
258
+ end
259
+ else
260
+ failed_to_log(msg)
261
+ end
262
+ rescue
263
+ failed_to_log("Unable to #{msg}. '#{$!}'")
264
+ end
265
+
266
+ def wait_until_text(browser, strg, desc = '', timeout = 60)
267
+ if not strg.class.to_s.match('String')
268
+ raise "#{__method__} requires String for search target. #{strg.class} is not supported."
269
+ end
270
+ wait_until(browser, "'#{strg}' #{desc}", timeout) { browser.text.include? strg }
271
+ end
272
+
273
+ alias wait_until_by_text wait_until_text
274
+
275
+ def wait_until_enabled(browser, what, how, value, desc = '')
276
+ # TODO: This can be simplified
277
+ start = Time.now.to_f
278
+ Watir::Wait.until { browser.exists? }
279
+ sleep_for(1)
280
+ begin
281
+ case what
282
+ when :link
283
+ Watir::Wait.until { browser.link(how, value).enabled? }
284
+ when :button
285
+ Watir::Wait.until { browser.button(how, value).enabled? }
286
+ when :radio
287
+ Watir::Wait.until { browser.radio(how, value).enabled? }
288
+ when :checkbox
289
+ Watir::Wait.until { browser.checkbox(how, value).enabled? }
290
+ when :div
291
+ Watir::Wait.until { browser.div(how, value).enabled? }
292
+ when :select_list
293
+ Watir::Wait.until { browser.select_list(how, value).enabled? }
294
+ when :text_field
295
+ Watir::Wait.until { browser.text_field(how, value).enabled? }
296
+ when :table
297
+ Watir::Wait.until { browser.table(how, value).enabled? }
298
+ else
299
+ Watir::Wait.until { browser.element(how, value).enabled? }
300
+ end
301
+ rescue => e
302
+ if e.class.to_s =~ /TimeOutException/
303
+ failed_to_log("Wait until (#{what} :#{how}=>#{value}) enabled. #{desc}: '#{$!}' #{desc}")
304
+ return false
305
+ elsif not rescue_me(e, __method__, "#{block.to_s}", "#{browser.class}")
306
+ raise e
307
+ end
308
+ end
309
+ stop = Time.now.to_f
310
+ #debug_to_log("#{__method__}: start:#{start} stop:#{stop}")
311
+ # sleep 1
312
+ passed_to_log("Wait until (#{what} :#{how}=>#{value}) enabled. #{desc} (#{stop - start} seconds)")
313
+ true
314
+ rescue
315
+ failed_to_log("Unable to complete wait until (#{what} :#{how}=>#{value}) enabled. #{desc}: '#{$!}'")
316
+ end
317
+
318
+ def wait_until_visible(browser, element, how, what, desc = '')
319
+ start = Time.now.to_f
320
+ Watir::Wait.until { browser.exists? }
321
+ sleep_for(1)
322
+ Watir::Wait.until(20) { browser.element(how, what).exists? }
323
+ begin
324
+ case element
325
+ when :link
326
+ Watir::Wait.until { browser.link(how, what).visible? }
327
+ when :button
328
+ Watir::Wait.until { browser.button(how, what).visible? }
329
+ when :radio
330
+ Watir::Wait.until { browser.radio(how, what).visible? }
331
+ when :checkbox
332
+ Watir::Wait.until { browser.checkbox(how, what).visible? }
333
+ when :div
334
+ Watir::Wait.until { browser.div(how, what).visible? }
335
+ when :select_list
336
+ Watir::Wait.until { browser.select_list(how, what).visible? }
337
+ when :text_field
338
+ Watir::Wait.until { browser.text_field(how, what).visible? }
339
+ else
340
+ Watir::Wait.until { browser.element(how, what).visible? }
341
+ # raise "#{__method__}: Element #{what} not supported."
342
+ end
343
+ rescue => e
344
+ if e.class.to_s =~ /TimeOutException/
345
+ failed_to_log("Wait until (#{what} :#{how}=>#{what}) visible. #{desc}: '#{$!}' #{desc}")
346
+ return false
347
+ elsif not rescue_me(e, __method__, rescue_me_command(element, how, what, :visible?), "#{browser.class}")
348
+ raise e
349
+ end
350
+ end
351
+ stop = Time.now.to_f
352
+ #debug_to_log("#{__method__}: start:#{start} stop:#{stop}")
353
+ # sleep 1
354
+ passed_to_log("Wait until (#{element} :#{how}=>#{what}) visible. #{desc} (#{stop - start} seconds)")
355
+ true
356
+ rescue
357
+ failed_to_log("Unable to complete wait until (#{element} :#{how}=>#{what}) visible. #{desc}: '#{$!}'")
358
+ end
359
+
360
+ # @!endgroup Core
361
+
362
+ # @!group Altenatives
363
+
364
+ # Wait for a specific text to appear in the *browser*.
365
+ # @note This is a last resort method when other wait or wait until avenues have been exhausted.
366
+ # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
367
+ # @param [String, Regexp] text A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
368
+ # @param [String] desc Contains a message or description intended to appear in the log and/or report output
369
+ # @param [Fixnum] threshold The number of seconds after which a warning is added to the report message.
370
+ # @param [Fixnum] interval The time between checks that the text exists.
371
+ # @return [Boolean] Returns true if the text appears before *how_long* has expired.
372
+ def hold_for_text(browser, how_long, text, desc = '', threshold = 20, interval = 0.25)
373
+ countdown = how_long
374
+ Watir::Wait.until { browser.exists? }
375
+ sleep_for(1)
376
+ while ((not browser.contains_text(text)) and countdown > 0)
377
+ sleep(interval)
378
+ countdown = countdown - interval
379
+ end
380
+ if countdown < how_long
381
+ waittime = how_long - countdown
382
+ passed_to_log("#{__method__} '#{text}' found after #{waittime} second(s) #{desc}")
383
+ if waittime > threshold
384
+ failed_to_log("#{__method__} '#{text}' took #{waittime} second(s). (threshold: #{threshold} seconds) #{desc}")
385
+ end
386
+ true
387
+ else
388
+ failed_to_log("#{__method__} '#{text}' not found after #{how_long} second(s) #{desc}")
389
+ false
390
+ end
391
+ rescue
392
+ failed_to_log("Unable to #{__method__} '#{text}'. '#{$!}' #{desc}")
393
+ end
394
+
395
+ alias wait_for_text hold_for_text
396
+
397
+ # Wait up to *how_long* seconds for DOM element *what_for* to exist in the page.
398
+ # @note This is a last resort method when other wait or wait until avenues have been exhausted.
399
+ # @param [Fixnum] how_long Timeout limit
400
+ # @param [Watir::Element] what_for A reference to a Dom element to wait for.
401
+ def wait_for_exists(how_long, what_for)
402
+ wait_for(how_long, what_for)
403
+ end
404
+
405
+ # Wait up to *how_long* seconds for DOM element *what_for* to exist in the page.
406
+ # @note This is a last resort method when other wait or wait until avenues have
407
+ # been exhausted.
408
+ # @param [Fixnum] how_long Timeout limit
409
+ # @param [Watir::Element] what_for A reference to a Dom element to wait for.
410
+ def wait_for(how_long, what_for, interval = 0.25)
411
+ countdown = how_long
412
+ while ((not what_for.exists?) and countdown > 0)
413
+ sleep(interval)
414
+ puts what_for.inspect+':'+countdown.to_s
415
+ countdown = countdown - interval
416
+ end
417
+ if countdown
418
+ puts 'found '+what_for.inspect
419
+ passed_tolog("wait_for (#{how_long} found "+what_for.inspect)
420
+ else
421
+ puts 'Did not find '+what_for.inspect
422
+ failed_tolog("wait_for (#{how_long} did not find "+what_for.inspect)
423
+ end
424
+ countdown
425
+ end
426
+
427
+ # Wait up to *how_long* seconds for DOM element identified by attribute *how* and its value
428
+ # *what* to exist in the page.
429
+ # @note This is a last resort method when other wait or wait until avenues have been exhausted.
430
+ # @param [Watir::Browser] browser A reference to the browser window or container element to be tested.
431
+ # @param [Symbol] how The element attribute used to identify the specific element.
432
+ # Valid values depend on the kind of element.
433
+ # Common values: :text, :id, :title, :name, :class, :href (:link only)
434
+ # @param [String, Regexp] what A string or a regular expression to be found in the *how* attribute that uniquely identifies the element.
435
+ # @param [Fixnum] wait Timeout limit.
436
+ # @param [Fixnum] interval How long to wait before checking again.
437
+ # @return [Boolean] True if element exists within *wait* time
438
+ def wait_the_hard_way(browser, how, what, wait = 6, interval = 0.25)
439
+ count = (wait / interval).to_i + 1
440
+ tally = 0
441
+ ok = (1 / interval).to_i + 1
442
+ debug_to_log("#{__method__}: wait: #{wait} secs; interval: #{interval} secs; count; #{count}; thresh: #{ok}")
443
+ Watir::Wait.until { browser.exists? }
444
+ sleep_for(1)
445
+ (1..count).each do |x|
446
+ begin
447
+ if browser.element(how, what).exists?
448
+ tally += 1
449
+ debug_to_log("#{x}: #{(x - 1) * interval}: #{what} exists.")
450
+ else
451
+ tally = 0
452
+ debug_to_log("#{x}: #{(x - 1) * interval}: #{what} does not exist.")
453
+ end
454
+ rescue
455
+ tally = 0
456
+ debug_to_log("#{x}: #{(x - 1) * interval}: #{what} rescue: #{$!}")
457
+ end
458
+ if tally >= ok
459
+ return true
460
+ end
461
+ sleep(interval)
462
+ end
463
+ end
464
+
465
+ # @!endgroup Alternatives
466
+
467
+ end
468
+ end
469
+ end
470
+