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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4e2ba35ea280d9f075814d6d4f5526895aea294
4
- data.tar.gz: 73c6c6d7088863d85e1bc73fab50d1d48f91ab73
3
+ metadata.gz: a59afa3f589a1e3ae62e4382e47ad927303406e2
4
+ data.tar.gz: 766ea1a959259523a64282d24886ae9b57fe8774
5
5
  SHA512:
6
- metadata.gz: cc54cc4cd5d5f3d548b91335b529f1c677ec2e32415e7139a841a88541557ccfddb5c0cc8a6ab193384ec72b7545e192c28205647875d02e2123fe4593dc19a7
7
- data.tar.gz: 693583681e6fb46a325e52b1e8c2b8a3fbb4b907ac36db349dbae824a8494280d3abc5bda2eefb0e7142ed85d4062388033c0c7945607161eaf8b42897bce9a5
6
+ metadata.gz: 9e67e334582c6717ae08dfb179d64471a0f95cd74ce9e4311d98b34b11a6733f1780e650b87656567033c170fcf3fe45dc4d3fa1273f97fdba8959c8c4132bb9
7
+ data.tar.gz: afca6f6ee25601abd9ab7a85b3f6e4baf1cf70dca60f56b4c417c8a66355116d4b810de1e95b4924586ab75e42a14deaf110617318be0eb140454c3e359dc858
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in appmodel.gemspec
4
+ gemspec
5
+
6
+ gem 'appmodel'
7
+
8
+ # Require chromediver
9
+ gem 'chromedriver-helper'
10
+
11
+
12
+ gem 'logging'
13
+
14
+ gem 'require_relative'
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
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
+
@@ -0,0 +1,3 @@
1
+ module Browza
2
+ VERSION = "0.0.1"
3
+ end
data/lib/browza.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'browza/version'
2
+
3
+ module Browza
4
+ ROOT_DIR = File.join(File.dirname(File.expand_path(__FILE__)), 'browza').freeze
5
+
6
+ Dir["#{ROOT_DIR}/*.rb"].each { |f| require f }
7
+ Dir["#{ROOT_DIR}/**/*.rb"].each { |f| require f }
8
+ end
9
+
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.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