browza 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|