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.
- data/.gitignore +6 -0
- data/Gemfile +15 -0
- data/README.txt +165 -0
- data/Rakefile +2 -0
- data/bin/agent +204 -0
- data/bin/oats +10 -0
- data/bin/occ +29 -0
- data/bin/results_cleanup +6 -0
- data/doc/COPYING +55 -0
- data/doc/LICENSE +55 -0
- data/doc/OATS_Framework.doc +0 -0
- data/doc/classes/ApplicationLogs.html +239 -0
- data/doc/classes/Campaign.html +843 -0
- data/doc/classes/CommandlineOptions.html +131 -0
- data/doc/classes/Driver.html +182 -0
- data/doc/classes/Hash.html +137 -0
- data/doc/classes/Ide.html +194 -0
- data/doc/classes/MapSelenium.html +197 -0
- data/doc/classes/Net.html +107 -0
- data/doc/classes/Oats/OatsFilterError.html +119 -0
- data/doc/classes/Oats.html +998 -0
- data/doc/classes/OatsAssertError.html +119 -0
- data/doc/classes/OatsBadInput.html +119 -0
- data/doc/classes/OatsData.html +290 -0
- data/doc/classes/OatsError.html +117 -0
- data/doc/classes/OatsExit.html +117 -0
- data/doc/classes/OatsLock.html +254 -0
- data/doc/classes/OatsMain.html +182 -0
- data/doc/classes/OatsMysqlError.html +113 -0
- data/doc/classes/OatsMysqlMissingInput.html +113 -0
- data/doc/classes/OatsReportError.html +113 -0
- data/doc/classes/OatsSetupError.html +119 -0
- data/doc/classes/OatsTestError.html +119 -0
- data/doc/classes/OatsTestExit.html +119 -0
- data/doc/classes/OatsTestLocateError.html +120 -0
- data/doc/classes/OatsVerifyError.html +119 -0
- data/doc/classes/Ragent.html +397 -0
- data/doc/classes/Rclient.html +236 -0
- data/doc/classes/Report.html +368 -0
- data/doc/classes/Reports.html +244 -0
- data/doc/classes/RestApi.html +333 -0
- data/doc/classes/RhttpClient.html +236 -0
- data/doc/classes/Rimap.html +170 -0
- data/doc/classes/Rmysql.html +176 -0
- data/doc/classes/Roptions.html +131 -0
- data/doc/classes/Rselenium.html +233 -0
- data/doc/classes/Rssh.html +138 -0
- data/doc/classes/Runnable.html +174 -0
- data/doc/classes/SFTriggers.html +206 -0
- data/doc/classes/Selenium/Client/Driver.html +211 -0
- data/doc/classes/Selenium/Client.html +107 -0
- data/doc/classes/Selenium.html +107 -0
- data/doc/classes/SystemCapture.html +304 -0
- data/doc/classes/TestCase.html +418 -0
- data/doc/classes/TestData.html +235 -0
- data/doc/classes/TestList.html +264 -0
- data/doc/classes/Tools.html +244 -0
- data/doc/classes/Util.html +201 -0
- data/doc/classes/Variation.html +206 -0
- data/doc/fr_class_index.html +92 -0
- data/doc/fr_method_index.html +465 -0
- data/doc/index.html +23 -0
- data/doc/oats_httpd.conf +32 -0
- data/doc/oats_user.yml +25 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/deep_merge/.gitignore +2 -0
- data/lib/deep_merge/core.rb +195 -0
- data/lib/deep_merge/deep_merge.rb +1 -0
- data/lib/deep_merge/deep_merge_hash.rb +28 -0
- data/lib/deep_merge/rails_compat.rb +27 -0
- data/lib/oats/application_logs.rb +163 -0
- data/lib/oats/build_id.rb +58 -0
- data/lib/oats/commandline_options.rb +128 -0
- data/lib/oats/diff.rb +278 -0
- data/lib/oats/driver.rb +492 -0
- data/lib/oats/ide.rb +227 -0
- data/lib/oats/keywords.rb +67 -0
- data/lib/oats/log4r_init.rb +14 -0
- data/lib/oats/mysql.rb +97 -0
- data/lib/oats/oats.rb +637 -0
- data/lib/oats/oats_data.rb +400 -0
- data/lib/oats/oats_exceptions.rb +25 -0
- data/lib/oats/oats_lock.rb +261 -0
- data/lib/oats/oats_selenium_api.rb +639 -0
- data/lib/oats/oselenium.rb +189 -0
- data/lib/oats/ossh.rb +36 -0
- data/lib/oats/patches_for_eventmachine_12.10.rb +66 -0
- data/lib/oats/ragent.rb +321 -0
- data/lib/oats/rclient.rb +42 -0
- data/lib/oats/report.rb +207 -0
- data/lib/oats/roptions.rb +88 -0
- data/lib/oats/test_case.rb +510 -0
- data/lib/oats/test_data.rb +98 -0
- data/lib/oats/test_list.rb +141 -0
- data/lib/oats/unixdiff.rb +75 -0
- data/lib/oats/util.rb +125 -0
- data/lib/oats/version.rb +3 -0
- data/lib/oats.rb +36 -0
- data/nbproject/configs/agent.properties +0 -0
- data/nbproject/configs/gr.properties +0 -0
- data/nbproject/project.properties +10 -0
- data/nbproject/project.xml +17 -0
- data/oats.gemspec +42 -0
- data/oats_ini.yml +258 -0
- data/oats_tests/Gemfile +18 -0
- data/oats_tests/aut_ini.yml +30 -0
- data/oats_tests/bin/oats +8 -0
- data/oats_tests/environments/qa.yml +4 -0
- data/oats_tests/environments/qa_chrome.yml +4 -0
- data/oats_tests/examples/core/coreExamples.yml +8 -0
- data/oats_tests/examples/core/expectedException.rb +39 -0
- data/oats_tests/examples/core/ok_verify.rb +2 -0
- data/oats_tests/examples/core/ok_verify.rb_ok/out/myfile.txt +1 -0
- data/oats_tests/examples/core/ok_verify.rb_ok/out/myfile2.txt +1 -0
- data/oats_tests/examples/core/ok_verify.rb_ok/rats_test.log +2 -0
- data/oats_tests/examples/core/unexpectedException.rb +30 -0
- data/oats_tests/examples/examples.yml +13 -0
- data/oats_tests/examples/gui/guiExamples.yml +7 -0
- data/oats_tests/examples/gui/seleniumGoogle.rb +10 -0
- data/oats_tests/examples/gui/webdriverGoogle.rb +9 -0
- data/oats_tests/examples/keywords/SampleXlList-1.xls +0 -0
- data/oats_tests/examples/keywords/SampleXlList-2.xls +0 -0
- data/oats_tests/examples/keywords/SampleXlLists.xls +0 -0
- data/oats_tests/examples/keywords/keywordsDriver.rb +1 -0
- data/oats_tests/examples/keywords/keywordsExamples.yml +8 -0
- data/oats_tests/examples/keywords/keywordsTC1.yml +5 -0
- data/oats_tests/examples/keywords/keywordsTestlist.yml +16 -0
- data/oats_tests/examples/needsWork/addTestDynamically.rb +4 -0
- data/oats_tests/examples/needsWork/emailVerify.rb +34 -0
- data/oats_tests/examples/needsWork/testSql/rtest.sql +6 -0
- data/oats_tests/examples/needsWork/testSql/rtest.yml +11 -0
- data/oats_tests/examples/occTest/occTest.rb +13 -0
- data/oats_tests/examples/occTest/occTest_1.rb +1 -0
- data/oats_tests/examples/occTest/occTest_1_1.rb +1 -0
- data/oats_tests/examples/occTest/occTest_1_2.rb +1 -0
- data/oats_tests/examples/occTest/occTest_1_3.rb +1 -0
- data/oats_tests/examples/occTest/occTest_1_4.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2_1.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2_2.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2_3.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2_4.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3_1.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3_2.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3_3.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3_4.rb +1 -0
- data/oats_tests/examples/occTest/occTest_4.rb +1 -0
- data/oats_tests/examples/occTest/occTestlist.yml +9 -0
- data/oats_tests/examples/occTest/occTestlist_1.yml +9 -0
- data/oats_tests/examples/occTest/occTestlist_2.yml +9 -0
- data/oats_tests/examples/occTest/occTestlist_3.yml +9 -0
- data/oats_tests/examples/occTest/variation1.yml +4 -0
- data/oats_tests/examples/occTest/variation2.yml +4 -0
- data/oats_tests/examples/testFileLocationUnitTests/extn_driver.rb +4 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder/oats.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder/t1.rb +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder1/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder1/t1_1.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder2/oats.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder2/t1.rb +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder2/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/no_yaml.rb +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/post_yaml.rb +1 -0
- data/oats_tests/examples/testFileLocationUnitTests/t1.rb +4 -0
- data/oats_tests/examples/testFileLocationUnitTests/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/t1_1.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir/oats.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir/t1.rb +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir2/t1.rb +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir2/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/unitTestList.yml +36 -0
- data/oats_tests/examples/testFileLocationUnitTests/yml_driver.rb +2 -0
- data/oats_tests/lib/business.rb +28 -0
- data/oats_tests/lib/sample_xl_lists.rb +37 -0
- data/test/common_test_unit_setup.rb +21 -0
- data/test/test_basic.rb +16 -0
- data/test/test_selenium.rb +16 -0
- data/test/test_xl_lists.rb +16 -0
- 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
|