scoutui 0.1.2 → 0.1.3
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/README.md +71 -16
- data/bin/scoutui_driver.rb +22 -0
- data/examples/ex1/commands.yml +25 -0
- data/examples/ex1/test-example.sh +36 -0
- data/examples/ex1/test.config.json +16 -0
- data/examples/ex2/commands.yml +35 -0
- data/examples/ex2/page_model.json +18 -0
- data/examples/ex2/test-example.sh +38 -0
- data/examples/ex2/test.config.json +25 -0
- data/examples/ex6/commands.yml +53 -0
- data/examples/ex6/ex1.config.json +24 -0
- data/examples/ex6/test-example.sh +36 -0
- data/lib/scoutui/base/q_accounts.rb +8 -4
- data/lib/scoutui/base/q_browser.rb +22 -0
- data/lib/scoutui/base/test_scout.rb +3 -5
- data/lib/scoutui/base/test_settings.rb +1 -11
- data/lib/scoutui/base/user_vars.rb +42 -1
- data/lib/scoutui/base/visual_test_framework.rb +131 -24
- data/lib/scoutui/eyes/eye_factory.rb +21 -9
- data/lib/scoutui/eyes/eye_scout.rb +33 -9
- data/lib/scoutui/navigator.rb +1 -0
- data/lib/scoutui/utils/utils.rb +96 -32
- data/lib/scoutui/version.rb +1 -1
- metadata +13 -2
@@ -7,12 +7,16 @@ module Scoutui::Base
|
|
7
7
|
attr_accessor :dut
|
8
8
|
attr_accessor :accounts
|
9
9
|
|
10
|
-
def initialize(f
|
11
|
-
|
10
|
+
def initialize(f)
|
11
|
+
|
12
|
+
if !f.nil?
|
13
|
+
@accounts = YAML.load_stream File.read(f)
|
14
|
+
end
|
15
|
+
|
12
16
|
end
|
13
17
|
|
14
18
|
def _find(id, attr)
|
15
|
-
hit = accounts.find { |h| h['account']['loginid'] == id }
|
19
|
+
hit = @accounts.find { |h| h['account']['loginid'] == id }
|
16
20
|
if !hit.nil?
|
17
21
|
id=hit['account'][attr]
|
18
22
|
end
|
@@ -32,7 +36,7 @@ module Scoutui::Base
|
|
32
36
|
|
33
37
|
def getUserId(userid)
|
34
38
|
id=nil
|
35
|
-
hit = accounts.find { |h| h['account']['loginid'].to_s == userid.to_s }
|
39
|
+
hit = @accounts.find { |h| h['account']['loginid'].to_s == userid.to_s }
|
36
40
|
if !hit.nil?
|
37
41
|
id=hit['account']['loginid']
|
38
42
|
end
|
@@ -25,14 +25,36 @@ module Scoutui::Base
|
|
25
25
|
rc
|
26
26
|
end
|
27
27
|
|
28
|
+
def self.getFirstObject(drv, xpath, _timeout=30)
|
29
|
+
rc=nil
|
30
|
+
begin
|
31
|
+
Selenium::WebDriver::Wait.new(timeout: _timeout).until { drv.find_elements(:xpath => xpath).size > 0 }
|
32
|
+
rc=drv.find_elements(:xpath => xpath)[0]
|
33
|
+
rescue => ex
|
34
|
+
;
|
35
|
+
end
|
36
|
+
rc
|
37
|
+
end
|
38
|
+
|
28
39
|
def self.getObject(drv, xpath, _timeout=30)
|
29
40
|
rc=nil
|
30
41
|
begin
|
42
|
+
|
43
|
+
if !xpath.match(/^page\([\w\d]+\)/).nil?
|
44
|
+
|
45
|
+
xpath = Scoutui::Utils::TestUtils.instance.getPageElement(xpath)
|
46
|
+
puts __FILE__ + (__LINE__).to_s + " Process page request #{xpath} => #{xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
47
|
+
end
|
48
|
+
|
49
|
+
|
31
50
|
Selenium::WebDriver::Wait.new(timeout: _timeout).until { drv.find_element(:xpath => xpath).displayed? }
|
32
51
|
rc=drv.find_element(:xpath => xpath)
|
33
52
|
rescue => ex
|
34
53
|
;
|
35
54
|
end
|
55
|
+
|
56
|
+
puts __FILE__ + (__LINE__).to_s + " getObject(#{xpath}) => #{rc.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
57
|
+
|
36
58
|
rc
|
37
59
|
end
|
38
60
|
|
@@ -5,7 +5,7 @@ module Scoutui::Base
|
|
5
5
|
|
6
6
|
class TestScout
|
7
7
|
attr_reader :context
|
8
|
-
attr_reader :test_settings # { host,
|
8
|
+
attr_reader :test_settings # { host, dut }
|
9
9
|
attr_reader :userRecord
|
10
10
|
attr_reader :eyesRecord # {'title' , 'app'}
|
11
11
|
attr_reader :eyeScout
|
@@ -22,9 +22,6 @@ module Scoutui::Base
|
|
22
22
|
|
23
23
|
@test_settings=Scoutui::Utils::TestUtils.instance.getTestSettings()
|
24
24
|
|
25
|
-
accounts = Scoutui::Base::QAccounts.new()
|
26
|
-
@userRecord = accounts.getUserRecord(@test_settings['user'])
|
27
|
-
|
28
25
|
@eyesRecord = @test_settings['eyes']
|
29
26
|
end
|
30
27
|
|
@@ -43,7 +40,7 @@ module Scoutui::Base
|
|
43
40
|
end
|
44
41
|
|
45
42
|
def report
|
46
|
-
|
43
|
+
@eyeScout.generateReport()
|
47
44
|
end
|
48
45
|
|
49
46
|
def hasSettings?
|
@@ -113,6 +110,7 @@ module Scoutui::Base
|
|
113
110
|
ensure
|
114
111
|
puts __FILE__ + (__LINE__ ).to_s + " Close Eyes" if Scoutui::Utils::TestUtils.instance.isDebug?
|
115
112
|
@eyeScout.closeOut()
|
113
|
+
|
116
114
|
end
|
117
115
|
|
118
116
|
end
|
@@ -11,7 +11,6 @@ module Scoutui::Base
|
|
11
11
|
attr_accessor :user
|
12
12
|
attr_accessor :eyesReport
|
13
13
|
attr_accessor :url
|
14
|
-
attr_accessor :localization
|
15
14
|
|
16
15
|
|
17
16
|
def initialize(opts)
|
@@ -23,16 +22,13 @@ module Scoutui::Base
|
|
23
22
|
@eyesReport=opts[:eyesReport] || nil
|
24
23
|
@url=opts[:url]||nil
|
25
24
|
|
26
|
-
@localization_test_data='/Users/pkim/working/nui-qa/apps/gat/tests/localization.json'
|
27
|
-
@localization_json = File.read(@localization_test_data)
|
28
|
-
@localizationObj = JSON.parse(@localization_json)
|
29
25
|
end
|
30
26
|
|
31
27
|
def setConfig(c)
|
32
28
|
if c.instance_of?(Hash)
|
33
29
|
@testConfig=c
|
34
30
|
else
|
35
|
-
# a JSON file was passed
|
31
|
+
# a JSON file was passed (ERROR handling needed)
|
36
32
|
jFile = File.read(c)
|
37
33
|
@testConfig=JSON.parse(jFile)
|
38
34
|
end
|
@@ -49,12 +45,6 @@ module Scoutui::Base
|
|
49
45
|
@lang=lang
|
50
46
|
end
|
51
47
|
|
52
|
-
|
53
|
-
def getLocalization()
|
54
|
-
# @testConfig["language-mapping"][@lang]
|
55
|
-
@localizationObj["language-mapping"][@lang]
|
56
|
-
end
|
57
|
-
|
58
48
|
def getUrl()
|
59
49
|
@url
|
60
50
|
end
|
@@ -9,6 +9,7 @@ module Scoutui::Base
|
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@globals={
|
12
|
+
:accounts => '/tmp/qa/accounts.yaml',
|
12
13
|
:browser => 'chrome',
|
13
14
|
:userid => nil,
|
14
15
|
:password => nil,
|
@@ -17,6 +18,21 @@ module Scoutui::Base
|
|
17
18
|
}
|
18
19
|
end
|
19
20
|
|
21
|
+
def dump()
|
22
|
+
@globals.each_pair do |k, v|
|
23
|
+
puts __FILE__ + (__LINE__).to_s + " #{k} => #{v}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def getViewPort()
|
28
|
+
arr=Scoutui::Base::UserVars.instance.getVar('eyes.viewport').match(/(\d+)\s*x\s*(\d+)$/i)
|
29
|
+
if arr.size==3
|
30
|
+
_sz = {:width => arr[1].to_i, :height => arr[2].to_i }
|
31
|
+
end
|
32
|
+
|
33
|
+
_sz
|
34
|
+
end
|
35
|
+
|
20
36
|
def getBrowserType()
|
21
37
|
@globals[:browser].to_sym
|
22
38
|
end
|
@@ -26,19 +42,44 @@ module Scoutui::Base
|
|
26
42
|
end
|
27
43
|
|
28
44
|
def get(k)
|
45
|
+
foundKey=true
|
46
|
+
|
29
47
|
v=k
|
30
48
|
|
49
|
+
_rc = k.match(/\$\{(.*)\}$/)
|
50
|
+
|
51
|
+
# Needs refactoring!
|
31
52
|
if k=='${userid}'
|
32
53
|
k=:userid
|
33
54
|
elsif k=='${password}'
|
34
55
|
k=:password
|
35
56
|
elsif k=='${host}'
|
36
57
|
k=:host
|
58
|
+
elsif k.is_a?(Symbol)
|
59
|
+
foundKey=true
|
60
|
+
elsif !_rc.nil?
|
61
|
+
k=_rc[1].to_s
|
62
|
+
puts __FILE__ + (__LINE__).to_s + " User Var found => #{k}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
63
|
+
if Scoutui::Utils::TestUtils.instance.getTestConfig().has_key?("user_vars")
|
64
|
+
|
65
|
+
if Scoutui::Utils::TestUtils.instance.getTestConfig()["user_vars"].has_key?(k)
|
66
|
+
v=Scoutui::Utils::TestUtils.instance.getTestConfig()["user_vars"][k].to_s
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
else
|
72
|
+
foundKey=false
|
37
73
|
end
|
38
74
|
|
39
|
-
|
75
|
+
puts __FILE__ + (__LINE__).to_s + " get(#{k} => #{@globals.has_key?(k)}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
76
|
+
|
77
|
+
if @globals.has_key?(k) && foundKey
|
40
78
|
v=@globals[k]
|
41
79
|
end
|
80
|
+
|
81
|
+
puts __FILE__ + (__LINE__).to_s + " get(#{k} => #{@globals.has_key?(k)} ==> #{v.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
82
|
+
|
42
83
|
v
|
43
84
|
end
|
44
85
|
|
@@ -9,40 +9,35 @@ module Scoutui::Base
|
|
9
9
|
end
|
10
10
|
|
11
11
|
|
12
|
-
def self.
|
13
|
-
|
14
|
-
|
15
|
-
if e['page'].has_key?('expected')
|
16
|
-
expected_list=e['page']['expected']
|
17
|
-
|
18
|
-
expected_list.each_pair do |link_name, xpath|
|
19
|
-
puts "\t\t#{link_name} => #{xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
20
|
-
|
21
|
-
obj = Scoutui::Base::QBrowser.getObject(my_driver, xpath)
|
22
|
-
|
23
|
-
if obj.nil?
|
24
|
-
puts " NOT FOUND : #{link_name} with xpath #{xpath}"
|
25
|
-
else
|
26
|
-
puts " link object(#{link_name} with xpath #{xpath}=> #{obj.displayed?}"
|
27
|
-
end
|
12
|
+
def self.isClick?(_action)
|
13
|
+
!_action.match(/click\(/).nil?
|
14
|
+
end
|
28
15
|
|
29
|
-
|
30
|
-
|
16
|
+
def self.isMouseOver(_action)
|
17
|
+
!_action.match(/mouseover\(/).nil?
|
31
18
|
end
|
32
19
|
|
33
20
|
|
34
21
|
def self.processCommand(_action, e, my_driver)
|
35
22
|
puts __FILE__ + (__LINE__).to_s + " Process ACTION : #{_action}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
36
23
|
|
37
|
-
if !_action.match(/
|
24
|
+
if !_action.match(/pause/).nil?
|
25
|
+
|
26
|
+
puts " PAUSE";
|
27
|
+
gets();
|
28
|
+
|
29
|
+
elsif !_action.match(/type\(/).nil?
|
38
30
|
_xpath = _action.match(/type\((.*),\s*/)[1].to_s
|
39
31
|
_val = _action.match(/type\(.*,\s*(.*)\)/)[1].to_s
|
40
32
|
|
41
33
|
puts __FILE__ + (__LINE__).to_s + "Process TYPE #{_val} into #{_xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
42
34
|
|
43
35
|
obj = Scoutui::Base::QBrowser.getObject(my_driver, _xpath)
|
36
|
+
|
44
37
|
if !obj.nil? && !obj.attribute('type').downcase.match(/(text|password)/).nil?
|
45
38
|
obj.send_keys(Scoutui::Base::UserVars.instance.get(_val))
|
39
|
+
else
|
40
|
+
puts __FILE__ + (__LINE__).to_s + " Unable to process command TYPE => #{obj.to_s}"
|
46
41
|
end
|
47
42
|
|
48
43
|
end
|
@@ -50,14 +45,64 @@ module Scoutui::Base
|
|
50
45
|
if !_action.match(/click\(/).nil?
|
51
46
|
_xpath = _action.match(/click\s*\((.*)\)/)[1].to_s.strip
|
52
47
|
puts __FILE__ + (__LINE__).to_s + " click => #{_xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
48
|
+
|
49
|
+
_xpath = Scoutui::Base::UserVars.instance.get(_xpath)
|
50
|
+
|
51
|
+
puts __FILE__ + (__LINE__).to_s + " | translate : #{_xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
52
|
+
|
53
53
|
obj = Scoutui::Base::QBrowser.getObject(my_driver, _xpath)
|
54
|
-
obj.click
|
54
|
+
obj.click if obj
|
55
|
+
elsif isMouseOver(_action)
|
56
|
+
_xpath = _action.match(/mouseover\s*\((.*)\)/)[1].to_s.strip
|
57
|
+
obj = Scoutui::Base::QBrowser.getObject(my_driver, _xpath)
|
58
|
+
my_driver.action.move_to(obj).perform
|
55
59
|
|
56
|
-
processExpected(my_driver, e)
|
57
60
|
end
|
58
61
|
|
59
62
|
end
|
60
63
|
|
64
|
+
def self.isRun(e)
|
65
|
+
_run=nil
|
66
|
+
if e["page"].has_key?("run")
|
67
|
+
_run = e["page"].has_key?("run").to_s
|
68
|
+
end
|
69
|
+
_run
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.isSnapIt(e)
|
73
|
+
_snapit=false
|
74
|
+
|
75
|
+
if e["page"].has_key?("snapit")
|
76
|
+
_snapit = !(e["page"]["snapit"].to_s.match(/true/i).nil?)
|
77
|
+
end
|
78
|
+
_snapit
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.processExpected(my_driver, e)
|
82
|
+
puts __FILE__ + (__LINE__).to_s + "\to Expected: #{e['page']['expected'].class.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
83
|
+
|
84
|
+
if e['page'].has_key?('expected')
|
85
|
+
expected_list=e['page']['expected']
|
86
|
+
|
87
|
+
expected_list.each_pair do |link_name, xpath|
|
88
|
+
puts "\t\t#{link_name} => #{xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
89
|
+
if !xpath.match(/^page\([\w\d]+\)/).nil?
|
90
|
+
|
91
|
+
xpath = Scoutui::Utils::TestUtils.instance.getPageElement(xpath)
|
92
|
+
puts __FILE__ + (__LINE__).to_s + " Process page request #{xpath} => #{xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
93
|
+
end
|
94
|
+
|
95
|
+
obj = Scoutui::Base::QBrowser.getFirstObject(my_driver, xpath)
|
96
|
+
|
97
|
+
if obj.nil?
|
98
|
+
puts " NOT FOUND : #{link_name} with xpath #{xpath}"
|
99
|
+
else
|
100
|
+
puts " link object(#{link_name} with xpath #{xpath}=> #{obj.displayed?}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
61
106
|
|
62
107
|
# Scoutui::Base::VisualTestFramework.processFile(@drv, @eyes, @test_settings['host'], @test_settings['dut'])
|
63
108
|
def self.processFile(eyeScout, test_settings)
|
@@ -69,8 +114,18 @@ module Scoutui::Base
|
|
69
114
|
|
70
115
|
puts __FILE__ + (__LINE__).to_s + " processFile(#{eyeScout}, #{baseUrl}, #{datafile})" if Scoutui::Utils::TestUtils.instance.isDebug?
|
71
116
|
|
117
|
+
valid_file=false
|
72
118
|
i=0
|
73
|
-
|
119
|
+
begin
|
120
|
+
dut_dupes = YAML.load_stream File.read(datafile)
|
121
|
+
valid_file=true
|
122
|
+
rescue => ex
|
123
|
+
puts __FILE__ + (__LINE__).to_s + " Invalid file: #{datafile} - abort processing."
|
124
|
+
puts ex.backtrace
|
125
|
+
end
|
126
|
+
|
127
|
+
return if !valid_file
|
128
|
+
|
74
129
|
dut_dupes.each do |e|
|
75
130
|
puts '-' * 72 if Scoutui::Utils::TestUtils.instance.isDebug?
|
76
131
|
puts "#{i.to_s}. Processing #{e.inspect}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
@@ -80,12 +135,15 @@ module Scoutui::Base
|
|
80
135
|
_name = e["page"]["name"]
|
81
136
|
_url = e["page"]["url"]
|
82
137
|
_skip = e["page"]["skip"]
|
138
|
+
_region = e["page"]["region"]
|
139
|
+
|
83
140
|
|
84
141
|
if Scoutui::Utils::TestUtils.instance.isDebug?
|
85
142
|
puts __FILE__ + (__LINE__).to_s + " action: #{_action}"
|
86
143
|
puts __FILE__ + (__LINE__).to_s + " name: #{_name}"
|
87
144
|
puts __FILE__ + (__LINE__).to_s + " url : #{_url}"
|
88
145
|
puts __FILE__ + (__LINE__).to_s + " skip: #{_skip}"
|
146
|
+
puts __FILE__ + (__LINE__).to_s + " region: #{_region}"
|
89
147
|
end
|
90
148
|
|
91
149
|
skipIt = (!_skip.nil?) && (_skip.to_s.strip.downcase=='true')
|
@@ -96,8 +154,31 @@ module Scoutui::Base
|
|
96
154
|
next
|
97
155
|
end
|
98
156
|
|
157
|
+
|
158
|
+
if !isRun(e).nil?
|
159
|
+
|
160
|
+
tmpSettings=test_settings.dup
|
161
|
+
tmpSettings["dut"]=e["page"]["run"].to_s
|
162
|
+
|
163
|
+
processFile(eyeScout, tmpSettings)
|
164
|
+
puts __FILE__ + (__LINE__).to_s + " Completed execution of subfile" if Scoutui::Utils::TestUtils.instance.isDebug?
|
165
|
+
next
|
166
|
+
end
|
167
|
+
|
99
168
|
if !(_action.nil? || _action.empty?)
|
100
169
|
processCommand(_action, e, my_driver)
|
170
|
+
processExpected(my_driver, e)
|
171
|
+
|
172
|
+
if isSnapIt(e)
|
173
|
+
if !_region.nil?
|
174
|
+
eyeScout.check_window(_name, _region)
|
175
|
+
else
|
176
|
+
eyeScout.check_window(_name)
|
177
|
+
end
|
178
|
+
|
179
|
+
# processExpected(my_driver, e)
|
180
|
+
end
|
181
|
+
|
101
182
|
next
|
102
183
|
end
|
103
184
|
|
@@ -116,12 +197,25 @@ module Scoutui::Base
|
|
116
197
|
|
117
198
|
puts "\to Expected: #{e['page']['expected'].class.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
118
199
|
|
200
|
+
processExpected(my_driver, e)
|
201
|
+
|
202
|
+
if false
|
203
|
+
|
119
204
|
if e['page'].has_key?('expected')
|
120
205
|
expected_list=e['page']['expected']
|
121
206
|
|
122
207
|
expected_list.each_pair do |link_name, xpath|
|
123
208
|
puts "\t\t#{link_name} => #{xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
124
209
|
|
210
|
+
if !xpath.match(/^page\([\w\d]+\)/).nil?
|
211
|
+
|
212
|
+
|
213
|
+
xpath = Scoutui::Utils::TestUtils.instance.getPageElement(xpath)
|
214
|
+
|
215
|
+
puts __FILE__ + (__LINE__).to_s + " Process page request #{xpath} => #{xpath}"
|
216
|
+
|
217
|
+
end
|
218
|
+
|
125
219
|
obj = Scoutui::Base::QBrowser.getObject(my_driver, xpath)
|
126
220
|
|
127
221
|
if obj.nil?
|
@@ -133,7 +227,15 @@ module Scoutui::Base
|
|
133
227
|
end
|
134
228
|
end
|
135
229
|
|
136
|
-
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
|
234
|
+
if !_region.nil?
|
235
|
+
eyeScount.check_window(_name, _region)
|
236
|
+
else
|
237
|
+
eyeScout.check_window(name)
|
238
|
+
end
|
137
239
|
|
138
240
|
puts "\to links : #{e['page']['links'].class.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
139
241
|
|
@@ -148,7 +250,12 @@ module Scoutui::Base
|
|
148
250
|
puts __FILE__ + (__LINE__).to_s + " [click]: link object => #{obj.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
149
251
|
obj.click
|
150
252
|
|
151
|
-
|
253
|
+
if !_region.nil?
|
254
|
+
eyeScount.check_window(_name, _region)
|
255
|
+
else
|
256
|
+
eyeScout.check_window(link_name)
|
257
|
+
end
|
258
|
+
|
152
259
|
end
|
153
260
|
end
|
154
261
|
|