oats 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. data/.gitignore +6 -0
  2. data/Gemfile +15 -0
  3. data/README.txt +165 -0
  4. data/Rakefile +2 -0
  5. data/bin/agent +204 -0
  6. data/bin/oats +10 -0
  7. data/bin/occ +29 -0
  8. data/bin/results_cleanup +6 -0
  9. data/doc/COPYING +55 -0
  10. data/doc/LICENSE +55 -0
  11. data/doc/OATS_Framework.doc +0 -0
  12. data/doc/classes/ApplicationLogs.html +239 -0
  13. data/doc/classes/Campaign.html +843 -0
  14. data/doc/classes/CommandlineOptions.html +131 -0
  15. data/doc/classes/Driver.html +182 -0
  16. data/doc/classes/Hash.html +137 -0
  17. data/doc/classes/Ide.html +194 -0
  18. data/doc/classes/MapSelenium.html +197 -0
  19. data/doc/classes/Net.html +107 -0
  20. data/doc/classes/Oats/OatsFilterError.html +119 -0
  21. data/doc/classes/Oats.html +998 -0
  22. data/doc/classes/OatsAssertError.html +119 -0
  23. data/doc/classes/OatsBadInput.html +119 -0
  24. data/doc/classes/OatsData.html +290 -0
  25. data/doc/classes/OatsError.html +117 -0
  26. data/doc/classes/OatsExit.html +117 -0
  27. data/doc/classes/OatsLock.html +254 -0
  28. data/doc/classes/OatsMain.html +182 -0
  29. data/doc/classes/OatsMysqlError.html +113 -0
  30. data/doc/classes/OatsMysqlMissingInput.html +113 -0
  31. data/doc/classes/OatsReportError.html +113 -0
  32. data/doc/classes/OatsSetupError.html +119 -0
  33. data/doc/classes/OatsTestError.html +119 -0
  34. data/doc/classes/OatsTestExit.html +119 -0
  35. data/doc/classes/OatsTestLocateError.html +120 -0
  36. data/doc/classes/OatsVerifyError.html +119 -0
  37. data/doc/classes/Ragent.html +397 -0
  38. data/doc/classes/Rclient.html +236 -0
  39. data/doc/classes/Report.html +368 -0
  40. data/doc/classes/Reports.html +244 -0
  41. data/doc/classes/RestApi.html +333 -0
  42. data/doc/classes/RhttpClient.html +236 -0
  43. data/doc/classes/Rimap.html +170 -0
  44. data/doc/classes/Rmysql.html +176 -0
  45. data/doc/classes/Roptions.html +131 -0
  46. data/doc/classes/Rselenium.html +233 -0
  47. data/doc/classes/Rssh.html +138 -0
  48. data/doc/classes/Runnable.html +174 -0
  49. data/doc/classes/SFTriggers.html +206 -0
  50. data/doc/classes/Selenium/Client/Driver.html +211 -0
  51. data/doc/classes/Selenium/Client.html +107 -0
  52. data/doc/classes/Selenium.html +107 -0
  53. data/doc/classes/SystemCapture.html +304 -0
  54. data/doc/classes/TestCase.html +418 -0
  55. data/doc/classes/TestData.html +235 -0
  56. data/doc/classes/TestList.html +264 -0
  57. data/doc/classes/Tools.html +244 -0
  58. data/doc/classes/Util.html +201 -0
  59. data/doc/classes/Variation.html +206 -0
  60. data/doc/fr_class_index.html +92 -0
  61. data/doc/fr_method_index.html +465 -0
  62. data/doc/index.html +23 -0
  63. data/doc/oats_httpd.conf +32 -0
  64. data/doc/oats_user.yml +25 -0
  65. data/doc/rdoc-style.css +208 -0
  66. data/lib/deep_merge/.gitignore +2 -0
  67. data/lib/deep_merge/core.rb +195 -0
  68. data/lib/deep_merge/deep_merge.rb +1 -0
  69. data/lib/deep_merge/deep_merge_hash.rb +28 -0
  70. data/lib/deep_merge/rails_compat.rb +27 -0
  71. data/lib/oats/application_logs.rb +163 -0
  72. data/lib/oats/build_id.rb +58 -0
  73. data/lib/oats/commandline_options.rb +128 -0
  74. data/lib/oats/diff.rb +278 -0
  75. data/lib/oats/driver.rb +492 -0
  76. data/lib/oats/ide.rb +227 -0
  77. data/lib/oats/keywords.rb +67 -0
  78. data/lib/oats/log4r_init.rb +14 -0
  79. data/lib/oats/mysql.rb +97 -0
  80. data/lib/oats/oats.rb +637 -0
  81. data/lib/oats/oats_data.rb +400 -0
  82. data/lib/oats/oats_exceptions.rb +25 -0
  83. data/lib/oats/oats_lock.rb +261 -0
  84. data/lib/oats/oats_selenium_api.rb +639 -0
  85. data/lib/oats/oselenium.rb +189 -0
  86. data/lib/oats/ossh.rb +36 -0
  87. data/lib/oats/patches_for_eventmachine_12.10.rb +66 -0
  88. data/lib/oats/ragent.rb +321 -0
  89. data/lib/oats/rclient.rb +42 -0
  90. data/lib/oats/report.rb +207 -0
  91. data/lib/oats/roptions.rb +88 -0
  92. data/lib/oats/test_case.rb +510 -0
  93. data/lib/oats/test_data.rb +98 -0
  94. data/lib/oats/test_list.rb +141 -0
  95. data/lib/oats/unixdiff.rb +75 -0
  96. data/lib/oats/util.rb +125 -0
  97. data/lib/oats/version.rb +3 -0
  98. data/lib/oats.rb +36 -0
  99. data/nbproject/configs/agent.properties +0 -0
  100. data/nbproject/configs/gr.properties +0 -0
  101. data/nbproject/project.properties +10 -0
  102. data/nbproject/project.xml +17 -0
  103. data/oats.gemspec +42 -0
  104. data/oats_ini.yml +258 -0
  105. data/oats_tests/Gemfile +18 -0
  106. data/oats_tests/aut_ini.yml +30 -0
  107. data/oats_tests/bin/oats +8 -0
  108. data/oats_tests/environments/qa.yml +4 -0
  109. data/oats_tests/environments/qa_chrome.yml +4 -0
  110. data/oats_tests/examples/core/coreExamples.yml +8 -0
  111. data/oats_tests/examples/core/expectedException.rb +39 -0
  112. data/oats_tests/examples/core/ok_verify.rb +2 -0
  113. data/oats_tests/examples/core/ok_verify.rb_ok/out/myfile.txt +1 -0
  114. data/oats_tests/examples/core/ok_verify.rb_ok/out/myfile2.txt +1 -0
  115. data/oats_tests/examples/core/ok_verify.rb_ok/rats_test.log +2 -0
  116. data/oats_tests/examples/core/unexpectedException.rb +30 -0
  117. data/oats_tests/examples/examples.yml +13 -0
  118. data/oats_tests/examples/gui/guiExamples.yml +7 -0
  119. data/oats_tests/examples/gui/seleniumGoogle.rb +10 -0
  120. data/oats_tests/examples/gui/webdriverGoogle.rb +9 -0
  121. data/oats_tests/examples/keywords/SampleXlList-1.xls +0 -0
  122. data/oats_tests/examples/keywords/SampleXlList-2.xls +0 -0
  123. data/oats_tests/examples/keywords/SampleXlLists.xls +0 -0
  124. data/oats_tests/examples/keywords/keywordsDriver.rb +1 -0
  125. data/oats_tests/examples/keywords/keywordsExamples.yml +8 -0
  126. data/oats_tests/examples/keywords/keywordsTC1.yml +5 -0
  127. data/oats_tests/examples/keywords/keywordsTestlist.yml +16 -0
  128. data/oats_tests/examples/needsWork/addTestDynamically.rb +4 -0
  129. data/oats_tests/examples/needsWork/emailVerify.rb +34 -0
  130. data/oats_tests/examples/needsWork/testSql/rtest.sql +6 -0
  131. data/oats_tests/examples/needsWork/testSql/rtest.yml +11 -0
  132. data/oats_tests/examples/occTest/occTest.rb +13 -0
  133. data/oats_tests/examples/occTest/occTest_1.rb +1 -0
  134. data/oats_tests/examples/occTest/occTest_1_1.rb +1 -0
  135. data/oats_tests/examples/occTest/occTest_1_2.rb +1 -0
  136. data/oats_tests/examples/occTest/occTest_1_3.rb +1 -0
  137. data/oats_tests/examples/occTest/occTest_1_4.rb +1 -0
  138. data/oats_tests/examples/occTest/occTest_2.rb +1 -0
  139. data/oats_tests/examples/occTest/occTest_2_1.rb +1 -0
  140. data/oats_tests/examples/occTest/occTest_2_2.rb +1 -0
  141. data/oats_tests/examples/occTest/occTest_2_3.rb +1 -0
  142. data/oats_tests/examples/occTest/occTest_2_4.rb +1 -0
  143. data/oats_tests/examples/occTest/occTest_3.rb +1 -0
  144. data/oats_tests/examples/occTest/occTest_3_1.rb +1 -0
  145. data/oats_tests/examples/occTest/occTest_3_2.rb +1 -0
  146. data/oats_tests/examples/occTest/occTest_3_3.rb +1 -0
  147. data/oats_tests/examples/occTest/occTest_3_4.rb +1 -0
  148. data/oats_tests/examples/occTest/occTest_4.rb +1 -0
  149. data/oats_tests/examples/occTest/occTestlist.yml +9 -0
  150. data/oats_tests/examples/occTest/occTestlist_1.yml +9 -0
  151. data/oats_tests/examples/occTest/occTestlist_2.yml +9 -0
  152. data/oats_tests/examples/occTest/occTestlist_3.yml +9 -0
  153. data/oats_tests/examples/occTest/variation1.yml +4 -0
  154. data/oats_tests/examples/occTest/variation2.yml +4 -0
  155. data/oats_tests/examples/testFileLocationUnitTests/extn_driver.rb +4 -0
  156. data/oats_tests/examples/testFileLocationUnitTests/folder/oats.yml +3 -0
  157. data/oats_tests/examples/testFileLocationUnitTests/folder/t1.rb +2 -0
  158. data/oats_tests/examples/testFileLocationUnitTests/folder1/t1.yml +2 -0
  159. data/oats_tests/examples/testFileLocationUnitTests/folder1/t1_1.yml +3 -0
  160. data/oats_tests/examples/testFileLocationUnitTests/folder2/oats.yml +3 -0
  161. data/oats_tests/examples/testFileLocationUnitTests/folder2/t1.rb +2 -0
  162. data/oats_tests/examples/testFileLocationUnitTests/folder2/t1.yml +2 -0
  163. data/oats_tests/examples/testFileLocationUnitTests/no_yaml.rb +3 -0
  164. data/oats_tests/examples/testFileLocationUnitTests/post_yaml.rb +1 -0
  165. data/oats_tests/examples/testFileLocationUnitTests/t1.rb +4 -0
  166. data/oats_tests/examples/testFileLocationUnitTests/t1.yml +2 -0
  167. data/oats_tests/examples/testFileLocationUnitTests/t1_1.yml +3 -0
  168. data/oats_tests/examples/testFileLocationUnitTests/testDir/oats.yml +3 -0
  169. data/oats_tests/examples/testFileLocationUnitTests/testDir/t1.rb +2 -0
  170. data/oats_tests/examples/testFileLocationUnitTests/testDir/t1.yml +2 -0
  171. data/oats_tests/examples/testFileLocationUnitTests/testDir2/t1.rb +2 -0
  172. data/oats_tests/examples/testFileLocationUnitTests/testDir2/t1.yml +2 -0
  173. data/oats_tests/examples/testFileLocationUnitTests/unitTestList.yml +36 -0
  174. data/oats_tests/examples/testFileLocationUnitTests/yml_driver.rb +2 -0
  175. data/oats_tests/lib/business.rb +28 -0
  176. data/oats_tests/lib/sample_xl_lists.rb +37 -0
  177. data/test/common_test_unit_setup.rb +21 -0
  178. data/test/test_basic.rb +16 -0
  179. data/test/test_selenium.rb +16 -0
  180. data/test/test_xl_lists.rb +16 -0
  181. metadata +291 -0
@@ -0,0 +1,639 @@
1
+ require "selenium-webdriver"
2
+
3
+ #module Selenium
4
+ # module WebDriver
5
+ # class Driver
6
+ # def bridge
7
+ # @bridge
8
+ # end
9
+ # end
10
+ # end
11
+ #end
12
+
13
+ class String
14
+ def locator
15
+ Oats::Locator.new(self)
16
+ end
17
+ end
18
+
19
+ module Oats
20
+ class Locator
21
+ attr_accessor :element
22
+ attr_reader :what, :ehow, :locator
23
+ def initialize(locator, ehow=nil)
24
+ if locator.instance_of?(Array)
25
+ @ehow = locator[1]
26
+ @what = locator[0]
27
+ elsif locator.instance_of?(String)
28
+ @what = @locator = locator
29
+ if ehow
30
+ @ehow = ehow
31
+ else
32
+ if locator[0,5] == 'link='
33
+ @what = locator[5..-1]
34
+ @ehow = :link
35
+ elsif locator[0,5] == 'name='
36
+ @what = locator[5..-1]
37
+ @ehow = :name
38
+ elsif locator[0,3] == 'id='
39
+ @what = locator[3..-1]
40
+ @ehow = :id
41
+ elsif locator.index('/')
42
+ @ehow = :xpath
43
+ else
44
+ @ehow = :name
45
+ end
46
+ end
47
+ else
48
+ raise('Unexpected arguments')
49
+ end
50
+ end
51
+
52
+ def to_s
53
+ @ehow.to_s + '='+ @what.to_s
54
+ end
55
+
56
+ include Comparable
57
+ def <=>(locator)
58
+ if locator.instance_of?(String)
59
+ self.what <=> locator
60
+ else
61
+ if self.what == locator.what
62
+ self.ehow <=> locator.ehow
63
+ else
64
+ self.what <=> locator.what
65
+ end
66
+ end
67
+ end
68
+
69
+ def ===(locator)
70
+ self == locator
71
+ end
72
+
73
+ # Allow "link=Accounts".locator.wait.click
74
+ def method_missing(id,*args)
75
+ case id
76
+ when :wait then id = :wait_for_element
77
+ end
78
+ # if selenium.webdriver?
79
+ @element ||= selenium.element?(self)
80
+ if @element.respond_to?(id)
81
+ @element.send(id, *args)
82
+ else
83
+ raise "#{@element} has no method #{id.inspect}"
84
+ end
85
+ # else
86
+ # if selenium.respond_to?(id)
87
+ # selenium.send(id,self, *args)
88
+ # else
89
+ # raise "#{selenium} has no method #{id.inspect}"
90
+ # end
91
+ # end
92
+ end
93
+ end
94
+ end
95
+
96
+ class Selenium::WebDriver::Driver
97
+ attr_accessor :osel, :no_oats_debug
98
+ attr_reader :last_locator
99
+
100
+ def webdriver?
101
+ true
102
+ end
103
+
104
+ def logout
105
+ osel.logout
106
+ return self
107
+ end
108
+
109
+ def login(*args)
110
+ osel.login(*args)
111
+ return self
112
+ end
113
+
114
+ def alert(msg = nil, action = 'accept')
115
+ return unless webdriver?
116
+ # selenium.sleep 1
117
+ alert = switch_to.alert;
118
+ txt = alert.text
119
+ if msg
120
+ oats_debug "#{action}ing alert [#{txt}]"
121
+ # Oats.assert txt =~ /#{msg}/, "Alert text does not match input msg: [#{msg}]"
122
+ Oats.assert(txt == msg, "Alert text does not match input msg: [#{msg}]")
123
+ end
124
+ alert.send(action);
125
+ end
126
+
127
+ # Makes an Oats.assert based on text? existence.
128
+ def oats_assert_text(text_string)
129
+ Oats.assert $selenium.text?(text_string), "Missing message: #{text_string}"
130
+ end
131
+
132
+ # Scrolls till element is visible.
133
+ def scroll(locator)
134
+ loc = element?(locator)
135
+ loc.location_once_scrolled_into_view
136
+ end
137
+
138
+ def checked?(locator)
139
+ oats_debug "checked? #{locator}"
140
+ return is_checked_orig(locator) ? locator : false unless webdriver?
141
+ loc = element?(locator)
142
+ loc.element.selected? ? loc : false
143
+ end
144
+ alias :is_checked :checked?
145
+
146
+ def click(locator)
147
+ oats_debug "click #{locator}"
148
+ # if webdriver?
149
+ el = element?(locator)
150
+ Oats.assert el, "No element is found at locator #{locator}"
151
+ el.click
152
+ # else
153
+ # click_orig(locator)
154
+ # el = locator
155
+ # end
156
+ el
157
+ end
158
+
159
+ def ie?
160
+ Oats.data('selenium.browser_type') =~ /ie/
161
+ end
162
+
163
+ def chrome?
164
+ Oats.data('selenium.browser_type') =~ /chrome/
165
+ end
166
+
167
+ def firefox?
168
+ Oats.data('selenium.browser_type') =~ /firefox/
169
+ end
170
+
171
+ # select
172
+ def select(locator, value, noscript = nil, select_tag = 'option')
173
+ oats_debug "select #{value} at #{locator} by tag_name #{select_tag}"
174
+ # unless webdriver?
175
+ # select_orig(locator, value)
176
+ # return locator
177
+ # end
178
+ attribute, val = value.split(/=/)
179
+ options = []
180
+ if val
181
+ attribute = 'text' if attribute == 'label'
182
+ else
183
+ val = attribute
184
+ attribute = 'text'
185
+ end
186
+ if val.index("*")
187
+ regex = true
188
+ end
189
+ el = element?(locator)
190
+ if el
191
+ el.find_elements(:tag_name,select_tag).each do |opt|
192
+ attr_value = opt.attribute(attribute)
193
+ match = if regex
194
+ attr_value =~ /#{val}/
195
+ else
196
+ attr_value == val
197
+ end
198
+ # if attr_value == val
199
+ # el.click
200
+ if match
201
+ loc = locator.to_s.split(/'/)
202
+ opt.click
203
+ unless noscript
204
+ selenium.run_script("$('##{loc[1]}').change()") if selenium.ie? and loc[1]
205
+ end
206
+ return opt
207
+ end
208
+ options.push attr_value
209
+ end
210
+ end
211
+ raise OatsTestError, "Could not find #{val} among options: #{options.inspect}"
212
+ end
213
+
214
+ def gettagid(locator, select_tag = 'option', attribute = 'text')
215
+ oats_debug "Store #{locator} ids by tag_name #{select_tag}"
216
+ el = element?(locator)
217
+ raise OatsTestError, "Could not find #{locator} among options:" if !el
218
+ el.find_elements(:tag_name,select_tag).collect { |opt| opt.attribute(attribute)}
219
+ end
220
+
221
+ # wait_for_element followed by a select
222
+ def wait_and_select(locator, value, noscript = nil, select_tag = 'option')
223
+ select(wait_for_element(locator), value, noscript, select_tag)
224
+ end
225
+
226
+ def open(url)
227
+ url = Oats::Oselenium.remote_webdriver_map_file_path(url)
228
+ if @osel.login_base_url.nil? or @osel.login_base_url == @osel.base_url or @osel.login_base_url =~ /http.*/
229
+ oats_debug "opening URL [#{url}]"
230
+ else
231
+ url = @osel.login_base_url + url
232
+ oats_debug "opening non-base URL [#{url}]"
233
+ end
234
+ navigate.to(url)
235
+ end
236
+
237
+ def get_row(locator,col_tag)
238
+ locator = locator + '//' + col_tag
239
+ arr = elements(locator).collect{|el| el.text}
240
+ return arr
241
+ end
242
+
243
+ def get_table(locator)
244
+ arr = []
245
+ selenium.wait_for_element("//div[@id='#{locator}']")
246
+ arr[0] = get_row("//div[@id='#{locator}']//thead/tr",'th[not(contains(@style,"display: none;"))]')
247
+ for row in 1..100
248
+ # loc = "//div[@id='#{locator}']//tbody/tr[#{row}]"
249
+ row_array = get_row("//div[@id='#{locator}']//tbody/tr[#{row}]",'td[not(contains(@style,"display: none;"))]')
250
+ break if row_array.empty?
251
+ arr[row] = row_array
252
+ end
253
+ return arr
254
+ end
255
+ # Returns locator if /value/ =~ text in any of the locators, or
256
+ # false if element is not found, nil otherwise
257
+ def text?(value, *locators)
258
+ locators.flatten!
259
+ found = nil
260
+ value_reg = value.instance_of?(Regexp) ? value : /#{value}/
261
+ if locators.empty?
262
+ Oats.warn "Please include a locator to more speficifically locate text: [#{value}]"
263
+ # if webdriver?
264
+ locators = [Locator.new('body',:tag_name)]
265
+ # else
266
+ # found = is_text_orig(value)
267
+ # end
268
+ end
269
+ locator = false
270
+ found = locators.find do |loc|
271
+ # if webdriver?
272
+ elems = elements(loc)
273
+ if elems and !elems.empty?
274
+ elems.find { |el|
275
+ if el.displayed?
276
+ locator = true
277
+ value_reg =~ el.text
278
+ end
279
+ }
280
+ end
281
+ # else
282
+ # if loc
283
+ # begin
284
+ # if element?(loc) and visible?(loc)
285
+ # locator = true
286
+ # value_reg =~ text_orig(loc)
287
+ # end
288
+ # rescue Selenium::CommandError => exc
289
+ # raise unless exc.message =~ /Element .* not found/
290
+ # end
291
+ # end
292
+ # end
293
+ end if found.nil?
294
+ oats_debug('text? '+(found ? 'found' : 'could not locate' ) +" [#{value}] at #{locators}")
295
+ if found
296
+ found
297
+ else
298
+ locator ? nil : false
299
+ end
300
+ end
301
+
302
+ # Returns nil, text, or array of texts found at locator(s)
303
+ def text(locators)
304
+ # txt = if webdriver?
305
+ texts = elements(locators).collect{|el| el.text}
306
+ txt = case texts.size
307
+ when 0 then nil
308
+ when 1 then texts[0]
309
+ else texts
310
+ end
311
+ # else
312
+ # text_orig(locators)
313
+ # end
314
+ oats_debug "text(s) at #{locators}: #{txt.inspect}"
315
+ txt
316
+ end
317
+
318
+ # Complete the text in locator to value if necessary and return locator
319
+ # If webdriver, set retype to true if you want to clear the input and retype.
320
+ # If you just want to type value without clearing the element, set retype=>nil.
321
+ def type(locator, value, retype = false, delay = false)
322
+ value = value.to_s
323
+ # if webdriver?
324
+ locator = element?(locator)
325
+ el = locator.element
326
+ if retype
327
+ xtra = value
328
+ locator.element.clear
329
+ else
330
+ old = el[:value]
331
+ xtra = value.sub(/^#{old}/,'')
332
+ el.clear if xtra == value and old != '' and !retype.nil?
333
+ end
334
+ if xtra == ''
335
+ if old == ''
336
+ oats_debug "type skipping already existing '#{value}' at #{locator}"
337
+ elsif xtra == value
338
+ oats_debug "type cleared already existing '#{old}' at #{locator}"
339
+ end
340
+ else
341
+ oats_debug "type '#{xtra}' at #{locator}"
342
+ if delay
343
+ xtra = xtra.split(//)
344
+ for i in 0..xtra.length
345
+ # selenium.sleep 1
346
+ el.send_keys(xtra[i])
347
+ end
348
+ else
349
+ el.send_keys(xtra)
350
+ end
351
+ end
352
+ # else
353
+ # locator ||= @last_locator
354
+ # oats_debug "type '#{value}' at #{locator}"
355
+ # type_orig(locator, value)
356
+ # end
357
+ return locator
358
+ end
359
+
360
+ def wait_and_type(locator, value, options = nil, delay = nil)
361
+ options ||= {}
362
+ retype = options.delete(:retype) if options.key?(:retype)
363
+ loc = wait_for_element(locator, options)
364
+ type(loc, value, retype, delay)
365
+ end
366
+
367
+ def type_keys(locator, value, retype = false)
368
+ # if webdriver?
369
+ type(locator, value, retype)
370
+ # else
371
+ # if retype
372
+ # oats_debug "type_keys cleared already existing text at #{locator} "
373
+ # type_orig(locator,"")
374
+ # end
375
+ # oats_debug "type_keys '#{value}' at #{locator} "
376
+ # type_keys_orig(locator, value)
377
+ # end
378
+ end
379
+
380
+ # Press the return key into the input field
381
+ def type_return(locator)
382
+ # if webdriver?
383
+ type(locator,"\n")
384
+ # else
385
+ # key_press(locator||@last_locator, "\\13")
386
+ # end
387
+ end
388
+
389
+ # Waits as in wait_for_element and then clicks on the locator
390
+ # If wait_for_element succeeds, returns locator, else nil
391
+ def wait_and_click(locator, options = {})
392
+ # options[:extra_seconds] ||= 1 if selenium.chrome?
393
+ loc = wait_for_element(locator, options)
394
+ return nil unless loc
395
+ click(loc)
396
+ end
397
+
398
+ # Clicks on the element if running webdriver, else does a selenium mouse_over after waiting for element.
399
+ def wait_and_mouse_over(locator)
400
+ # if webdriver?
401
+ wait_and_click(locator)
402
+ # else
403
+ # wait_for_element(locator)
404
+ # selenium.mouse_over(locator)
405
+ # ends
406
+ end
407
+
408
+ # Waits using Oats.wait_until the value matches any of the locators
409
+ # If succeeds returns locator, else registers Oats.error and returns false
410
+ # options
411
+ # :is_anywhere => true Will return true if text appears anywhere on the page
412
+ def wait_for_text(value, locators, options = nil)
413
+ options ||= {}
414
+ skip_error = options.delete(:skip_error) if options.key?(:skip_error)
415
+ is_anywhere = options.delete(:is_anywhere) if options.key?(:is_anywhere)
416
+ is_anywhere = false if webdriver?
417
+ oats_debug "wait_for_text #{value.inspect}"
418
+ loc = wait_for_element(locators, options) do |l|
419
+ is_anywhere ? text?(value) : text?(value, l)
420
+ end
421
+ if loc
422
+ text?(value, loc)
423
+ elsif skip_error == 'fail'
424
+ if loc == element?(locators)
425
+ actual = text(loc)
426
+ Oats.error "Expected #{value}, but received #{actual}" unless actual =~ /#{value}/
427
+ else
428
+ Oats.error "Missing text #{value}"
429
+ end
430
+ end
431
+ end
432
+
433
+
434
+ # Returns Locator if found in any of the locator(s array), or raises OatsTestError
435
+ # Sets selenium.last_locator and selenium.last_element
436
+ # See Oats.wait_until for definition of options hash,
437
+ # Waits for options[:extra_seconds] if specified
438
+ def wait_for_element(locators, *options)
439
+ locators = [locators] unless locators.instance_of?(Array)
440
+ wait_opts = {}
441
+ while o = options.shift
442
+ if o.instance_of?(Hash)
443
+ wait_opts = o
444
+ else
445
+ locators.push o
446
+ end
447
+ end
448
+ wait_opts[:message] ||= "Could not find locator: #{locators}"
449
+ extra_seconds = wait_opts.delete(:extra_seconds) if wait_opts[:extra_seconds]
450
+ time = wait_opts[:seconds] ? "#{wait_opts[:seconds].to_s} seconds " : ''
451
+ oats_debug "wait #{time}for #{locators}"
452
+ @last_locator = nil
453
+ found = nil
454
+ save_debug = @no_oats_debug
455
+ Oats.wait_until wait_opts do
456
+ locators.find do |loc|
457
+ found = element?(loc)
458
+ # if webdriver?
459
+ found = nil if found and not found.element.displayed?
460
+ # else
461
+ # begin
462
+ # if found and selenium.visible?(loc)
463
+ # found = loc
464
+ # else
465
+ # found = nil
466
+ # end
467
+ # rescue Selenium::CommandError => exc
468
+ # found = nil unless exc.message =~ /Element .* not found/
469
+ # end
470
+ # end
471
+ if found and block_given?
472
+ @no_oats_debug = true
473
+ yield found
474
+ else
475
+ found
476
+ end
477
+ end
478
+ end
479
+ @no_oats_debug = save_debug
480
+ oats_debug "found locator: #{found}" if found and locators.size > 1
481
+ if extra_seconds && !Oats.data('selenium.no_extra_sleep')
482
+ oats_debug "is waiting #{extra_seconds} extra seconds for #{locators}"
483
+ sleep extra_seconds
484
+ end
485
+ @last_locator = found if found
486
+ return found
487
+ ensure
488
+ @no_oats_debug = save_debug
489
+ end
490
+
491
+ def oats_debug(output)
492
+ options ||= {}
493
+ Oats.debug('Webdriver '+output) unless @no_oats_debug
494
+ end
495
+
496
+ def sleep(seconds, browser = nil)
497
+ return if Oats.data('selenium.no_extra_sleep')
498
+ browser_match = browser.nil? or Oats.data('selenium.browser_type') =~ /#{browser}/
499
+ if browser_match
500
+ oats_debug "sleep #{seconds} extra seconds"
501
+ Kernel.sleep seconds
502
+ end
503
+ end
504
+
505
+ def wait_until_loaded(options = {})
506
+ # puts '------------------'
507
+ # src = selenium.get_html_source
508
+ # puts src
509
+ # puts '------------------'
510
+ options[:message] = "Did not finish loading"
511
+ Oats.wait_until(options) do
512
+ if selenium.element?("//div[@class = 'loading' and not (contains(@style, 'display: none'))]")
513
+ oats_debug 'noticed loading...'
514
+ true
515
+ else
516
+ oats_debug 'waiting to see loading...'
517
+ false
518
+ end
519
+ end
520
+ Oats.wait_until(options) do
521
+ if selenium.element?("//div[@class = 'loading' and not (contains(@style, 'display: none'))]")
522
+ oats_debug 'finished loading...'
523
+ false
524
+ oats_debug 'still loading...'
525
+ else
526
+ true
527
+ end
528
+ end
529
+ end
530
+
531
+
532
+
533
+ def refresh
534
+ oats_debug "refresh page"
535
+ navigate.refresh
536
+ end
537
+
538
+
539
+ alias_method :location, :current_url
540
+ alias_method :mouse_down, :click
541
+ alias_method :key_press, :type
542
+
543
+ def run_script(*args)
544
+ execute_script(*args)
545
+ end
546
+
547
+ def get_attribute(locator)
548
+ oats_debug "get_attribute #{locator}"
549
+ loc, val = locator.split(/\/@/)
550
+ element?(loc).attribute(val)
551
+ end
552
+
553
+ # Somehow the rescue below doesn't work if I move this code to Oats::Selenium::Api
554
+ # Returns first Locator matching locator or nil. See find_element for ehow choices.
555
+ # Input parameter is one or an array of locator inputs.
556
+ def element?(*locator_args)
557
+ return @last_locator if locator_args.empty?
558
+ found = nil
559
+ locator_args.each do |loc|
560
+ begin
561
+ if loc.instance_of?(String) or loc.instance_of?(Array)
562
+ locator = Oats::Locator.new(loc)
563
+ else
564
+ locator = loc
565
+ end
566
+ locator.element = find_element(locator.ehow, locator.what)
567
+ if locator.element
568
+ found = locator
569
+ end
570
+ rescue Selenium::WebDriver::Error::NoSuchElementError
571
+ end
572
+ end
573
+ return @last_locator = found
574
+ end
575
+
576
+
577
+ # Returns array of elements matching locator. Last locator is first matching elemnet
578
+ def elements(*locator_args)
579
+ return @last_locator if locator_args.empty?
580
+ if locator_args[0].instance_of?(Oats::Locator)
581
+ locator = locator_args[0]
582
+ else
583
+ locator = Oats::Locator.new(*locator_args)
584
+ end
585
+ elements = find_elements(locator.ehow, locator.what)
586
+ # elements.empty?
587
+ locator.element = elements
588
+ @last_locator = locator
589
+ return elements
590
+
591
+ end
592
+
593
+ def select_frame(locator)
594
+ fid = selenium.get_attribute locator+'/@id'
595
+ selenium.switch_to.frame(fid)
596
+ end
597
+
598
+ def navigate_back
599
+ selenium.navigate.back
600
+ end
601
+
602
+ def wait_for_page_to_load
603
+ return
604
+ end
605
+
606
+ def switch_to_default_content
607
+ selenium.switch_to.default_content
608
+ end
609
+
610
+ def element_size(locator)
611
+ el_size = selenium.find_element(:xpath, locator).size
612
+ img_size = el_size.width.to_s + "x" + el_size.height.to_s
613
+ end
614
+
615
+ def get_cookie_by_name(cookie)
616
+ selenium.manage.cookie_named(cookie)
617
+ end
618
+
619
+ def cookies
620
+ all_my_cookies = selenium.manage.all_cookies
621
+ cookies_str = ""
622
+ all_my_cookies.each do |my_cookie|
623
+ cookies_str = cookies_str + my_cookie[:name].to_s + "=" + my_cookie[:value].to_s + "; "
624
+ end
625
+ return cookies_str
626
+ end
627
+
628
+ def delete_cookie(cookie, options)
629
+ selenium.manage.delete_cookie(cookie)
630
+ end
631
+
632
+ def delete_all_cookies
633
+ selenium.manage.delete_all_cookies
634
+ end
635
+
636
+ def style(locator, prop_value)
637
+ element(locator).style(prop_value)
638
+ end
639
+ end