browza 0.0.0 → 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.
- checksums.yaml +4 -4
- data/Gemfile +14 -0
- data/Rakefile +6 -0
- data/browza.gemspec +28 -0
- data/lib/browza/base/manager.rb +441 -0
- data/lib/browza/version.rb +3 -0
- data/lib/browza.rb +9 -0
- metadata +21 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a59afa3f589a1e3ae62e4382e47ad927303406e2
|
4
|
+
data.tar.gz: 766ea1a959259523a64282d24886ae9b57fe8774
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e67e334582c6717ae08dfb179d64471a0f95cd74ce9e4311d98b34b11a6733f1780e650b87656567033c170fcf3fe45dc4d3fa1273f97fdba8959c8c4132bb9
|
7
|
+
data.tar.gz: afca6f6ee25601abd9ab7a85b3f6e4baf1cf70dca60f56b4c417c8a66355116d4b810de1e95b4924586ab75e42a14deaf110617318be0eb140454c3e359dc858
|
data/Gemfile
ADDED
data/Rakefile
ADDED
data/browza.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'browza/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "browza"
|
8
|
+
spec.version = Browza::VERSION
|
9
|
+
spec.authors = ["H20Dragon"]
|
10
|
+
spec.email = ["h20dragon@outlook.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Lightweight Selenium Automation Framework - Command Based.}
|
13
|
+
spec.description = %q{Lightweight Selenium Automation Framework.}
|
14
|
+
spec.homepage = "http://github.com/h20dragon."
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
25
|
+
spec.add_development_dependency "appmodel"
|
26
|
+
spec.add_development_dependency "selenium-webdriver"
|
27
|
+
spec.add_development_dependency "logging"
|
28
|
+
end
|
@@ -0,0 +1,441 @@
|
|
1
|
+
require 'selenium-webdriver'
|
2
|
+
require 'singleton'
|
3
|
+
require 'appmodel'
|
4
|
+
|
5
|
+
module Browza
|
6
|
+
|
7
|
+
class Manager
|
8
|
+
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
attr_accessor :drv
|
12
|
+
attr_accessor :appModels
|
13
|
+
attr_accessor :browserType
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@appModels=[]
|
17
|
+
end
|
18
|
+
|
19
|
+
def addModel(_a)
|
20
|
+
puts __FILE__ + (__LINE__).to_s + " [addModel]: #{_a}"
|
21
|
+
@appModels << Appmodel::Model.new(_a)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Set innerWidth and innerHeight
|
25
|
+
def setDimension(width=1035, height=768)
|
26
|
+
target_size = Selenium::WebDriver::Dimension.new(width, height)
|
27
|
+
getDriver().manage.window.size = target_size
|
28
|
+
end
|
29
|
+
|
30
|
+
def maximize()
|
31
|
+
getDriver().manage.window.maximize
|
32
|
+
end
|
33
|
+
|
34
|
+
def createBrowser(_type = :chrome)
|
35
|
+
@browserType = _type
|
36
|
+
@drv = Selenium::WebDriver.for @browserType
|
37
|
+
setDimension
|
38
|
+
end
|
39
|
+
|
40
|
+
def getDriver()
|
41
|
+
@drv
|
42
|
+
end
|
43
|
+
|
44
|
+
def quit()
|
45
|
+
getDriver().quit
|
46
|
+
end
|
47
|
+
|
48
|
+
def title()
|
49
|
+
getDriver().title.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
def isTitle?(regex)
|
53
|
+
current_title = getDriver().title
|
54
|
+
expected_title = Regexp.new(regex)
|
55
|
+
!expected_title.match(current_title).nil? || regex==current_title
|
56
|
+
end
|
57
|
+
|
58
|
+
def goto(url)
|
59
|
+
getDriver().navigate.to url
|
60
|
+
end
|
61
|
+
|
62
|
+
def navigate(url)
|
63
|
+
goto(url)
|
64
|
+
end
|
65
|
+
|
66
|
+
def _parseLocator(_locator)
|
67
|
+
|
68
|
+
locator = _locator
|
69
|
+
_by = :xpath
|
70
|
+
|
71
|
+
if _locator.is_a?(String)
|
72
|
+
|
73
|
+
if _locator.match(/^\s*(\/|\.)/i)
|
74
|
+
locator = { :xpath => _locator }
|
75
|
+
elsif _locator.match(/^\s*\#/i)
|
76
|
+
locator = { :css => _locator }
|
77
|
+
elsif _locator.match(/^\s*css\s*=\s*(.*)\s*$/)
|
78
|
+
locator = { :css => _locator.match(/^\s*css\s*=\s*(.*)$/)[1].to_s }
|
79
|
+
puts "LOCATOR.CSS => #{locator}"
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
locator
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
def getElements(_locator, drv=nil, _timeout=30)
|
89
|
+
rc=nil
|
90
|
+
begin
|
91
|
+
|
92
|
+
if drv.nil?
|
93
|
+
drv=getDriver()
|
94
|
+
end
|
95
|
+
|
96
|
+
Selenium::WebDriver::Wait.new(timeout: _timeout).until {
|
97
|
+
_obj = drv.find_elements(_parseLocator(_locator))
|
98
|
+
|
99
|
+
if !_obj.nil?
|
100
|
+
rc = _obj
|
101
|
+
end
|
102
|
+
|
103
|
+
!rc.nil?
|
104
|
+
}
|
105
|
+
|
106
|
+
rescue Selenium::WebDriver::Error::NoSuchElementError
|
107
|
+
puts __FILE__ + (__LINE__).to_s + " NoSuchElementError : #{_locator}"
|
108
|
+
|
109
|
+
rescue => ex
|
110
|
+
puts "Error during processing: #{$!}"
|
111
|
+
puts "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
112
|
+
end
|
113
|
+
|
114
|
+
rc
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
def getElement(_locator, drv=nil, _timeout=30)
|
120
|
+
|
121
|
+
puts __FILE__ + (__LINE__).to_s + " getElement(#{_locator})"
|
122
|
+
rc=nil
|
123
|
+
begin
|
124
|
+
locator = _parseLocator(_locator)
|
125
|
+
|
126
|
+
|
127
|
+
if drv.nil?
|
128
|
+
drv=getDriver()
|
129
|
+
end
|
130
|
+
|
131
|
+
Selenium::WebDriver::Wait.new(timeout: _timeout).until {
|
132
|
+
_obj = drv.find_element(locator)
|
133
|
+
if _obj.displayed?
|
134
|
+
rc = _obj
|
135
|
+
end
|
136
|
+
|
137
|
+
!rc.nil?
|
138
|
+
}
|
139
|
+
|
140
|
+
rescue Selenium::WebDriver::Error::NoSuchElementError
|
141
|
+
puts __FILE__ + (__LINE__).to_s + " NoSuchElementError : #{locator}"
|
142
|
+
|
143
|
+
rescue => ex
|
144
|
+
puts "Error during processing: #{$!}"
|
145
|
+
puts "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
146
|
+
end
|
147
|
+
|
148
|
+
rc
|
149
|
+
end
|
150
|
+
|
151
|
+
def isChrome?(drv=nil)
|
152
|
+
if drv.nil?
|
153
|
+
drv=@drv
|
154
|
+
end
|
155
|
+
|
156
|
+
!drv.browser.to_s.match(/chrome/i).nil?
|
157
|
+
end
|
158
|
+
|
159
|
+
def switch_into_frame(id)
|
160
|
+
drv = @drv
|
161
|
+
puts __FILE__ + (__LINE__).to_s + "== switch_into_frame(#{id})"
|
162
|
+
_fcnId=" [switch_into_frame]"
|
163
|
+
puts __FILE__ + (__LINE__).to_s + "#{_fcnId}: (#{id})"
|
164
|
+
|
165
|
+
hit=nil
|
166
|
+
|
167
|
+
if TestUtils.instance.isChrome?(drv)
|
168
|
+
|
169
|
+
puts __FILE__ + (__LINE__).to_s + "#{_fcnId}: switch on Chrome browser"
|
170
|
+
bframes = drv.find_elements(:xpath, '//iframe')
|
171
|
+
|
172
|
+
puts __FILE__ + (__LINE__).to_s + "#{_fcnId}: //iframe : size #{bframes.size}"
|
173
|
+
|
174
|
+
if bframes.size == 0
|
175
|
+
bframes = drv.find_elements(:xpath, '//frame')
|
176
|
+
|
177
|
+
puts __FILE__ + (__LINE__).to_s + "#{_fcnId}: //frame : #{bframes.size}"
|
178
|
+
end
|
179
|
+
|
180
|
+
for i in 0 .. bframes.size - 1
|
181
|
+
begin
|
182
|
+
|
183
|
+
_tag = bframes[i].attribute('name')
|
184
|
+
|
185
|
+
if !_tag.nil? && _tag.empty?
|
186
|
+
_tag = bframes[i].attribute('id')
|
187
|
+
end
|
188
|
+
|
189
|
+
|
190
|
+
puts __FILE__ + (__LINE__).to_s + "[switch_into_frame.chrome]: <tag, id> :: <#{_tag}, #{id} >"
|
191
|
+
|
192
|
+
if !_tag.empty? && id==_tag
|
193
|
+
|
194
|
+
hit = bframes[i]
|
195
|
+
drv.switch_to.frame hit
|
196
|
+
|
197
|
+
puts __FILE__ + (__LINE__).to_s + "#{_fcnId}: swtichframe to #{i} - #{_tag}"
|
198
|
+
break
|
199
|
+
end
|
200
|
+
|
201
|
+
rescue => ex
|
202
|
+
puts "Error during processing: #{$!}"
|
203
|
+
puts "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
207
|
+
|
208
|
+
else
|
209
|
+
# Firefox, IE
|
210
|
+
puts __FILE__ + (__LINE__).to_s + "#{_fcnId}: drv.switch_to.frame(#{id.to_s}";
|
211
|
+
|
212
|
+
hit = drv.switch_to.frame(id.to_s.strip)
|
213
|
+
end
|
214
|
+
|
215
|
+
puts __FILE__ + (__LINE__).to_s + " switch_into_frame(#{id}) => #{hit}"
|
216
|
+
hit
|
217
|
+
end
|
218
|
+
|
219
|
+
|
220
|
+
def switch_frame(e)
|
221
|
+
|
222
|
+
drv = @drv
|
223
|
+
puts __FILE__ + (__LINE__).to_s + "\n\n== self.switch_frame(#{e}) =="
|
224
|
+
frames=nil
|
225
|
+
if e.is_a?(Hash) && e.has_key?('page') && e['page'].has_key?('frames')
|
226
|
+
puts __FILE__ + (__LINE__).to_s + " frames => #{e['page']['frames']}";
|
227
|
+
|
228
|
+
frames=e['page']['frames']
|
229
|
+
elsif e.is_a?(String)
|
230
|
+
frames=e
|
231
|
+
end
|
232
|
+
|
233
|
+
|
234
|
+
if !frames.nil?
|
235
|
+
puts __FILE__ + (__LINE__).to_s + " [self.switch_frame]: frames => #{frames}";
|
236
|
+
|
237
|
+
# frame_list=frames.split(/(frame\(.*\))\.(?=[\w])/)
|
238
|
+
frame_list=frames.split(/\.(?=frame)/)
|
239
|
+
|
240
|
+
drv.switch_to.default_content
|
241
|
+
|
242
|
+
frame_list.each do |_f|
|
243
|
+
puts __FILE__ + (__LINE__).to_s + " processing #{_f}"
|
244
|
+
|
245
|
+
if !_f.empty?
|
246
|
+
_id = _f.match(/frame\((.*)\)/)[1]
|
247
|
+
|
248
|
+
puts __FILE__ + (__LINE__).to_s + " [self.switch_frame]: switch_to.frame #{_id}"
|
249
|
+
|
250
|
+
# Swtich based on browser type
|
251
|
+
|
252
|
+
if TestUtils.instance.isChrome?(drv)
|
253
|
+
if switch_into_frame(_id).nil?
|
254
|
+
puts __FILE__ + (__LINE__).to_s + " Frame with name/id #{_id} not found"
|
255
|
+
break
|
256
|
+
else
|
257
|
+
puts __FILE__ + (__LINE__).to_s + " Sucessfully switched frame into #{_id}"
|
258
|
+
end
|
259
|
+
else
|
260
|
+
puts __FILE__ + (__LINE__).to_s + " [firefox]: switch_to.frame #{_id}"
|
261
|
+
drv.switch_to.frame _id
|
262
|
+
end
|
263
|
+
|
264
|
+
if false
|
265
|
+
|
266
|
+
if drv.browser.to_s.match(/firefox/i)
|
267
|
+
puts __FILE__ + (__LINE__).to_s + " [firefox]: switch_to.frame #{_id}"
|
268
|
+
drv.switch_to.frame _id
|
269
|
+
else
|
270
|
+
|
271
|
+
if switch_into_frame(_id).nil?
|
272
|
+
puts __FILE__ + (__LINE__).to_s + " Frame with name/id #{_id} not found"
|
273
|
+
break
|
274
|
+
else
|
275
|
+
puts __FILE__ + (__LINE__).to_s + " Sucessfully switched frame into #{_id}"
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
end
|
280
|
+
|
281
|
+
|
282
|
+
end
|
283
|
+
|
284
|
+
end
|
285
|
+
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def findLocator(_locator)
|
290
|
+
puts __FILE__ + (__LINE__).to_s + " [findLocator]: #{_locator} sz: #{@appModels.length}"
|
291
|
+
obj = nil
|
292
|
+
_hit = nil
|
293
|
+
if Appmodel::Model.isPageObject?(_locator) && @appModels.length > 0
|
294
|
+
|
295
|
+
i=0
|
296
|
+
@appModels.each do |m|
|
297
|
+
puts __FILE__ + (__LINE__).to_s + " >> #{i}. #{m.class} => #{_locator}"
|
298
|
+
begin
|
299
|
+
##
|
300
|
+
# FRAMES
|
301
|
+
##
|
302
|
+
pageObject = m.getPageElement(_locator)
|
303
|
+
|
304
|
+
puts __FILE__ + (__LINE__).to_s + " pageObject => #{pageObject}"
|
305
|
+
|
306
|
+
unless pageObject.nil?
|
307
|
+
_hit = {}
|
308
|
+
if pageObject.has_key?('frame')
|
309
|
+
_hit['frame'] = pageObject['frame']
|
310
|
+
end
|
311
|
+
|
312
|
+
if pageObject.has_key?('locator')
|
313
|
+
_hit['locator'] = Appmodel::Model.toBy(pageObject['locator'], m)
|
314
|
+
end
|
315
|
+
|
316
|
+
break
|
317
|
+
end
|
318
|
+
|
319
|
+
rescue => ex
|
320
|
+
puts "Error during processing: #{$!}"
|
321
|
+
puts "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
if _hit.is_a?(Hash)
|
327
|
+
if _hit.has_key?('frame')
|
328
|
+
puts __FILE__ + (__LINE__).to_s + "swtich_to_frame : #{_hit['frame']}"
|
329
|
+
switch_frame(_hit['frame'])
|
330
|
+
end
|
331
|
+
|
332
|
+
if _hit.has_key?('locator')
|
333
|
+
obj = getElement(_hit['locator'], @drv, 30)
|
334
|
+
end
|
335
|
+
|
336
|
+
else
|
337
|
+
obj = getElement(Appmodel::Model.toBy(_locator), @drv, 30)
|
338
|
+
end
|
339
|
+
|
340
|
+
puts __FILE__ + (__LINE__).to_s + " [return findLocator(#{_locator})] : #{_hit}"
|
341
|
+
_hit.nil? ? _locator : _hit
|
342
|
+
|
343
|
+
obj
|
344
|
+
end
|
345
|
+
|
346
|
+
|
347
|
+
##
|
348
|
+
# TestUtils.instance.click('page(sideNav).get(desktop)')
|
349
|
+
##
|
350
|
+
def click(_locator, _drv=nil, _timeout=30)
|
351
|
+
rc = false
|
352
|
+
|
353
|
+
# obj = getElement(findLocator(_locator), _drv, _timeout)
|
354
|
+
obj = findLocator(_locator)
|
355
|
+
if !obj.nil?
|
356
|
+
obj.click
|
357
|
+
rc=true
|
358
|
+
end
|
359
|
+
|
360
|
+
rc
|
361
|
+
end
|
362
|
+
|
363
|
+
def type(_locator, _text, _timeout=30)
|
364
|
+
rc = false
|
365
|
+
|
366
|
+
# obj = getElement(findLocator(_locator), _drv, _timeout)
|
367
|
+
obj = findLocator(_locator)
|
368
|
+
if !obj.nil?
|
369
|
+
obj.send_keys(_text)
|
370
|
+
rc=true
|
371
|
+
end
|
372
|
+
|
373
|
+
rc
|
374
|
+
end
|
375
|
+
|
376
|
+
def displayed?(_locator, _drv=nil, _timeout=30)
|
377
|
+
rc=false
|
378
|
+
|
379
|
+
# obj=getElement(findLocator(_locator), _drv, _timeout)
|
380
|
+
obj = findLocator(_locator)
|
381
|
+
if !obj.nil?
|
382
|
+
rc=obj.displayed?
|
383
|
+
end
|
384
|
+
rc
|
385
|
+
end
|
386
|
+
|
387
|
+
def focusedText()
|
388
|
+
activeElt = @drv.switch_to.active_element
|
389
|
+
activeElt.attribute('text')
|
390
|
+
end
|
391
|
+
|
392
|
+
def focusedValue()
|
393
|
+
activeElt = @drv.switch_to.active_element
|
394
|
+
activeElt.attribute('value')
|
395
|
+
end
|
396
|
+
|
397
|
+
def press(k, n=1)
|
398
|
+
|
399
|
+
n.times {
|
400
|
+
if k.match(/^\s*tab/i)
|
401
|
+
activeElt = @drv.switch_to.active_element
|
402
|
+
activeElt.send_keys(:tab)
|
403
|
+
elsif k.match(/^\s*clear\s*$/)
|
404
|
+
activeElt = @drv.switch_to.active_element
|
405
|
+
activeElt.clear
|
406
|
+
elsif k.match(/\s*^enter/i)
|
407
|
+
activeElt = @drv.switch_to.active_element
|
408
|
+
activeElt.send_keys(:enter)
|
409
|
+
elsif k.match(/\s*^down/i)
|
410
|
+
activeElt = @drv.switch_to.active_element
|
411
|
+
activeElt.send_keys(:arrow_down)
|
412
|
+
elsif k.match(/\s*^up/i)
|
413
|
+
activeElt = @drv.switch_to.active_element
|
414
|
+
activeElt.send_keys(:arrow_up)
|
415
|
+
else
|
416
|
+
break
|
417
|
+
end
|
418
|
+
}
|
419
|
+
end
|
420
|
+
|
421
|
+
|
422
|
+
|
423
|
+
def getCount(_locator, _drv=nil, _timeout=30)
|
424
|
+
rc=0
|
425
|
+
elts = getElements(_locator, _drv, _timeout)
|
426
|
+
if !elts.nil?
|
427
|
+
|
428
|
+
# hits = elts.select { |obj| obj.displayed? }
|
429
|
+
|
430
|
+
rc = elts.length
|
431
|
+
end
|
432
|
+
|
433
|
+
rc.to_i
|
434
|
+
end
|
435
|
+
|
436
|
+
|
437
|
+
end
|
438
|
+
|
439
|
+
|
440
|
+
end
|
441
|
+
|
data/lib/browza.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: browza
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- H20Dragon
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: selenium-webdriver
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: logging
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,7 +101,13 @@ executables: []
|
|
87
101
|
extensions: []
|
88
102
|
extra_rdoc_files: []
|
89
103
|
files:
|
104
|
+
- Gemfile
|
90
105
|
- README.md
|
106
|
+
- Rakefile
|
107
|
+
- browza.gemspec
|
108
|
+
- lib/browza.rb
|
109
|
+
- lib/browza/base/manager.rb
|
110
|
+
- lib/browza/version.rb
|
91
111
|
homepage: http://github.com/h20dragon.
|
92
112
|
licenses:
|
93
113
|
- MIT
|