browza 0.0.1 → 0.0.2.beta1
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/browza.gemspec +2 -2
- data/lib/browza/base/manager.rb +100 -42
- data/lib/browza/version.rb +1 -1
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46ab3b79c7bdaa2d454b94768594d7c02ddd5f7a
|
4
|
+
data.tar.gz: a6a1c728eb52d6aece54f428a99d82f242bac1df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a7342c4068a943d2d9994b92a96427672858165dc3bbdd5f2d21320c5bce750a5348613405f7e4d0524c9440bf9df3a5fa69d7b194e0ee592fc574d97131369
|
7
|
+
data.tar.gz: f7d17f6a11aad99be4a76f7ccdf9080bf796eaa5755b986fd8789b78dad207861907978482a8c107ca0ead18dc5797e710635d82981afb4dc95685066fae079d
|
data/browza.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "bundler", "~> 1.11"
|
23
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
24
|
spec.add_development_dependency "rspec", "~> 3.0"
|
25
|
-
spec.add_development_dependency "appmodel"
|
25
|
+
spec.add_development_dependency "appmodel", "~> 0.1.2"
|
26
26
|
spec.add_development_dependency "selenium-webdriver"
|
27
|
-
spec.add_development_dependency "logging"
|
27
|
+
spec.add_development_dependency "logging", "~> 2.2"
|
28
28
|
end
|
data/lib/browza/base/manager.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'selenium-webdriver'
|
2
2
|
require 'singleton'
|
3
3
|
require 'appmodel'
|
4
|
+
require 'logging'
|
4
5
|
|
5
6
|
module Browza
|
6
7
|
|
@@ -12,12 +13,14 @@ class Manager
|
|
12
13
|
attr_accessor :appModels
|
13
14
|
attr_accessor :browserType
|
14
15
|
|
15
|
-
def initialize
|
16
|
+
def initialize(logLevel = :warn)
|
17
|
+
@logger = Logging.logger(STDOUT)
|
18
|
+
@logger.level = logLevel
|
16
19
|
@appModels=[]
|
17
20
|
end
|
18
21
|
|
19
22
|
def addModel(_a)
|
20
|
-
|
23
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [addModel]: #{_a}"
|
21
24
|
@appModels << Appmodel::Model.new(_a)
|
22
25
|
end
|
23
26
|
|
@@ -66,7 +69,6 @@ class Manager
|
|
66
69
|
def _parseLocator(_locator)
|
67
70
|
|
68
71
|
locator = _locator
|
69
|
-
_by = :xpath
|
70
72
|
|
71
73
|
if _locator.is_a?(String)
|
72
74
|
|
@@ -104,11 +106,11 @@ class Manager
|
|
104
106
|
}
|
105
107
|
|
106
108
|
rescue Selenium::WebDriver::Error::NoSuchElementError
|
107
|
-
|
109
|
+
@logger.info __FILE__ + (__LINE__).to_s + " NoSuchElementError : #{_locator}"
|
108
110
|
|
109
111
|
rescue => ex
|
110
|
-
|
111
|
-
|
112
|
+
@logger.warn "Error during processing: #{$!}"
|
113
|
+
@logger.warn "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
112
114
|
end
|
113
115
|
|
114
116
|
rc
|
@@ -118,7 +120,7 @@ class Manager
|
|
118
120
|
|
119
121
|
def getElement(_locator, drv=nil, _timeout=30)
|
120
122
|
|
121
|
-
|
123
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " getElement(#{_locator})"
|
122
124
|
rc=nil
|
123
125
|
begin
|
124
126
|
locator = _parseLocator(_locator)
|
@@ -128,6 +130,8 @@ class Manager
|
|
128
130
|
drv=getDriver()
|
129
131
|
end
|
130
132
|
|
133
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " getElement() => #{locator}"
|
134
|
+
|
131
135
|
Selenium::WebDriver::Wait.new(timeout: _timeout).until {
|
132
136
|
_obj = drv.find_element(locator)
|
133
137
|
if _obj.displayed?
|
@@ -138,11 +142,11 @@ class Manager
|
|
138
142
|
}
|
139
143
|
|
140
144
|
rescue Selenium::WebDriver::Error::NoSuchElementError
|
141
|
-
|
145
|
+
@logger.warn __FILE__ + (__LINE__).to_s + " NoSuchElementError : #{locator}"
|
142
146
|
|
143
147
|
rescue => ex
|
144
|
-
|
145
|
-
|
148
|
+
@logger.warn "Error during processing: #{$!}"
|
149
|
+
@logger.warn "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
146
150
|
end
|
147
151
|
|
148
152
|
rc
|
@@ -158,23 +162,23 @@ class Manager
|
|
158
162
|
|
159
163
|
def switch_into_frame(id)
|
160
164
|
drv = @drv
|
161
|
-
|
165
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "== switch_into_frame(#{id})"
|
162
166
|
_fcnId=" [switch_into_frame]"
|
163
|
-
|
167
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: (#{id})"
|
164
168
|
|
165
169
|
hit=nil
|
166
170
|
|
167
|
-
if
|
171
|
+
if isChrome?(drv)
|
168
172
|
|
169
|
-
|
173
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: switch on Chrome browser"
|
170
174
|
bframes = drv.find_elements(:xpath, '//iframe')
|
171
175
|
|
172
|
-
|
176
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: //iframe : size #{bframes.size}"
|
173
177
|
|
174
178
|
if bframes.size == 0
|
175
179
|
bframes = drv.find_elements(:xpath, '//frame')
|
176
180
|
|
177
|
-
|
181
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: //frame : #{bframes.size}"
|
178
182
|
end
|
179
183
|
|
180
184
|
for i in 0 .. bframes.size - 1
|
@@ -187,32 +191,32 @@ class Manager
|
|
187
191
|
end
|
188
192
|
|
189
193
|
|
190
|
-
|
194
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "[switch_into_frame.chrome]: <tag, id> :: <#{_tag}, #{id} >"
|
191
195
|
|
192
196
|
if !_tag.empty? && id==_tag
|
193
197
|
|
194
198
|
hit = bframes[i]
|
195
199
|
drv.switch_to.frame hit
|
196
200
|
|
197
|
-
|
201
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: swtichframe to #{i} - #{_tag}"
|
198
202
|
break
|
199
203
|
end
|
200
204
|
|
201
205
|
rescue => ex
|
202
|
-
|
203
|
-
|
206
|
+
@logger.warn "Error during processing: #{$!}"
|
207
|
+
@logger.warn "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
204
208
|
end
|
205
209
|
|
206
210
|
end
|
207
211
|
|
208
212
|
else
|
209
213
|
# Firefox, IE
|
210
|
-
|
214
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: drv.switch_to.frame(#{id.to_s}";
|
211
215
|
|
212
216
|
hit = drv.switch_to.frame(id.to_s.strip)
|
213
217
|
end
|
214
218
|
|
215
|
-
|
219
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " switch_into_frame(#{id}) => #{hit}"
|
216
220
|
hit
|
217
221
|
end
|
218
222
|
|
@@ -220,10 +224,10 @@ class Manager
|
|
220
224
|
def switch_frame(e)
|
221
225
|
|
222
226
|
drv = @drv
|
223
|
-
|
227
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "\n\n== self.switch_frame(#{e}) =="
|
224
228
|
frames=nil
|
225
229
|
if e.is_a?(Hash) && e.has_key?('page') && e['page'].has_key?('frames')
|
226
|
-
|
230
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " frames => #{e['page']['frames']}";
|
227
231
|
|
228
232
|
frames=e['page']['frames']
|
229
233
|
elsif e.is_a?(String)
|
@@ -232,7 +236,7 @@ class Manager
|
|
232
236
|
|
233
237
|
|
234
238
|
if !frames.nil?
|
235
|
-
|
239
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [self.switch_frame]: frames => #{frames}";
|
236
240
|
|
237
241
|
# frame_list=frames.split(/(frame\(.*\))\.(?=[\w])/)
|
238
242
|
frame_list=frames.split(/\.(?=frame)/)
|
@@ -240,39 +244,39 @@ class Manager
|
|
240
244
|
drv.switch_to.default_content
|
241
245
|
|
242
246
|
frame_list.each do |_f|
|
243
|
-
|
247
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " processing #{_f}"
|
244
248
|
|
245
249
|
if !_f.empty?
|
246
250
|
_id = _f.match(/frame\((.*)\)/)[1]
|
247
251
|
|
248
|
-
|
252
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [self.switch_frame]: switch_to.frame #{_id}"
|
249
253
|
|
250
254
|
# Swtich based on browser type
|
251
255
|
|
252
|
-
if
|
256
|
+
if isChrome?(drv)
|
253
257
|
if switch_into_frame(_id).nil?
|
254
|
-
|
258
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " Frame with name/id #{_id} not found"
|
255
259
|
break
|
256
260
|
else
|
257
|
-
|
261
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " Sucessfully switched frame into #{_id}"
|
258
262
|
end
|
259
263
|
else
|
260
|
-
|
264
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [firefox]: switch_to.frame #{_id}"
|
261
265
|
drv.switch_to.frame _id
|
262
266
|
end
|
263
267
|
|
264
268
|
if false
|
265
269
|
|
266
270
|
if drv.browser.to_s.match(/firefox/i)
|
267
|
-
|
271
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [firefox]: switch_to.frame #{_id}"
|
268
272
|
drv.switch_to.frame _id
|
269
273
|
else
|
270
274
|
|
271
275
|
if switch_into_frame(_id).nil?
|
272
|
-
|
276
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " Frame with name/id #{_id} not found"
|
273
277
|
break
|
274
278
|
else
|
275
|
-
|
279
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " Sucessfully switched frame into #{_id}"
|
276
280
|
end
|
277
281
|
end
|
278
282
|
|
@@ -287,21 +291,21 @@ class Manager
|
|
287
291
|
end
|
288
292
|
|
289
293
|
def findLocator(_locator)
|
290
|
-
|
294
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [findLocator]: #{_locator} sz: #{@appModels.length}"
|
291
295
|
obj = nil
|
292
296
|
_hit = nil
|
293
297
|
if Appmodel::Model.isPageObject?(_locator) && @appModels.length > 0
|
294
298
|
|
295
299
|
i=0
|
296
300
|
@appModels.each do |m|
|
297
|
-
|
301
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " >> #{i}. #{m.class} => #{_locator}"
|
298
302
|
begin
|
299
303
|
##
|
300
304
|
# FRAMES
|
301
305
|
##
|
302
306
|
pageObject = m.getPageElement(_locator)
|
303
307
|
|
304
|
-
|
308
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " pageObject => #{pageObject}"
|
305
309
|
|
306
310
|
unless pageObject.nil?
|
307
311
|
_hit = {}
|
@@ -317,15 +321,26 @@ class Manager
|
|
317
321
|
end
|
318
322
|
|
319
323
|
rescue => ex
|
320
|
-
|
321
|
-
|
324
|
+
@logger.warn "Error during processing: #{$!}"
|
325
|
+
@logger.warn "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
322
326
|
end
|
323
327
|
end
|
328
|
+
|
329
|
+
elsif _locator.is_a?(String)
|
330
|
+
_hit = Appmodel::Model.parseLocator(_locator)
|
331
|
+
elsif _locator.is_a?(Hash)
|
332
|
+
_hit = { 'locator' => _locator[:css] } if _locator.has_key?(:css)
|
333
|
+
_hit = { 'locator' => _locator['css'] } if _locator.has_key?('css')
|
334
|
+
_hit = { 'locator' => _locator[:xpath] } if _locator.has_key?(:xpath)
|
335
|
+
_hit = { 'locator' => _locator[:xpath] } if _locator.has_key?('xpath')
|
336
|
+
|
337
|
+
_hit['frame'] = _locator[:frame] if _locator.has_key?(:frame)
|
338
|
+
_hit['frame'] = _locator['frame'] if _locator.has_key?('frame')
|
324
339
|
end
|
325
340
|
|
326
341
|
if _hit.is_a?(Hash)
|
327
342
|
if _hit.has_key?('frame')
|
328
|
-
|
343
|
+
@logger.debug __FILE__ + (__LINE__).to_s + "swtich_to_frame : #{_hit['frame']}"
|
329
344
|
switch_frame(_hit['frame'])
|
330
345
|
end
|
331
346
|
|
@@ -337,7 +352,7 @@ class Manager
|
|
337
352
|
obj = getElement(Appmodel::Model.toBy(_locator), @drv, 30)
|
338
353
|
end
|
339
354
|
|
340
|
-
|
355
|
+
@logger.debug __FILE__ + (__LINE__).to_s + " [return findLocator(#{_locator})] : #{_hit}"
|
341
356
|
_hit.nil? ? _locator : _hit
|
342
357
|
|
343
358
|
obj
|
@@ -345,12 +360,13 @@ class Manager
|
|
345
360
|
|
346
361
|
|
347
362
|
##
|
348
|
-
#
|
363
|
+
# Browza.instance.click('page(sideNav).get(desktop)')
|
349
364
|
##
|
350
365
|
def click(_locator, _drv=nil, _timeout=30)
|
351
366
|
rc = false
|
352
367
|
|
353
368
|
# obj = getElement(findLocator(_locator), _drv, _timeout)
|
369
|
+
@drv.switch_to.default_content
|
354
370
|
obj = findLocator(_locator)
|
355
371
|
if !obj.nil?
|
356
372
|
obj.click
|
@@ -360,6 +376,48 @@ class Manager
|
|
360
376
|
rc
|
361
377
|
end
|
362
378
|
|
379
|
+
def highlight(_locator, _drv=nil, _timeout=30)
|
380
|
+
rc = false
|
381
|
+
style={"color" => 'rgb(255, 16, 16)'}
|
382
|
+
color="rgb(255, 0, 0)"
|
383
|
+
|
384
|
+
obj = findLocator(_locator)
|
385
|
+
if !obj.nil?
|
386
|
+
|
387
|
+
|
388
|
+
if style.has_key?("color")
|
389
|
+
|
390
|
+
color=style.has_key?("color")? style["color"] : 'rgb(255, 16, 16)'
|
391
|
+
|
392
|
+
_c = style["color"]
|
393
|
+
|
394
|
+
# TODO: refactor with command 'highlight.rb'
|
395
|
+
|
396
|
+
if _c.match(/\s*blue/i)
|
397
|
+
color='rgb(0, 0, 255)'
|
398
|
+
elsif _c.match(/\s*red/i)
|
399
|
+
color='rgb(255, 0, 0)'
|
400
|
+
elsif _c.match(/\s*yellow/i)
|
401
|
+
color='rgb(255, 255, 0)'
|
402
|
+
elsif _c.match(/\s*green/i)
|
403
|
+
color='rgb(0, 255, 0)'
|
404
|
+
elsif _c.match(/\s*gray/i)
|
405
|
+
color='rgb(128, 128, 128)'
|
406
|
+
end
|
407
|
+
|
408
|
+
end
|
409
|
+
|
410
|
+
border=style.has_key?("border")? style["border"] : 1
|
411
|
+
|
412
|
+
parents = ""
|
413
|
+
|
414
|
+
@drv.execute_script("hlt = function(c) { c.style.border='solid #{border}px #{color}'; }; return hlt(arguments[0]);", obj)
|
415
|
+
rc=true
|
416
|
+
end
|
417
|
+
|
418
|
+
obj.is_a?(Selenium::WebDriver::Element) && rc
|
419
|
+
end
|
420
|
+
|
363
421
|
def type(_locator, _text, _timeout=30)
|
364
422
|
rc = false
|
365
423
|
|
data/lib/browza/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.2.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- H20Dragon
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: appmodel
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.1.2
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.1.2
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: selenium-webdriver
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,16 +84,16 @@ dependencies:
|
|
84
84
|
name: logging
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '2.2'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '2.2'
|
97
97
|
description: Lightweight Selenium Automation Framework.
|
98
98
|
email:
|
99
99
|
- h20dragon@outlook.com
|
@@ -123,9 +123,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
123
|
version: '0'
|
124
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
125
|
requirements:
|
126
|
-
- - "
|
126
|
+
- - ">"
|
127
127
|
- !ruby/object:Gem::Version
|
128
|
-
version:
|
128
|
+
version: 1.3.1
|
129
129
|
requirements: []
|
130
130
|
rubyforge_project:
|
131
131
|
rubygems_version: 2.6.2
|