browza 0.0.2.beta2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +102 -0
- data/browza.gemspec +5 -4
- data/examples/ex1.rb +25 -0
- data/examples/ex2.rb +23 -0
- data/examples/parms.rb +45 -0
- data/lib/browza/base/browza_mgr.rb +110 -0
- data/lib/browza/base/manager.rb +745 -148
- data/lib/browza/version.rb +1 -1
- data/lib/browza.rb +1 -1
- metadata +32 -14
data/lib/browza/base/manager.rb
CHANGED
@@ -2,6 +2,7 @@ require 'selenium-webdriver'
|
|
2
2
|
require 'singleton'
|
3
3
|
require 'appmodel'
|
4
4
|
require 'logging'
|
5
|
+
require 'sauce_whisk'
|
5
6
|
|
6
7
|
module Browza
|
7
8
|
|
@@ -13,16 +14,148 @@ class Manager
|
|
13
14
|
attr_accessor :appModels
|
14
15
|
attr_accessor :browserType
|
15
16
|
attr_accessor :defaultTimeout
|
17
|
+
attr_accessor :driverList
|
18
|
+
attr_accessor :browserMgr
|
19
|
+
attr_accessor :debug
|
16
20
|
|
17
|
-
def initialize(
|
21
|
+
def initialize(_logLevel = :warn)
|
22
|
+
@debug = false
|
23
|
+
@driverList = []
|
18
24
|
@logger = Logging.logger(STDOUT)
|
19
|
-
@logger.level =
|
25
|
+
@logger.level = _logLevel
|
20
26
|
@defaultTimeout = 30
|
21
27
|
@appModels=[]
|
28
|
+
@browserMgr = Browza::BrowzaMgr.new()
|
29
|
+
end
|
30
|
+
|
31
|
+
def _addDriver(d)
|
32
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " _addDriver(#{d})" if @debug
|
33
|
+
@browserMgr.add(d)
|
34
|
+
|
35
|
+
if !d.is_a?(Hash)
|
36
|
+
@driverList << { :is_sauce => false, :drv => d }
|
37
|
+
else
|
38
|
+
@driverList << d
|
39
|
+
end
|
40
|
+
|
41
|
+
@driverList.last
|
42
|
+
end
|
43
|
+
|
44
|
+
def browserName
|
45
|
+
@driverList[0][:drv].browser.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def count
|
49
|
+
@driverList.length
|
50
|
+
end
|
51
|
+
|
52
|
+
def setSauceStatus(id, status)
|
53
|
+
rc = false
|
54
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " setSauceStatus(#{id}, #{status})" if @debug
|
55
|
+
|
56
|
+
|
57
|
+
if (ENV['SELENIUM_RUN'] && ENV['SELENIUM_RUN'].match(/local/i)) || (ENV['SELENIUM_PLATFORM'] && ENV['SELENIUM_PLATFORM'].match(/local/i))
|
58
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " setSauceStatus() - ignored (running locally)"
|
59
|
+
return nil
|
60
|
+
end
|
61
|
+
|
62
|
+
begin
|
63
|
+
drv = @browserMgr.getDriver(id)
|
64
|
+
|
65
|
+
unless drv.nil?
|
66
|
+
job_id = drv.session_id
|
67
|
+
SauceWhisk::Jobs.change_status job_id, status
|
68
|
+
rc = true
|
69
|
+
end
|
70
|
+
|
71
|
+
rescue => ex
|
72
|
+
@logger.fatal __FILE__ + (__LINE__).to_s + " #{ex.class}"
|
73
|
+
@logger.fatal "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
74
|
+
end
|
75
|
+
|
76
|
+
rc
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def connectSauce(id, _caps=nil)
|
81
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " connectSauce(#{id}, #{_caps})" if @debug
|
82
|
+
runLocal = false
|
83
|
+
|
84
|
+
if _caps.is_a?(String) && File.exist?(caps)
|
85
|
+
caps = JSON.parse(File.read(caps), :symbolize_names => true)
|
86
|
+
else
|
87
|
+
caps = _caps.dup
|
88
|
+
end
|
89
|
+
|
90
|
+
if caps.has_key?('platform')
|
91
|
+
tmpCaps = caps.clone
|
92
|
+
|
93
|
+
|
94
|
+
if !ENV['SELENIUM_NAME'].nil? && (ENV['SELENIUM_NAME'].is_a?(String) && !ENV['SELENIUM_NAME'].empty?)
|
95
|
+
tmpCaps['name'] = ENV['SELENIUM_NAME'].to_s
|
96
|
+
elsif !tmpCaps.has_key?('name')
|
97
|
+
tmpCaps['name'] = Time.now.strftime("%m%d%y_#{caps['browserType'].to_s}")
|
98
|
+
end
|
99
|
+
|
100
|
+
if caps['platform'].match(/\s*(linux|macOS|osx|os x|windows)/i)
|
101
|
+
|
102
|
+
if caps.has_key?('browserType')
|
103
|
+
browserType = caps['browserType']
|
104
|
+
|
105
|
+
if browserType.match(/edge/i)
|
106
|
+
caps = Selenium::WebDriver::Remote::Capabilities.edge()
|
107
|
+
elsif browserType.match(/chrome/i)
|
108
|
+
caps = Selenium::WebDriver::Remote::Capabilities.chrome()
|
109
|
+
elsif browserType.match(/firefox/i)
|
110
|
+
caps = Selenium::WebDriver::Remote::Capabilities.firefox()
|
111
|
+
elsif browserType.match(/ie/i)
|
112
|
+
caps = Selenium::WebDriver::Remote::Capabilities.internet_explorer()
|
113
|
+
elsif browserType.match(/safari/)
|
114
|
+
caps = Selenium::WebDriver::Remote::Capabilities.safari()
|
115
|
+
else
|
116
|
+
raise "Browza::UnexpectedBrowser::#{browserType}"
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
else
|
121
|
+
runLocal = true
|
122
|
+
browserType = caps['browserType'] || ENV['SELENIUM_BROWSER'] || 'safari'
|
123
|
+
end
|
124
|
+
|
125
|
+
tmpCaps.each_pair do |k, v|
|
126
|
+
caps[k.to_s] = v
|
127
|
+
end
|
128
|
+
|
129
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " caps => #{caps}" if @debug
|
130
|
+
|
131
|
+
begin
|
132
|
+
|
133
|
+
if runLocal
|
134
|
+
@drv=Selenium::WebDriver.for browserType.to_s.to_sym, :desired_capabilities => caps
|
135
|
+
else
|
136
|
+
sauce_endpoint = "http://#{ENV['SAUCE_USERNAME']}:#{ENV['SAUCE_ACCESS_KEY']}@ondemand.saucelabs.com:80/wd/hub"
|
137
|
+
|
138
|
+
@drv=Selenium::WebDriver.for :remote, :url => sauce_endpoint, :desired_capabilities => caps
|
139
|
+
# The following print to STDOUT is useful when running on JENKINS with SauceLabs plugin
|
140
|
+
# Reference:
|
141
|
+
# https://wiki.saucelabs.com/display/DOCS/Setting+Up+Reporting+between+Sauce+Labs+and+Jenkins
|
142
|
+
puts "SauceOnDemandSessionID=#{@drv.session_id} job-name=#{caps[:name]}"
|
143
|
+
end
|
144
|
+
|
145
|
+
_addDriver( { :id => id, :drv => @drv, :is_sauce => true })
|
146
|
+
rescue => ex
|
147
|
+
@logger.fatal __FILE__ + (__LINE__).to_s + " #{ex.class}"
|
148
|
+
@logger.fatal "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
149
|
+
end
|
150
|
+
|
151
|
+
caps
|
152
|
+
|
153
|
+
end
|
154
|
+
|
22
155
|
end
|
23
156
|
|
24
157
|
def setLogLevel(l)
|
25
|
-
|
158
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " setLogLevel(#{l})"
|
26
159
|
@logger.level = l
|
27
160
|
end
|
28
161
|
|
@@ -31,32 +164,238 @@ class Manager
|
|
31
164
|
end
|
32
165
|
|
33
166
|
def addModel(_a)
|
34
|
-
@logger.debug __FILE__ + (__LINE__).to_s + " [addModel]: #{_a}"
|
167
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [addModel]: #{_a}" if @debug
|
35
168
|
@appModels << Appmodel::Model.new(_a)
|
36
169
|
end
|
37
170
|
|
38
171
|
# Set innerWidth and innerHeight
|
39
|
-
|
40
|
-
|
41
|
-
|
172
|
+
# Ref.: /selenium-webdriver/lib/selenium/webdriver/common/window.rb
|
173
|
+
# o resize_to(width, height)
|
174
|
+
#
|
175
|
+
def setDimension(width = 1035, height = 768)
|
176
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " setDimension(#{width}, #{height}) count:#{@driverList.length}" if @debug
|
177
|
+
begin
|
178
|
+
i=0
|
179
|
+
@driverList.each do |b|
|
180
|
+
target_size = Selenium::WebDriver::Dimension.new(width.to_i, height.to_i)
|
181
|
+
if b[:drv] && (b[:drv].is_a?(Selenium::WebDriver) || b[:drv].is_a?(Selenium::WebDriver::Driver))
|
182
|
+
b[:drv].manage.window.size = target_size
|
183
|
+
else
|
184
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " Attempt to access driver failed. (#{b})"
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
188
|
+
rescue => ex
|
189
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " browser[#{i}]: #{ex.class}"
|
190
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " Error during processing: #{$!}"
|
191
|
+
@logger.warn " Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
192
|
+
end
|
42
193
|
end
|
43
194
|
|
44
195
|
def maximize()
|
45
196
|
getDriver().manage.window.maximize
|
46
197
|
end
|
47
198
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
199
|
+
def _getBrowserType(browserType)
|
200
|
+
t = browserType
|
201
|
+
|
202
|
+
if browserType.match(/chrome/i)
|
203
|
+
t = :chrome
|
204
|
+
elsif browserType.match(/firefox/i)
|
205
|
+
t = :firefox
|
206
|
+
elsif browserType.match(/ie/i)
|
207
|
+
t = :ie
|
208
|
+
elsif browserType.match(/edge/i)
|
209
|
+
t = :edge
|
210
|
+
end
|
211
|
+
|
212
|
+
t
|
52
213
|
end
|
53
214
|
|
54
|
-
|
55
|
-
|
215
|
+
|
216
|
+
def start(*p)
|
217
|
+
if (ENV['SELENIUM_RUN'] && ENV['SELENIUM_RUN'].match(/local/i)) || ENV['SELENIUM_PLATFORM'].match(/local/i)
|
218
|
+
return createBrowser(p)
|
219
|
+
else
|
220
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " connectSauce() => #{p} #{p.class} #{p.size}" if @debug
|
221
|
+
|
222
|
+
if p.size == 0
|
223
|
+
caps = {}
|
224
|
+
caps['name'] = ENV['SELENIUM_NAME']
|
225
|
+
caps['platform'] = ENV['SELENIUM_PLATFORM']
|
226
|
+
caps['browserType'] = ENV['SELENIUM_BROWSER']
|
227
|
+
caps['screenResolution'] = ENV['SELENIUM_RESOLUTION']
|
228
|
+
caps['version'] = ENV['SELENIUM_VERSION']
|
229
|
+
ENV['SELENIUM_RUN']='sauce'
|
230
|
+
|
231
|
+
connectSauce(caps['name'], caps)
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
56
235
|
end
|
57
236
|
|
58
|
-
def
|
59
|
-
|
237
|
+
def createBrowser(*p)
|
238
|
+
|
239
|
+
if ENV['SELENIUM_RESOLUTION']
|
240
|
+
@logger.debug " SELENIUM_RESOLUTION=#{ENV['SELENIUM_RESOLUTION']}" if @debug
|
241
|
+
_width = ENV['SELENIUM_RESOLUTION'].match(/\s*(\d+)\s*x\s*(\d+)\s*$/)[1].to_s
|
242
|
+
_height = ENV['SELENIUM_RESOLUTION'].match(/\s*(\d+)\s*x\s*(\d+)\s*$/)[2].to_s
|
243
|
+
else
|
244
|
+
_width = 1035
|
245
|
+
_height = 768
|
246
|
+
end
|
247
|
+
|
248
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " createBrowser() : width x height : #{_width}, #{_height}" if @debug
|
249
|
+
|
250
|
+
_id = Time.now.to_i.to_s
|
251
|
+
|
252
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " SELENIUM_BROWSER : #{ENV['SELENIUM_BROWSER']}" if @debug
|
253
|
+
@browserType = ENV['SELENIUM_BROWSER'] || 'chrome'
|
254
|
+
@browserType = _getBrowserType(@browserType)
|
255
|
+
|
256
|
+
if @debug
|
257
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " createBrowser(#{@browserType}) (isSymbol: #{@browserType.is_a?(Symbol)} : #{p.class.to_s}"
|
258
|
+
end
|
259
|
+
|
260
|
+
if p.is_a?(Array) && p.length > 0
|
261
|
+
|
262
|
+
if @debug
|
263
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " createBrowser() size: #{p.size} p[0]=#{p[0]} p[0].class=#{p[0].class} p[0].size=#{p[0].size} isSymbol(#{p[0].is_a?(Symbol)})"
|
264
|
+
end
|
265
|
+
|
266
|
+
if p.size == 1
|
267
|
+
|
268
|
+
if p[0].is_a?(Array) && p[0].size==1 && ( p[0][0].is_a?(Symbol) || p[0][0].is_a?(String) )
|
269
|
+
@browserType = p[0][0].to_s.to_sym
|
270
|
+
elsif p[0].is_a?(Array) && p[0].size==1 && p[0][0].is_a?(Hash)
|
271
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " #{p[0]}"
|
272
|
+
|
273
|
+
h = p[0][0]
|
274
|
+
|
275
|
+
if h.has_key?(:browserType)
|
276
|
+
@browserType = h[:browserType]
|
277
|
+
end
|
278
|
+
|
279
|
+
if h.has_key?(:width) && h.has_key?(:height)
|
280
|
+
_width = h[:width]
|
281
|
+
_height = h[:height]
|
282
|
+
end
|
283
|
+
|
284
|
+
if h.has_key?(:id)
|
285
|
+
_id = h[:id]
|
286
|
+
end
|
287
|
+
elsif p[0].is_a?(Symbol) || p[0].is_a?(String)
|
288
|
+
@browserType = p[0].to_s.to_sym
|
289
|
+
elsif p[0].is_a?(Hash) && !p[0].empty?
|
290
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " #{p[0]}"
|
291
|
+
|
292
|
+
h = p[0]
|
293
|
+
|
294
|
+
if h.has_key?(:browserType)
|
295
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " UPDTE"
|
296
|
+
@browserType = h[:browserType]
|
297
|
+
end
|
298
|
+
|
299
|
+
if h.has_key?(:width) && h.has_key?(:height)
|
300
|
+
_width = h[:width]
|
301
|
+
_height = h[:height]
|
302
|
+
end
|
303
|
+
|
304
|
+
if h.has_key?(:id)
|
305
|
+
_id = h[:id]
|
306
|
+
end
|
307
|
+
|
308
|
+
end
|
309
|
+
|
310
|
+
end
|
311
|
+
|
312
|
+
else
|
313
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " createBrowser without parms (width/height: #{_width}, #{_height})"
|
314
|
+
end
|
315
|
+
|
316
|
+
@logger.debug "Selenium::WebDriver.for #{@browserType} (isSymbol: #{@browserType.is_a?(Symbol)})" if @debug
|
317
|
+
|
318
|
+
begin
|
319
|
+
@drv = Selenium::WebDriver.for @browserType
|
320
|
+
rescue TypeError
|
321
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " See https://github.com/mozilla/geckodriver/issues/676" if @browserType == :firefox
|
322
|
+
end
|
323
|
+
|
324
|
+
_addDriver( { :drv => @drv, :is_sauce => false, :id => _id })
|
325
|
+
|
326
|
+
setDimension(_width, _height)
|
327
|
+
end
|
328
|
+
|
329
|
+
def _getDriverIndex(id)
|
330
|
+
i = 0
|
331
|
+
|
332
|
+
@driverList.each do |b|
|
333
|
+
if b.has_key?(:id) && b[:id] == id
|
334
|
+
return i
|
335
|
+
end
|
336
|
+
i += 1
|
337
|
+
end
|
338
|
+
|
339
|
+
return nil
|
340
|
+
end
|
341
|
+
|
342
|
+
|
343
|
+
def deleteDriver(id)
|
344
|
+
i = _getDriverIndex(id)
|
345
|
+
unless i.nil?
|
346
|
+
@driverList.delete_at(i)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
def getDriver(id=nil)
|
351
|
+
if id.nil?
|
352
|
+
return @driverList[0][:drv]
|
353
|
+
end
|
354
|
+
|
355
|
+
i = _getDriverIndex(id)
|
356
|
+
|
357
|
+
unless i.nil?
|
358
|
+
return @driverList[i][:drv]
|
359
|
+
end
|
360
|
+
|
361
|
+
nil
|
362
|
+
end
|
363
|
+
|
364
|
+
|
365
|
+
def quit(id=nil)
|
366
|
+
|
367
|
+
if id.nil?
|
368
|
+
@browserMgr.getBrowsers().each do |b|
|
369
|
+
|
370
|
+
begin
|
371
|
+
if b[:is_sauce]
|
372
|
+
job_id = b[:drv].session_id
|
373
|
+
|
374
|
+
if b.has_key?(:status)
|
375
|
+
SauceWhisk::Jobs.change_status job_id, b[:status]
|
376
|
+
end
|
377
|
+
|
378
|
+
end
|
379
|
+
|
380
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " quit : #{b[:id]}"
|
381
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " b.methods => #{b[:drv].methods.sort}"
|
382
|
+
|
383
|
+
b[:drv].quit
|
384
|
+
rescue => ex
|
385
|
+
@logger.fatal " #{ex.class}"
|
386
|
+
end
|
387
|
+
|
388
|
+
end
|
389
|
+
|
390
|
+
@browserMgr.clear()
|
391
|
+
|
392
|
+
@driverList=[]
|
393
|
+
else
|
394
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " quit(#{id}"
|
395
|
+
getDriver(id).quit
|
396
|
+
deleteDriver(id)
|
397
|
+
end
|
398
|
+
|
60
399
|
end
|
61
400
|
|
62
401
|
def title()
|
@@ -69,12 +408,39 @@ class Manager
|
|
69
408
|
!expected_title.match(current_title).nil? || regex==current_title
|
70
409
|
end
|
71
410
|
|
72
|
-
def goto(url)
|
73
|
-
|
411
|
+
def goto(url, id=nil)
|
412
|
+
|
413
|
+
rc = false
|
414
|
+
|
415
|
+
if id.nil?
|
416
|
+
@driverList.each do |b|
|
417
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " => #{b}"
|
418
|
+
b[:drv].navigate.to url
|
419
|
+
rc = true
|
420
|
+
end
|
421
|
+
else
|
422
|
+
getDriver(id).navigate.to url
|
423
|
+
rc = true
|
424
|
+
#getDriver().navigate.to url
|
425
|
+
end
|
426
|
+
|
427
|
+
rc
|
74
428
|
end
|
75
429
|
|
76
|
-
def navigate(url)
|
77
|
-
|
430
|
+
# def navigate(url, id=nil)
|
431
|
+
def navigate(*p)
|
432
|
+
rc=false
|
433
|
+
|
434
|
+
if p.is_a?(Array)
|
435
|
+
if p.length == 1
|
436
|
+
rc = goto(p[0].to_s)
|
437
|
+
elsif p.length == 2
|
438
|
+
rc = goto(p[0], p[1])
|
439
|
+
end
|
440
|
+
|
441
|
+
end
|
442
|
+
|
443
|
+
rc
|
78
444
|
end
|
79
445
|
|
80
446
|
def _parseLocator(_locator)
|
@@ -97,7 +463,7 @@ class Manager
|
|
97
463
|
end
|
98
464
|
|
99
465
|
def getElements(_locator, drv=nil, _timeout=30)
|
100
|
-
rc=nil
|
466
|
+
rc = nil
|
101
467
|
begin
|
102
468
|
|
103
469
|
if drv.nil?
|
@@ -128,9 +494,8 @@ class Manager
|
|
128
494
|
|
129
495
|
|
130
496
|
def getElement(_locator, drv=nil, _timeout=30)
|
131
|
-
|
132
497
|
@logger.debug __FILE__ + (__LINE__).to_s + " getElement(#{_locator})"
|
133
|
-
rc=nil
|
498
|
+
rc = nil
|
134
499
|
begin
|
135
500
|
locator = _parseLocator(_locator)
|
136
501
|
|
@@ -150,6 +515,9 @@ class Manager
|
|
150
515
|
!rc.nil?
|
151
516
|
}
|
152
517
|
|
518
|
+
rescue Selenium::WebDriver::Error::TimeOutError
|
519
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " TimeOutError: #{locator}"
|
520
|
+
|
153
521
|
rescue Selenium::WebDriver::Error::NoSuchElementError
|
154
522
|
@logger.warn __FILE__ + (__LINE__).to_s + " NoSuchElementError : #{locator}"
|
155
523
|
|
@@ -162,23 +530,59 @@ class Manager
|
|
162
530
|
rc
|
163
531
|
end
|
164
532
|
|
533
|
+
def _isBrowser?(drv, s)
|
534
|
+
|
535
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " _isBrowser?(#{drv.class}, #{s})"
|
536
|
+
if drv.nil?
|
537
|
+
drv=@drv
|
538
|
+
end
|
539
|
+
|
540
|
+
!drv.browser.to_s.match(s).nil?
|
541
|
+
end
|
542
|
+
|
165
543
|
def isChrome?(drv=nil)
|
166
544
|
if drv.nil?
|
167
545
|
drv=@drv
|
168
546
|
end
|
169
547
|
|
170
|
-
!drv.browser.to_s.match(
|
548
|
+
!drv.browser.to_s.match(/\s*chrome/i).nil?
|
171
549
|
end
|
172
550
|
|
173
|
-
def
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
551
|
+
def isEdge(drv=nil)
|
552
|
+
if drv.nil?
|
553
|
+
drv=@drv
|
554
|
+
end
|
555
|
+
|
556
|
+
!drv.browser.to_s.match(/\s*edge/i).nil?
|
557
|
+
end
|
558
|
+
|
559
|
+
def isIE(drv=nil)
|
560
|
+
if drv.nil?
|
561
|
+
drv=@drv
|
562
|
+
end
|
563
|
+
|
564
|
+
!drv.browser.to_s.match(/\s*ie/i).nil?
|
565
|
+
end
|
178
566
|
|
179
|
-
|
567
|
+
def isFirefox?(drv=nil)
|
180
568
|
|
181
|
-
if
|
569
|
+
if drv.nil?
|
570
|
+
drv = @driverList[0][:drv]
|
571
|
+
end
|
572
|
+
|
573
|
+
Browza::Manager.instance._isBrowser?(drv, 'firefox')
|
574
|
+
end
|
575
|
+
|
576
|
+
|
577
|
+
def switch_into_frame(drv, id)
|
578
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "[enter]: switch_into_frame(#{drv.class}, #{id})"
|
579
|
+
_fcnId = '[switch_into_frame]'
|
580
|
+
hit = nil
|
581
|
+
|
582
|
+
# _addDriver( { :id => id, :drv => @drv, :is_sauce => true })
|
583
|
+
if isChrome?(drv) || !@driverList[0][:is_sauce] # 5150|| isFirefox?(drv)
|
584
|
+
|
585
|
+
# drv.switch_to.default_content
|
182
586
|
|
183
587
|
@logger.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: switch on Chrome browser"
|
184
588
|
bframes = drv.find_elements(:xpath, '//iframe')
|
@@ -191,6 +595,7 @@ class Manager
|
|
191
595
|
@logger.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: //frame : #{bframes.size}"
|
192
596
|
end
|
193
597
|
|
598
|
+
|
194
599
|
for i in 0 .. bframes.size - 1
|
195
600
|
begin
|
196
601
|
|
@@ -221,9 +626,11 @@ class Manager
|
|
221
626
|
|
222
627
|
else
|
223
628
|
# Firefox, IE
|
224
|
-
@logger.debug __FILE__ + (__LINE__).to_s + "
|
629
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "[switch_into_frame]: drv.switch_to.frame(#{id.to_s}";
|
225
630
|
|
226
631
|
hit = drv.switch_to.frame(id.to_s.strip)
|
632
|
+
|
633
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [switch_into_frame]: #{hit} - #{id}"
|
227
634
|
end
|
228
635
|
|
229
636
|
@logger.debug __FILE__ + (__LINE__).to_s + " switch_into_frame(#{id}) => #{hit}"
|
@@ -231,9 +638,9 @@ class Manager
|
|
231
638
|
end
|
232
639
|
|
233
640
|
|
234
|
-
def switch_frame(e)
|
235
|
-
|
236
|
-
drv = @drv
|
641
|
+
def switch_frame(e, drv=nil)
|
642
|
+
rc = true
|
643
|
+
drv = @driverList[0][:drv] if drv.nil?
|
237
644
|
@logger.debug __FILE__ + (__LINE__).to_s + "\n\n== self.switch_frame(#{e}) =="
|
238
645
|
frames=nil
|
239
646
|
if e.is_a?(Hash) && e.has_key?('page') && e['page'].has_key?('frames')
|
@@ -251,6 +658,7 @@ class Manager
|
|
251
658
|
# frame_list=frames.split(/(frame\(.*\))\.(?=[\w])/)
|
252
659
|
frame_list=frames.split(/\.(?=frame)/)
|
253
660
|
|
661
|
+
@logger.debug __FILE__+ (__LINE__).to_s + " [switch_frame]: default_content"
|
254
662
|
drv.switch_to.default_content
|
255
663
|
|
256
664
|
frame_list.each do |_f|
|
@@ -263,9 +671,10 @@ class Manager
|
|
263
671
|
|
264
672
|
# Swtich based on browser type
|
265
673
|
|
266
|
-
if isChrome?(drv)
|
267
|
-
if switch_into_frame(_id).nil?
|
674
|
+
if isChrome?(drv) || !@driverList[0][:is_sauce]# 5150|| isFirefox?(drv)
|
675
|
+
if switch_into_frame(drv, _id).nil?
|
268
676
|
@logger.debug __FILE__ + (__LINE__).to_s + " Frame with name/id #{_id} not found"
|
677
|
+
rc = false
|
269
678
|
break
|
270
679
|
else
|
271
680
|
@logger.debug __FILE__ + (__LINE__).to_s + " Sucessfully switched frame into #{_id}"
|
@@ -275,32 +684,18 @@ class Manager
|
|
275
684
|
drv.switch_to.frame _id
|
276
685
|
end
|
277
686
|
|
278
|
-
if false
|
279
|
-
|
280
|
-
if drv.browser.to_s.match(/firefox/i)
|
281
|
-
@logger.debug __FILE__ + (__LINE__).to_s + " [firefox]: switch_to.frame #{_id}"
|
282
|
-
drv.switch_to.frame _id
|
283
|
-
else
|
284
|
-
|
285
|
-
if switch_into_frame(_id).nil?
|
286
|
-
@logger.debug __FILE__ + (__LINE__).to_s + " Frame with name/id #{_id} not found"
|
287
|
-
break
|
288
|
-
else
|
289
|
-
@logger.debug __FILE__ + (__LINE__).to_s + " Sucessfully switched frame into #{_id}"
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
end
|
294
|
-
|
295
|
-
|
296
687
|
end
|
297
688
|
|
298
689
|
end
|
299
690
|
|
300
691
|
end
|
692
|
+
|
693
|
+
rc
|
301
694
|
end
|
302
695
|
|
303
|
-
def findLocator(_locator)
|
696
|
+
def findLocator(_locator, drv=nil)
|
697
|
+
drv = @driverList[0][:drv] if drv.nil?
|
698
|
+
|
304
699
|
@logger.debug __FILE__ + (__LINE__).to_s + " [findLocator]: #{_locator} sz: #{@appModels.length}"
|
305
700
|
obj = nil
|
306
701
|
_hit = nil
|
@@ -315,8 +710,6 @@ class Manager
|
|
315
710
|
##
|
316
711
|
pageObject = m.getPageElement(_locator)
|
317
712
|
|
318
|
-
@logger.debug __FILE__ + (__LINE__).to_s + " pageObject => #{pageObject}"
|
319
|
-
|
320
713
|
unless pageObject.nil?
|
321
714
|
_hit = {}
|
322
715
|
if pageObject.has_key?('frame')
|
@@ -327,6 +720,8 @@ class Manager
|
|
327
720
|
_hit['locator'] = Appmodel::Model.toBy(pageObject['locator'], m)
|
328
721
|
end
|
329
722
|
|
723
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " pageObject => #{pageObject}"
|
724
|
+
|
330
725
|
break
|
331
726
|
end
|
332
727
|
|
@@ -339,42 +734,47 @@ class Manager
|
|
339
734
|
elsif _locator.is_a?(String)
|
340
735
|
_hit = Appmodel::Model.parseLocator(_locator)
|
341
736
|
elsif _locator.is_a?(Hash)
|
342
|
-
_hit = { 'locator' => _locator[:css]
|
343
|
-
_hit = { 'locator' => _locator['css']
|
344
|
-
_hit = { 'locator' => _locator[:xpath]
|
345
|
-
_hit = { 'locator' => _locator[
|
737
|
+
_hit = { 'locator' => _locator[:css] } if _locator.has_key?(:css)
|
738
|
+
_hit = { 'locator' => _locator['css'] } if _locator.has_key?('css')
|
739
|
+
_hit = { 'locator' => _locator[:xpath] } if _locator.has_key?(:xpath)
|
740
|
+
_hit = { 'locator' => _locator['xpath'] } if _locator.has_key?('xpath')
|
346
741
|
|
347
|
-
_hit['frame'] = _locator[:frame]
|
742
|
+
_hit['frame'] = _locator[:frame] if _locator.has_key?(:frame)
|
348
743
|
_hit['frame'] = _locator['frame'] if _locator.has_key?('frame')
|
349
744
|
end
|
350
745
|
|
746
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " hit => #{_hit}"
|
747
|
+
|
351
748
|
if _hit.is_a?(Hash)
|
352
749
|
|
353
750
|
2.times {
|
354
751
|
|
355
752
|
begin
|
356
|
-
|
357
|
-
@logger.debug __FILE__ + (__LINE__).to_s + "swtich_to_frame : #{_hit['frame']}"
|
358
|
-
switch_frame(_hit['frame'])
|
359
|
-
end
|
753
|
+
rcFrame = true
|
360
754
|
|
361
|
-
if _hit.has_key?('
|
362
|
-
|
755
|
+
if _hit.has_key?('frame')
|
756
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [findLocator]: swtich_to_frame : #{_hit['frame']}"
|
757
|
+
drv.switch_to.default_content
|
758
|
+
rcFrame = switch_frame(_hit['frame'], drv)
|
363
759
|
end
|
364
760
|
|
365
|
-
if
|
366
|
-
|
761
|
+
if rcFrame && _hit.has_key?('locator')
|
762
|
+
obj = getElement(_hit['locator'], drv, @defaultTimeout)
|
763
|
+
if !obj.nil?
|
764
|
+
break
|
765
|
+
end
|
367
766
|
end
|
368
767
|
|
369
768
|
sleep(0.25)
|
370
769
|
|
371
770
|
rescue => e
|
771
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " Exception: #{e.class}"
|
372
772
|
;
|
373
773
|
end
|
374
774
|
}
|
375
775
|
|
376
776
|
else
|
377
|
-
obj = getElement(Appmodel::Model.toBy(_locator),
|
777
|
+
obj = getElement(Appmodel::Model.toBy(_locator), drv, @defaultTimeout)
|
378
778
|
end
|
379
779
|
|
380
780
|
@logger.debug __FILE__ + (__LINE__).to_s + " [return findLocator(#{_locator})] : #{_hit}"
|
@@ -383,61 +783,89 @@ class Manager
|
|
383
783
|
obj
|
384
784
|
end
|
385
785
|
|
786
|
+
def getDate()
|
787
|
+
return @driverList[0][:drv].execute_script('var s = new Date().toString(); return s')
|
788
|
+
end
|
386
789
|
|
387
790
|
##
|
388
791
|
# Browza.instance.click('page(sideNav).get(desktop)')
|
389
792
|
##
|
390
793
|
def click(_locator, _drv=nil, _timeout=30)
|
794
|
+
|
795
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " click(#{_locator})"
|
391
796
|
rc = false
|
392
797
|
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
if !obj.nil?
|
397
|
-
obj.click
|
398
|
-
rc=true
|
399
|
-
end
|
798
|
+
@driverList.each do |b|
|
799
|
+
begin
|
800
|
+
drv=b[:drv]
|
400
801
|
|
401
|
-
|
402
|
-
end
|
802
|
+
obj = nil
|
403
803
|
|
404
|
-
|
405
|
-
rc = false
|
406
|
-
style={"color" => 'rgb(255, 16, 16)'}
|
407
|
-
color="rgb(255, 0, 0)"
|
804
|
+
# obj = findLocator(_locator, drv)
|
408
805
|
|
409
|
-
|
410
|
-
|
806
|
+
isDisplayed = Selenium::WebDriver::Wait.new(timeout: _timeout).until {
|
807
|
+
obj = findLocator(_locator, drv)
|
808
|
+
obj.is_a?(Selenium::WebDriver::Element) && obj.displayed? && obj.enabled?
|
809
|
+
}
|
411
810
|
|
811
|
+
# drv.action.move_to(obj).perform
|
812
|
+
scrollElementIntoMiddle = "var viewPortHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);"
|
813
|
+
+ "var elementTop = arguments[0].getBoundingClientRect().top;"
|
814
|
+
+ "window.scrollBy(0, elementTop-(viewPortHeight/2));";
|
412
815
|
|
413
|
-
if style.has_key?("color")
|
414
816
|
|
415
|
-
|
817
|
+
# drv.execute_script(scrollElementIntoMiddle, obj)
|
818
|
+
# drv.execute_script("arguments[0].scrollIntoView(true);", obj);
|
416
819
|
|
417
|
-
_c = style["color"]
|
418
820
|
|
419
|
-
|
821
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [click]: obj => #{obj.class} : #{isDisplayed}"
|
420
822
|
|
421
|
-
if
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
elsif _c.match(/\s*yellow/i)
|
426
|
-
color='rgb(255, 255, 0)'
|
427
|
-
elsif _c.match(/\s*green/i)
|
428
|
-
color='rgb(0, 255, 0)'
|
429
|
-
elsif _c.match(/\s*gray/i)
|
430
|
-
color='rgb(128, 128, 128)'
|
823
|
+
if !obj.nil? && isDisplayed && obj.is_a?(Selenium::WebDriver::Element)
|
824
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " clicked #{_locator}"
|
825
|
+
obj.click
|
826
|
+
rc = true
|
431
827
|
end
|
828
|
+
rescue => ex
|
829
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " #{ex.class}"
|
830
|
+
@logger.debug "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
831
|
+
end
|
832
|
+
end
|
833
|
+
|
834
|
+
unless rc
|
835
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " WARN: unable to click #{_locator}"
|
836
|
+
end
|
432
837
|
|
838
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " ==== [click]: #{_locator} = #{rc} ===="
|
839
|
+
rc
|
840
|
+
end
|
841
|
+
|
842
|
+
def highlight(_locator, color='red', _drv=nil, _timeout=30)
|
843
|
+
rc = false
|
844
|
+
rgb=nil
|
845
|
+
|
846
|
+
obj = findLocator(_locator)
|
847
|
+
if !obj.nil?
|
848
|
+
if color.match(/\s*blue/i)
|
849
|
+
rgb='rgb(0, 0, 255)'
|
850
|
+
elsif color.match(/\s*red/i)
|
851
|
+
rgb='rgb(255, 0, 0)'
|
852
|
+
elsif color.match(/\s*yellow/i)
|
853
|
+
rgb='rgb(255, 255, 0)'
|
854
|
+
elsif color.match(/\s*green/i)
|
855
|
+
rgb='rgb(0, 255, 0)'
|
856
|
+
elsif color.match(/\s*gray/i)
|
857
|
+
rgb='rgb(128, 128, 128)'
|
433
858
|
end
|
434
859
|
|
435
|
-
border=
|
860
|
+
border = 2
|
436
861
|
|
437
|
-
|
862
|
+
begin
|
863
|
+
@drv.execute_script("hlt = function(c) { c.style.border='solid #{border}px #{rgb}'; }; return hlt(arguments[0]);", obj)
|
864
|
+
rc=true
|
865
|
+
rescue => ex
|
866
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " #{ex.class}"
|
867
|
+
end
|
438
868
|
|
439
|
-
@drv.execute_script("hlt = function(c) { c.style.border='solid #{border}px #{color}'; }; return hlt(arguments[0]);", obj)
|
440
|
-
rc=true
|
441
869
|
end
|
442
870
|
|
443
871
|
obj.is_a?(Selenium::WebDriver::Element) && rc
|
@@ -472,19 +900,21 @@ class Manager
|
|
472
900
|
obj = findLocator(_locator)
|
473
901
|
if !obj.nil?
|
474
902
|
|
475
|
-
if _text.match(/\s*__CLEAR__\s*$/)
|
476
|
-
|
477
|
-
elsif _text.match(/\s*__DOWN__\s*$/)
|
478
|
-
|
479
|
-
elsif _text.match(/\s*
|
480
|
-
|
481
|
-
elsif _text.match(/\s*
|
482
|
-
|
483
|
-
elsif _text.match(/\s*
|
484
|
-
|
485
|
-
elsif _text.match(/\s*
|
486
|
-
|
487
|
-
elsif _text.match(/\s*
|
903
|
+
if _text.match(/\s*__CLEAR__\s*$/i)
|
904
|
+
_text = :clear
|
905
|
+
elsif _text.match(/\s*__DOWN__\s*$/i)
|
906
|
+
_text = :arrow_down
|
907
|
+
elsif _text.match(/\s*__ENTER__\s*$/i)
|
908
|
+
_text = :enter
|
909
|
+
elsif _text.match(/\s*__LEFT__\s*$/i)
|
910
|
+
_text = :arrow_left
|
911
|
+
elsif _text.match(/\s*__RIGHT__\s*$/i)
|
912
|
+
_text = :arrow_right
|
913
|
+
elsif _text.match(/\s*__UP__\s*$/i)
|
914
|
+
_text = :arrow_up
|
915
|
+
elsif _text.match(/\s*__TAB__\s*$/i)
|
916
|
+
_text = :tab
|
917
|
+
elsif _text.match(/\s*__SHIFT_TAB__\s*$/i)
|
488
918
|
@drv.action.key_down(:shift).send_keys(:tab).perform
|
489
919
|
@drv.action.key_up(:shift).perform
|
490
920
|
rc = true
|
@@ -500,15 +930,14 @@ class Manager
|
|
500
930
|
rc
|
501
931
|
end
|
502
932
|
|
503
|
-
def displayed?(_locator, _drv=nil, _timeout=30)
|
504
|
-
rc=false
|
505
933
|
|
506
|
-
|
934
|
+
def isNotDisplayed?(_locator, _timeout=10)
|
935
|
+
!displayed?(_locator, getDriver(), _timeout)
|
936
|
+
end
|
937
|
+
|
938
|
+
def displayed?(_locator, _drv=nil, _timeout=30)
|
507
939
|
obj = findLocator(_locator)
|
508
|
-
|
509
|
-
rc=obj.displayed?
|
510
|
-
end
|
511
|
-
rc
|
940
|
+
obj.is_a?(Selenium::WebDriver::Element) && obj.displayed?
|
512
941
|
end
|
513
942
|
|
514
943
|
def focusedText()
|
@@ -517,8 +946,30 @@ class Manager
|
|
517
946
|
end
|
518
947
|
|
519
948
|
def focusedValue()
|
520
|
-
|
521
|
-
|
949
|
+
v = nil
|
950
|
+
begin
|
951
|
+
activeElt = @drv.switch_to.active_element
|
952
|
+
v = activeElt.attribute('value')
|
953
|
+
rescue => ex
|
954
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " #{ex.class}"
|
955
|
+
@logger.warn "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
956
|
+
end
|
957
|
+
|
958
|
+
v
|
959
|
+
end
|
960
|
+
|
961
|
+
def focusedValue?(s, _timeout=10)
|
962
|
+
rc = false
|
963
|
+
|
964
|
+
Selenium::WebDriver::Wait.new(timeout: _timeout).until {
|
965
|
+
activeElt = @drv.switch_to.active_element
|
966
|
+
_v = activeElt.attribute('value')
|
967
|
+
if _v.match(/#{s}/)
|
968
|
+
rc = true
|
969
|
+
end
|
970
|
+
|
971
|
+
rc
|
972
|
+
}
|
522
973
|
end
|
523
974
|
|
524
975
|
def isFocused?(_locator)
|
@@ -537,32 +988,139 @@ class Manager
|
|
537
988
|
end
|
538
989
|
|
539
990
|
|
991
|
+
def isVisible?(_locator, expected = true, _timeout = 30)
|
992
|
+
obj = nil
|
993
|
+
rc = Selenium::WebDriver::Wait.new(timeout: _timeout).until {
|
994
|
+
obj = findLocator(_locator, drv)
|
995
|
+
obj.is_a?(Selenium::WebDriver::Element) && obj.displayed?
|
996
|
+
}
|
540
997
|
|
541
|
-
|
998
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " isVisible?(#{_locator}) : #{rc}"
|
999
|
+
rc == expected
|
1000
|
+
end
|
542
1001
|
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
1002
|
+
|
1003
|
+
def isValue?(_locator, regex=nil, _timeout = 30)
|
1004
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " isValue?(#{_locator}, #{regex})"
|
1005
|
+
rc = false
|
1006
|
+
|
1007
|
+
begin
|
1008
|
+
expected = Regexp.new(regex)
|
1009
|
+
drv = @driverList[0][:drv]
|
1010
|
+
obj = nil
|
1011
|
+
|
1012
|
+
isExists = Selenium::WebDriver::Wait.new(timeout: _timeout).until {
|
1013
|
+
obj = findLocator(_locator, drv)
|
1014
|
+
if obj.is_a?(Selenium::WebDriver::Element)
|
1015
|
+
rc = !expected.match(obj.attribute('value')).nil? || regex==obj.attribute('value')
|
1016
|
+
end
|
1017
|
+
|
1018
|
+
rc
|
1019
|
+
}
|
1020
|
+
|
1021
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " | obj : #{obj} => #{isExists}"
|
1022
|
+
|
1023
|
+
if false && !obj.nil? && isExists
|
1024
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " | obj.value: #{obj.attribute('value')}"
|
1025
|
+
expected = Regexp.new(regex)
|
1026
|
+
rc = !expected.match(obj.attribute('value')).nil? || regex==obj.attribute('value')
|
1027
|
+
end
|
1028
|
+
|
1029
|
+
rescue => ex
|
1030
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " #{ex.class}"
|
1031
|
+
@logger.warn "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [return]: isValue?(#{_locator}, #{regex}) : #{rc}"
|
1035
|
+
rc
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
|
1039
|
+
def isText?(_locator, regex=nil)
|
1040
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " isText?(#{_locator}, #{regex})"
|
1041
|
+
rc = false
|
1042
|
+
|
1043
|
+
begin
|
1044
|
+
obj = findLocator(_locator)
|
1045
|
+
|
1046
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " | obj : #{obj}"
|
1047
|
+
|
1048
|
+
if !obj.nil?
|
1049
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " | obj.text: #{obj.text}"
|
1050
|
+
expected = Regexp.new(regex)
|
1051
|
+
rc = !expected.match(obj.text).nil? || regex==obj.text
|
1052
|
+
end
|
1053
|
+
|
1054
|
+
rescue => ex
|
1055
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " #{ex.class}"
|
1056
|
+
@logger.warn "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
1057
|
+
end
|
1058
|
+
|
1059
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [return]: isText?(#{_locator}, #{regex}) : #{rc}"
|
1060
|
+
rc
|
1061
|
+
end
|
1062
|
+
|
1063
|
+
|
1064
|
+
##
|
1065
|
+
# press('enter')
|
1066
|
+
# press('tab', 5)
|
1067
|
+
# press('page(main).get(button)', 'enter')
|
1068
|
+
##
|
1069
|
+
def press(*p)
|
1070
|
+
rc = nil
|
1071
|
+
|
1072
|
+
if p.length == 1
|
1073
|
+
rc = pressKey(p[0], 1)
|
1074
|
+
elsif p.length == 2
|
1075
|
+
|
1076
|
+
if p[1].is_a?(Integer) || p[1].to_s.match(/^\s*\d+$/)
|
1077
|
+
rc = pressKey(p[0], p[1].to_i)
|
562
1078
|
else
|
563
|
-
|
1079
|
+
rc = type(p[0], p[1])
|
564
1080
|
end
|
565
|
-
|
1081
|
+
|
1082
|
+
else
|
1083
|
+
raise "BROWZA::Press::Unexpected"
|
1084
|
+
end
|
1085
|
+
|
1086
|
+
rc
|
1087
|
+
end
|
1088
|
+
|
1089
|
+
def pressKey(k, n = 1)
|
1090
|
+
|
1091
|
+
rc = 0
|
1092
|
+
begin
|
1093
|
+
n.times {
|
1094
|
+
if k.match(/^\s*tab/i)
|
1095
|
+
activeElt = @drv.switch_to.active_element
|
1096
|
+
activeElt.send_keys(:tab)
|
1097
|
+
elsif k.match(/^\s*clear\s*$/)
|
1098
|
+
activeElt = @drv.switch_to.active_element
|
1099
|
+
activeElt.clear
|
1100
|
+
elsif k.match(/\s*^enter/i)
|
1101
|
+
activeElt = @drv.switch_to.active_element
|
1102
|
+
activeElt.send_keys(:enter)
|
1103
|
+
elsif k.match(/\s*^(down|__down__|arrow_down)/i)
|
1104
|
+
activeElt = @drv.switch_to.active_element
|
1105
|
+
activeElt.send_keys(:arrow_down)
|
1106
|
+
elsif k.match(/\s*^up/i)
|
1107
|
+
activeElt = @drv.switch_to.active_element
|
1108
|
+
activeElt.send_keys(:arrow_up)
|
1109
|
+
elsif k.match(/\s*__SHIFT_TAB__\s*$/i)
|
1110
|
+
@drv.action.key_down(:shift).send_keys(:tab).perform
|
1111
|
+
@drv.action.key_up(:shift).perform
|
1112
|
+
else
|
1113
|
+
break
|
1114
|
+
end
|
1115
|
+
|
1116
|
+
rc += 1
|
1117
|
+
}
|
1118
|
+
|
1119
|
+
rescue => ex
|
1120
|
+
;
|
1121
|
+
end
|
1122
|
+
|
1123
|
+
rc
|
566
1124
|
end
|
567
1125
|
|
568
1126
|
def selected?(_locator, _drv=nil, _timeout=30)
|
@@ -590,6 +1148,45 @@ class Manager
|
|
590
1148
|
end
|
591
1149
|
|
592
1150
|
|
1151
|
+
def hasStyle?(_locator, tag, expected = nil, _timeout = 30)
|
1152
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " hasStyle?(#{_locator})"
|
1153
|
+
rc = nil
|
1154
|
+
|
1155
|
+
@driverList.each do |b|
|
1156
|
+
begin
|
1157
|
+
drv = b[:drv]
|
1158
|
+
|
1159
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [hasStyle]: switch_to.default_content"
|
1160
|
+
drv.switch_to.default_content
|
1161
|
+
obj = findLocator(_locator, drv)
|
1162
|
+
|
1163
|
+
isDisplayed = Selenium::WebDriver::Wait.new(timeout: _timeout).until {
|
1164
|
+
obj = findLocator(_locator, drv)
|
1165
|
+
obj.is_a?(Selenium::WebDriver::Element)
|
1166
|
+
}
|
1167
|
+
|
1168
|
+
if !obj.nil?
|
1169
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " style #{_locator}"
|
1170
|
+
rc = obj.style(tag)
|
1171
|
+
end
|
1172
|
+
rescue => ex
|
1173
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " #{ex.class}"
|
1174
|
+
@logger.warn "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
1175
|
+
end
|
1176
|
+
end
|
1177
|
+
|
1178
|
+
unless expected.nil?
|
1179
|
+
regex = Regexp.new(expected)
|
1180
|
+
rc = !regex.match(rc.to_s).nil? || (expected.to_s == rc.to_s)
|
1181
|
+
|
1182
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " WARN: unable to get style #{tag} for #{_locator}"
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " hasStyle(#{_locator}, #{tag}) : #{rc.to_s}"
|
1186
|
+
rc
|
1187
|
+
end
|
1188
|
+
|
1189
|
+
|
593
1190
|
end
|
594
1191
|
|
595
1192
|
|