oats 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,207 @@
1
+ #require 'oats/oselenium' if $oats_execution
2
+ require 'yaml' # http://www.ruby-doc.org/core/classes/YAML.html http://yaml4r.sourceforge.net/doc
3
+ require 'oats/test_case'
4
+ require 'oats/test_list'
5
+ require 'oats/oats_exceptions'
6
+
7
+ class OatsReportError < OatsError ; end
8
+
9
+ module Oats
10
+
11
+ class Report
12
+ @@pre_test = nil
13
+ @@post_test = nil
14
+
15
+ def Report.failed_file_name(var)
16
+ if var.instance_of?(Variation)
17
+ list_name = var.list_name
18
+ else
19
+ list_name = var
20
+ end
21
+ return unless list_name
22
+ return File.basename(list_name) + '.yml' if list_name =~ /-fail$/
23
+ # File.basename(list_name) + '-ft-' + var.env_name[0,1] + var.env_name[-1,1] + '.yml'
24
+ File.basename(list_name.sub(/\.yml\z/,'')) + '-fail.yml'
25
+ end
26
+
27
+ def Report.results(list, from_agent = nil) #
28
+ unless list
29
+ $log.error "Report.results are requested for a null list. Ignoring request."
30
+ return nil
31
+ end
32
+ vars = list.variations
33
+ vars.each do |var|
34
+ tests = []
35
+ var.tests.each do |tst|
36
+ if tst.instance_of?(TestList)
37
+ @@pre_test ||= list.pre_test
38
+ @@post_test ||= list.post_test
39
+ Report.results(tst, from_agent)
40
+ else
41
+ tests << tst
42
+ end
43
+ end
44
+ unless tests.empty?
45
+ if var.parent.id
46
+ list_name = File.basename(var.parent.id,'.*')
47
+ else
48
+ list_name = tests.first.id
49
+ end
50
+ var.list_name = list_name
51
+ dir_results = $oats['execution']['dir_results']
52
+ all_errors = tests.find_all{|i| not i.errors.empty?}
53
+ var.total = tests.length
54
+ var.pass = tests.find_all{|i| i.status == 0}.length
55
+ var.fail = all_errors.length
56
+ var.skip = tests.find_all{|i| i.status == 2}.length
57
+ $log.error "Test counts do not add up. Please report this to the OATS administrator." \
58
+ unless var.total == var.pass + var.fail + var.skip
59
+ pre_post_summary = ''
60
+ unless tests.empty? or from_agent
61
+ if @@pre_test and ! @@pre_test.errors.empty?
62
+ pre_post_summary += ", PRE_FAILURE"
63
+ var.fail += 1
64
+ # var.fail = var.fail ? (var.fail + 1) : 1
65
+ end
66
+ if @@post_test and ! @@post_test.errors.empty?
67
+ pre_post_summary += ", POST_FAILURE"
68
+ var.fail += 1
69
+ end
70
+ $log.info "*** SUMMARY STATISTICS for list:#{list_name} on env:#{var.env_name}" +
71
+ " Total[#{var.total}], " + "Fail[#{var.fail}], Pass[#{var.pass}], " + "Skip[#{var.skip}]" +
72
+ pre_post_summary
73
+ end
74
+ return true if all_errors.empty? or from_agent
75
+ # Generate the failed tests lists only for non-agent mode
76
+ failed_file_name = Report.failed_file_name(var)
77
+ failed_dir = Oats.result_archive_dir + '/failed'
78
+ FileUtils.mkdir_p(failed_dir)
79
+ failed_tests_file = File.join(failed_dir,failed_file_name)
80
+ File.open( failed_tests_file, 'w' ) do |ftf |
81
+ ftf.puts("# Failed OATS tests\n---\nexecution: \n test_files: ")
82
+ tests.each do |test|
83
+ case test.status
84
+ when 0
85
+ $log.error "Unexpected test state for [#{test.id}]. Test status is PASSED but it contains error info. Please report this to the OATS administrator." unless test.errors.empty?
86
+ when 1
87
+ $log.warn "- #{test.id}"
88
+ ftf.puts(" - #{test.id}")
89
+ if test.errors.empty?
90
+ $log.error "Unexpected test state. Test status is error but it contains no error info. Please report this to the OATS administrator."
91
+ else
92
+ test.errors.each do |ex_arr|
93
+ if ex_arr[1] =~ /see result file for details: *(.*)/
94
+ file = $1
95
+ $log.warn " #{file}"
96
+ ftf.puts "# #{file}"
97
+ else
98
+ exc = "[#{ex_arr[0]}] " + ex_arr[1]
99
+ $log.warn " #{exc}"
100
+ ftf.puts "# #{exc}"
101
+ end
102
+ end
103
+ end
104
+ when 2 then # Just skipped
105
+ $log.warn "- #{test.id}"
106
+ $log.warn " [SKIPPED]"
107
+ else
108
+ $log.error "Unknown test status for [#{test.id}]. Please report this to the OATS administrator."
109
+ end
110
+ end
111
+ end
112
+ FileUtils.cp(failed_tests_file,dir_results)
113
+ FileUtils.cp(failed_tests_file,File.join(failed_dir,'last-fail.yml'))
114
+ end
115
+ end
116
+ return true
117
+ end
118
+
119
+ # Ideally oats_info_store should use locks and be interrupt safe
120
+ # If dir is nil or oats_info is given dump oats_info, otherwise load and return Report:@@oats_info
121
+ # Default dir is dir_results, default oats_info is $oats_info
122
+ def Report.oats_info_store(dir = nil, oats_info = nil)
123
+ results_file = File.join( dir ? dir : $oats['execution']['dir_results'] , 'results.dump')
124
+ unless dir.nil? or oats_info
125
+ @@oats_info = File.exists?(results_file) ? Report.oats_info_retrieve(results_file) : nil
126
+ return @@oats_info
127
+ end
128
+ archive_dir = Oats.result_archive_dir
129
+ if archive_dir and File.directory?(archive_dir)
130
+ results_file_tmp = File.join(archive_dir, 'results.dump') +'.tmp'
131
+ else
132
+ results_file_tmp = results_file +'.tmp'
133
+ end
134
+ oats_info = $oats_info unless oats_info
135
+ File.open( results_file_tmp , 'w' ) { |out| Marshal.dump(oats_info, out, -1) }
136
+ begin # Ensure dump is written completely before being replaced
137
+ rinfo = File.open( results_file_tmp, 'r' ) { |inp| Marshal.load(inp)}
138
+ rescue Exception => exc
139
+ $log.error "Error reading back [#{results_file_tmp}]. Skipping saving the intermediate results."
140
+ $log.error exc
141
+ return oats_info
142
+ end
143
+ begin
144
+ Ragent.snapshot_oats_info(rinfo) if $oats_execution['agent']
145
+ FileUtils.mv(results_file_tmp, results_file)
146
+ rescue
147
+ $log.error "Error moving [#{results_file_tmp}]. Skipping saving the intermediate results."
148
+ $log.error exc
149
+ end
150
+ return oats_info
151
+ end
152
+
153
+ def Report.oats_info_retrieve(results_file)
154
+ raise OatsReportError, "Can not locate [#{results_file}]. Skipping report generation for: #{results_file}" \
155
+ unless File.exist?(results_file)
156
+ begin
157
+ return File.open( results_file, 'r' ) { |inp| Marshal.load(inp)}
158
+ rescue
159
+ $log.error "Error reading [#{results_file}]. Skipping report generation for: #{results_file}"
160
+ raise
161
+ end
162
+ end
163
+
164
+ def Report.archive_results(post_run = false)
165
+ oats_data = $oats
166
+ dir_res = oats_data['execution']['dir_results']
167
+ rm_dir_res = post_run ? false : true
168
+ if File.directory?(dir_res) # Copy current results to archive
169
+ begin
170
+ oats_info = Report.oats_info_store(dir_res)
171
+ unless post_run
172
+ return unless oats_info
173
+ unless oats_info['end_time']
174
+ regenerated = true
175
+ $log.info "Generating missing results files for the previous run."
176
+ Report.results(oats_info['test_files'])
177
+ Report.oats_info_store(nil,oats_info)
178
+ end
179
+ end
180
+ rescue Exception => e
181
+ if e.instance_of? OatsReportError
182
+ $log.error 'Encountered: ' + $!.to_s
183
+ else
184
+ $log.error $!
185
+ end
186
+ end
187
+ # If the stored execution doesn't have context, default to the current execution ids inside incomplete
188
+ archive_id = ((oats_info and oats_info['jobid'])||(Oats.context and Oats.context['jobid']))
189
+ if archive_id
190
+ archive_dir = File.join( Oats.result_archive_dir, archive_id.to_s)
191
+ if post_run
192
+ FileUtils.cp_r(dir_res, archive_dir)
193
+ elsif regenerated or ! File.directory?(archive_dir)
194
+ FileUtils.rm_rf archive_dir
195
+ FileUtils.mv(dir_res, archive_dir)
196
+ rm_dir_res = false
197
+ end
198
+ else
199
+ $log.error "Removing results without archiving because can not find any jobid."
200
+ rm_dir_res = true
201
+ end
202
+ FileUtils.rm_rf dir_res if rm_dir_res # Cleanup prior to next run
203
+ end
204
+ end
205
+
206
+ end
207
+ end
@@ -0,0 +1,88 @@
1
+ # Override oats data based on commandline options.
2
+ #require 'log4r' # http://log4r.sourceforge.net/rdoc/index.html
3
+ #require 'util'
4
+ require 'deep_merge/deep_merge'
5
+
6
+ module Oats
7
+
8
+ module Roptions
9
+
10
+ def Roptions.overlay(options)
11
+ opts_array = options['_:options']
12
+ if options['_:json']
13
+ $log.info "Overriding Oats.data with: #{options['_:json']}"
14
+ $oats.deep_merge!(JSON.parse(options['_:json']))
15
+ end
16
+ if opts_array
17
+ opts_array.each do |opt_valu|
18
+
19
+ opt, valu = opt_valu.split(/\s*:\s*/)
20
+ data_keys = opt.split('.')
21
+ value = $oats
22
+ until data_keys.size == 1 do
23
+ value = value[key=data_keys.shift]
24
+ Oats.assert value.instance_of?(Hash), "Oats.data #{opt} is not a hash at #{key}"
25
+ end
26
+ $log.info "Option #{opt.inspect} specified as: #{valu.inspect} is overriding #{value[data_keys.first].inspect}"
27
+ value[data_keys.first] = valu
28
+ end
29
+ end
30
+ end
31
+
32
+ def Roptions.override(options={})
33
+ oats_data = $oats
34
+ oats_lib = Util.expand_path(File.dirname(__FILE__)+'/..')
35
+ oats_data['_']['oats_lib'] = oats_lib
36
+ options.each do |key,val|
37
+ data_keys = key.split(':')
38
+ v = oats_data
39
+ key_var = nil
40
+ loop do
41
+ key_var = data_keys.shift
42
+ break if data_keys.empty? or key_var == '_'
43
+ v = v[key_var]
44
+ end
45
+ next if key_var == '_'
46
+ if val.instance_of?(Array)
47
+ val_str = val.join(',')
48
+ else
49
+ val_str = val.to_s
50
+ end
51
+ vval = v[key_var]
52
+ if vval.instance_of?(Array)
53
+ vval_str = vval.join(',')
54
+ else
55
+ vval_str = vval.to_s
56
+ end
57
+ $log.info "Option #{key.inspect} specified as: #{val_str.inspect} is overriding #{vval_str.inspect}"\
58
+ unless $oats_execution['agent']
59
+ v[key_var] = val
60
+ end
61
+
62
+ # *** Now verify the options ***
63
+ # Ensure log_level valid
64
+ level = Log4r::Log4rConfig::LogLevels.index(oats_data['execution']['log_level'])
65
+ raise(OatsBadInput, "Unrecognized execution:log_level [#{oats_data['execution']['log_level']}]") unless level
66
+ $log.level = level = 1 if $log
67
+
68
+ raise(OatsBadInput,"Must specify execution:dir_results") unless oats_data['execution']['dir_results']
69
+
70
+ # Fix path to vendor, needed to run under java
71
+ oats_data['_']['vendor'] = Util.expand_path('../vendor',oats_lib)
72
+
73
+ # Verify existence of browser to show results
74
+ oats_data['selenium']['ide']['result_browser'] = oats_data['selenium']['ide']['result_browser']
75
+ oats_data['selenium']['ide']['show_result'] = 0 unless oats_data['selenium']['ide']['show_result']
76
+
77
+ unless oats_data['selenium']['pause_on_exit']
78
+ if oats_data['execution']['test_files'] and oats_data['execution']['test_files'].first =~ /\.yml/
79
+ oats_data['selenium']['pause_on_exit'] = 0
80
+ else
81
+ oats_data['selenium']['pause_on_exit'] = 1
82
+ end
83
+ end
84
+ return options
85
+ end
86
+
87
+ end
88
+ end