scoutui 2.0.0 → 2.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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/CODE_OF_CONDUCT.md +13 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +154 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/scoutui_driver.rb +22 -0
  12. data/bin/setup +7 -0
  13. data/examples/ex1/commands.holidays.yml +45 -0
  14. data/examples/ex1/commands.yml +25 -0
  15. data/examples/ex1/test-example.sh +38 -0
  16. data/examples/ex1/test.config.json +16 -0
  17. data/examples/ex2/commands.yml +35 -0
  18. data/examples/ex2/page_model.json +28 -0
  19. data/examples/ex2/test-example.sh +39 -0
  20. data/examples/ex2/test.config.json +25 -0
  21. data/lib/scoutui.rb +8 -0
  22. data/lib/scoutui/appmodel/q_model.rb +82 -0
  23. data/lib/scoutui/base/assertions.rb +62 -0
  24. data/lib/scoutui/base/q_accounts.rb +52 -0
  25. data/lib/scoutui/base/q_applitools.rb +127 -0
  26. data/lib/scoutui/base/q_browser.rb +185 -0
  27. data/lib/scoutui/base/q_form.rb +261 -0
  28. data/lib/scoutui/base/test_scout.rb +120 -0
  29. data/lib/scoutui/base/test_settings.rb +109 -0
  30. data/lib/scoutui/base/user_vars.rb +108 -0
  31. data/lib/scoutui/base/visual_test_framework.rb +574 -0
  32. data/lib/scoutui/commands/click_object.rb +45 -0
  33. data/lib/scoutui/commands/command.rb +56 -0
  34. data/lib/scoutui/commands/commands.rb +133 -0
  35. data/lib/scoutui/commands/exists_alert.rb +54 -0
  36. data/lib/scoutui/commands/fill_form.rb +56 -0
  37. data/lib/scoutui/commands/jsalert/action_jsalert.rb +58 -0
  38. data/lib/scoutui/commands/mouse_over.rb +31 -0
  39. data/lib/scoutui/commands/pause.rb +26 -0
  40. data/lib/scoutui/commands/select_object.rb +54 -0
  41. data/lib/scoutui/commands/strategy.rb +202 -0
  42. data/lib/scoutui/commands/submit_form.rb +44 -0
  43. data/lib/scoutui/commands/type.rb +44 -0
  44. data/lib/scoutui/commands/update_url.rb +45 -0
  45. data/lib/scoutui/commands/utils.rb +128 -0
  46. data/lib/scoutui/commands/verify_element.rb +198 -0
  47. data/lib/scoutui/commands/verify_form.rb +26 -0
  48. data/lib/scoutui/eyes/eye_factory.rb +76 -0
  49. data/lib/scoutui/eyes/eye_scout.rb +239 -0
  50. data/lib/scoutui/logger/log_mgr.rb +105 -0
  51. data/lib/scoutui/navigator.rb +24 -0
  52. data/lib/scoutui/utils/utils.rb +352 -0
  53. data/lib/scoutui/version.rb +3 -0
  54. data/scoutui.gemspec +35 -0
  55. metadata +54 -2
  56. data/pkg/scoutui-2.0.0.gem +0 -0
@@ -0,0 +1,261 @@
1
+
2
+ require 'selenium-webdriver'
3
+
4
+
5
+ module Scoutui::Base
6
+
7
+
8
+ class QForm
9
+
10
+ attr_accessor :elements
11
+ attr_accessor :drv
12
+
13
+ def initialize(*p)
14
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " size : #{p.size}"
15
+ @drv=nil
16
+
17
+ if p.size==1 && p[0].is_a?(Hash)
18
+
19
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " Hash was passed"
20
+ @elements = p[0]
21
+ elsif p.size==1 && p[0].is_a?(String)
22
+ # Load form from a JSON file
23
+ elsif p.size==2
24
+ @drv=p[0]
25
+
26
+ @elements = p[1] if p[1].is_a?(Hash)
27
+
28
+ end
29
+
30
+ end
31
+
32
+ def dump()
33
+ Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " QForm.dump()"
34
+ Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " => #{@elements.to_s}"
35
+ end
36
+
37
+ def actionElement(drv, locator)
38
+
39
+ _action=nil
40
+
41
+ obj = Scoutui::Base::QBrowser.getObject(drv, locator)
42
+ _type = obj.attribute('type').to_s
43
+ _tag = obj.tag_name.to_s
44
+
45
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " obj => type:#{_type} tag:#{_tag}"
46
+
47
+ # element.getAttribute("type").equalsIgnoreCase("text")
48
+ if !_type.match(/(password|text|email)/i).nil? && !_tag.match(/(input|textarea)/i).nil?
49
+
50
+ _v = Scoutui::Base::UserVars.instance.get(dut[k].to_s)
51
+
52
+ _action="send_keys"
53
+ obj.send_keys(_v)
54
+ elsif !_type.match(/(date|number|search|tel|time|url|week)/i).nil?
55
+ _v = Scoutui::Base::UserVars.instance.get(dut[k].to_s)
56
+ _action="send_keys"
57
+ obj.send_keys(_v)
58
+ elsif !_type.match(/(button|checkbox|radio|submit)/i).nil?
59
+ _action="click"
60
+ obj.click()
61
+ else
62
+ _action="click"
63
+ obj.click()
64
+ end
65
+
66
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " action : #{_action}"
67
+ _action
68
+
69
+ end
70
+
71
+ def submitForm(drv=nil)
72
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " -- submit(#{drv.class.to_s} --"
73
+
74
+ rc=false
75
+
76
+ if drv.nil?
77
+ drv=@drv
78
+ end
79
+
80
+ action_obj = @elements.select { |key, e| e.is_a?(Hash) && e.has_key?('action_object') && e['action_object']==true }
81
+
82
+ if !action_obj.nil?
83
+ # Find the submit action element
84
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " -- submit => #{action_obj}"
85
+ actionElement(drv, action_obj[action_obj.keys[0]])
86
+ rc=true
87
+ else
88
+ Scoutui::Logger::LogMgr.instance.commands.warn __FILE__ + (__LINE__).to_s + " WARN: missing action object."
89
+ end
90
+
91
+ rc
92
+ end
93
+
94
+
95
+ def verifyForm(drv)
96
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " verifyForm()"
97
+
98
+ _req = Scoutui::Utils::TestUtils.instance.getReq()
99
+
100
+ puts __FILE__ + (__LINE__).to_s + " req => #{_req}"
101
+
102
+ @elements.each do |elt|
103
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " => #{elt.to_s} : #{elt.class.to_s}"
104
+
105
+ if elt.is_a?(Array)
106
+
107
+ n=elt[0]
108
+ v=elt[1]
109
+
110
+ k='visible_when'
111
+ if v.is_a?(Hash) && v.has_key?(k) && v.has_key?('locator')
112
+
113
+
114
+ obj = Scoutui::Base::QBrowser.getObject(drv, v['locator'])
115
+
116
+ if !v[k].match(/always/i).nil?
117
+ _rc = !obj.nil? && obj.is_a?(Selenium::WebDriver::Element) && obj.displayed?
118
+ Scoutui::Logger::LogMgr.instance.asserts.info " Verify element #{n} with locator #{v['locator']} is always visible on form - #{_rc.to_s}"
119
+ Testmgr::TestReport.instance.getReq(_req).tc(k).add(_rc, __FILE__ + (__LINE__).to_s + " Verify element #{n} with locator #{v['locator']} is always visible on form")
120
+ elsif !v[k].match(/([!])*title\((.*)\)/i).nil?
121
+ _hit = v[k].match(/([!])*title\(\/(.*)\/\)/i)
122
+ _not = _hit[1]
123
+ _title = _hit[2]
124
+
125
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " Verify title |#{drv.title}| matches #{_title}"
126
+
127
+ _rc = !drv.title.match(Regexp.new(_title)).nil?
128
+
129
+ if !_not.nil?
130
+ _rc=!_rc
131
+ end
132
+
133
+ Scoutui::Logger::LogMgr.instance.asserts.info " Verify expected title matches #{_not.to_s}#{_title} for form. - #{_rc.to_s}"
134
+ Testmgr::TestReport.instance.getReq(_req).tc(k).add(_rc, __FILE__ + (__LINE__).to_s + " Verify expected title matches #{_not.to_s}#{_title} for form.")
135
+
136
+
137
+ elsif !v[k].match(/\s*(visible)\((.*)\)\=(.*)/).nil?
138
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " ==> #{v[k].to_s}"
139
+ _match=v[k].match(/\s*(visible)\((.*)\)\=(.*)/)
140
+ _cond=_match[1]
141
+ _obj=_match[2]
142
+ _expected_val=_match[3]
143
+
144
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " <cond, obj, when>::<#{_cond}, #{_obj}, #{_expected_val}"
145
+
146
+ depObj = Scoutui::Base::QBrowser.getObject(drv, _obj)
147
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " hit => #{depObj.class.to_s} tag:#{depObj.tag_name}" if !depObj.nil?
148
+
149
+ desc=nil
150
+ if _expected_val.match(/true/i)
151
+ obj = Scoutui::Base::QBrowser.getObject(drv, v['locator'])
152
+
153
+ _rc = !depObj.nil? && depObj.displayed? && !obj.nil? && obj.displayed?
154
+ Scoutui::Logger::LogMgr.instance.asserts.info "Verify #{v['locator']} is displayed since #{_obj} is displayed - #{_rc.to_s}"
155
+ Testmgr::TestReport.instance.getReq(_req).tc(k).add(_rc, "Verify #{v['locator']} is displayed since #{_obj} is displayed")
156
+ elsif _expected_val.match(/false/i)
157
+ obj = Scoutui::Base::QBrowser.getObject(drv, v['locator'])
158
+
159
+ _rc = depObj.nil? && !obj.nil? && obj.displayed?
160
+ Scoutui::Logger::LogMgr.instance.asserts.info "Verify #{v['locator']} is displayed since #{_obj} is not visible. - #{_rc.to_s}"
161
+ Testmgr::TestReport.instance.getReq(_req).tc(k).add(_rc, "Verify #{v['locator']} is displayed since #{_obj} is not visible.")
162
+ end
163
+
164
+ elsif !v[k].match(/value\((.*)\)\=(.*)/).nil?
165
+ _match=v[k].match(/value\((.*)\)\=(.*)/)
166
+ _obj=_match[1]
167
+ _expected_val=_match[2]
168
+
169
+ obj = Scoutui::Base::QBrowser.getObject(drv, _obj)
170
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " hit => #{obj.class.to_s} tag:#{obj.tag_name}"
171
+
172
+
173
+
174
+ if !obj.nil? && obj.is_a?(Selenium::WebDriver::Element) && obj.tag_name=='select'
175
+
176
+ _options=Selenium::WebDriver::Support::Select.new(obj)
177
+ _val = _options.first_selected_option.text
178
+
179
+ Testmgr::TestReport.instance.getReq(_req).tc(k).add(!_val.match(/#{_expected_val}/).nil?, __FILE__ + (__LINE__).to_s + " Verify obj #{n} displayed when #{v.to_s}")
180
+
181
+ if false
182
+
183
+ _options=obj.find_elements(:tag_name=>"option")
184
+
185
+ _options.each do |_o|
186
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " | value : #{_o.attribute('value').to_s}"
187
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " | text : #{_o.text.to_s}"
188
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " | displayed : #{_o.displayed?}"
189
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " | enabled : #{_o.enabled?}"
190
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " | location : #{_o.location}"
191
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " | selected :#{_o.selected?}"
192
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " | methods:#{_o.methods.sort.to_s}" # ", #{_o.text.to_s}, selected: #{_o.to_s}"
193
+ # Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " PAUSE"; gets()
194
+ end
195
+ end
196
+
197
+ end
198
+ end
199
+
200
+
201
+ end
202
+
203
+
204
+ end
205
+ end
206
+ end
207
+
208
+ def fillForm(drv, dut)
209
+
210
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " fillForm(#{drv.to_s}, #{dut.to_s})"
211
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " | type => #{dut.class.to_s}"
212
+
213
+ if dut.is_a?(Hash)
214
+
215
+ dut.keys.each do |k|
216
+ if @elements.has_key?(k)
217
+ _xpath = @elements[k] # .to_s
218
+
219
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " key(#{k}) : locator:#{_xpath} => #{dut[k].to_s}"
220
+
221
+ if !drv.nil?
222
+ @drv=drv
223
+ obj = Scoutui::Base::QBrowser.getObject(drv, _xpath)
224
+
225
+ _type = obj.attribute('type').to_s
226
+ _tag = obj.tag_name.to_s
227
+
228
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " obj => type:#{_type} tag:#{_tag}"
229
+
230
+ # element.getAttribute("type").equalsIgnoreCase("text")
231
+ if !_type.match(/(password|text|email)/i).nil? && !_tag.match(/(input|textarea)/i).nil?
232
+ _v = Scoutui::Base::UserVars.instance.get(dut[k].to_s)
233
+ obj.send_keys(_v)
234
+
235
+ elsif _type.match(/(select)/i)
236
+ _v = Scoutui::Base::UserVars.instance.get(dut[k].to_s)
237
+ _opt = Selenium::WebDriver::Support::Select.new(obj)
238
+ _opt.select_by(:text, Scoutui::Base::UserVars.instance.get(_v))
239
+ else
240
+ Scoutui::Logger::LogMgr.instance.commands.warn " Unidentified attribute type : #{_type.to_s}"
241
+ end
242
+ end
243
+
244
+ else
245
+ Scoutui::Logger::LogMgr.instance.commands.debug __FILE__ + (__LINE__).to_s + " ** key #{k} not part of form **"
246
+ end
247
+
248
+ end
249
+
250
+ end
251
+
252
+
253
+ self
254
+
255
+ end
256
+
257
+
258
+
259
+ end
260
+
261
+ end
@@ -0,0 +1,120 @@
1
+
2
+
3
+ module Scoutui::Base
4
+
5
+
6
+ class TestScout
7
+ attr_reader :context
8
+ attr_reader :test_settings # { host, dut }
9
+ attr_reader :userRecord
10
+ attr_reader :eyesRecord # {'title' , 'app'}
11
+ attr_reader :eyeScout
12
+ attr_reader :results
13
+
14
+ def initialize(_context)
15
+ @result = nil
16
+ @test_settings=nil
17
+ @eyesRecord=nil
18
+
19
+ if Scoutui::Utils::TestUtils.instance.hasTestConfig?
20
+
21
+ Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " * test config json => " + Scoutui::Utils::TestUtils.instance.testConfigFile() if Scoutui::Utils::TestUtils.instance.isDebug?
22
+
23
+ @test_settings=Scoutui::Utils::TestUtils.instance.getTestSettings()
24
+
25
+ @eyesRecord = @test_settings['eyes']
26
+ end
27
+
28
+ end
29
+
30
+
31
+ def start
32
+ if hasSettings?
33
+ dumpSettings if Scoutui::Utils::TestUtils.instance.isDebug?
34
+ run()
35
+ end
36
+ end
37
+
38
+ def stop
39
+ # TBD
40
+ end
41
+
42
+ def report
43
+ @eyeScout.generateReport()
44
+ end
45
+
46
+ def hasSettings?
47
+ Scoutui::Utils::TestUtils.instance.hasTestConfig?
48
+ end
49
+
50
+ def dumpSettings()
51
+ Scoutui::Logger::LogMgr.instance.debug '-' * 72
52
+ Scoutui::Logger::LogMgr.instance.debug @test_settings
53
+
54
+ Scoutui::Logger::LogMgr.instance.debug "UserRecord => #{@userRecord}"
55
+ Scoutui::Logger::LogMgr.instance.debug "Eyes Record => #{@eyesRecord}"
56
+ Scoutui::Logger::LogMgr.instance.debug "Host => #{@test_settings['host']}"
57
+ end
58
+
59
+ def teardown()
60
+ @eyeScout.teardown()
61
+ end
62
+
63
+ def setup()
64
+
65
+ if Scoutui::Utils::TestUtils.instance.isDebug?
66
+ Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " eyes cfg => #{@eyesRecord}"
67
+ Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " title => " + Scoutui::Base::UserVars.instance.getVar('eyes.title')
68
+ Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " app => " + Scoutui::Base::UserVars.instance.getVar('eyes.app')
69
+ end
70
+
71
+ begin
72
+
73
+ eyeScout=Scoutui::Eyes::EyeFactory.instance.createScout()
74
+ rescue => ex
75
+ Scoutui::Logger::LogMgr.instance.debug ex.backtrace
76
+ end
77
+
78
+ eyeScout
79
+ end
80
+
81
+
82
+ def snapPage(tag)
83
+ @eyeScout.check_window(tag)
84
+ end
85
+
86
+
87
+ def run()
88
+ Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " run()" if Scoutui::Utils::TestUtils.instance.isDebug?
89
+
90
+ begin
91
+
92
+ @eyeScout = setup() # Browser is created
93
+
94
+ # Navigate to the specified host
95
+ @eyeScout.navigate(Scoutui::Base::UserVars.instance.get(:host))
96
+
97
+ # snapPage('Landing Page')
98
+
99
+ Scoutui::Base::VisualTestFramework.processFile(@eyeScout, @test_settings)
100
+
101
+ teardown()
102
+
103
+ rescue => ex
104
+ Scoutui::Logger::LogMgr.instance.debug ex.backtrace
105
+ ensure
106
+ Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__ ).to_s + " Close Eyes" if Scoutui::Utils::TestUtils.instance.isDebug?
107
+ @eyeScout.closeOut()
108
+
109
+
110
+
111
+ end
112
+
113
+ end
114
+
115
+
116
+
117
+ end
118
+
119
+
120
+ end
@@ -0,0 +1,109 @@
1
+ require 'json'
2
+
3
+ module Scoutui::Base
4
+
5
+
6
+ class TestSettings
7
+
8
+ attr_accessor :bEyes
9
+ attr_accessor :browserType
10
+ attr_accessor :eut
11
+ attr_accessor :user
12
+ attr_accessor :eyesReport
13
+ attr_accessor :url
14
+
15
+
16
+ def initialize(opts)
17
+ @bEyes=false
18
+ @browserType=opts[:but] || :firefox
19
+ @eut=opts[:eut] || :qa
20
+ @lang=opts[:lang] || "en-us"
21
+ @user=opts[:user] || nil
22
+ @eyesReport=opts[:eyesReport] || nil
23
+ @url=opts[:url]||nil
24
+
25
+ end
26
+
27
+ def setConfig(c)
28
+ if c.instance_of?(Hash)
29
+ @testConfig=c
30
+ else
31
+ # a JSON file was passed (ERROR handling needed)
32
+ jFile = File.read(c)
33
+ @testConfig=JSON.parse(jFile)
34
+ end
35
+
36
+ @testConfig
37
+ end
38
+
39
+
40
+ def getScout()
41
+ @testConfig["dut"]
42
+ end
43
+
44
+ def setLang(lang)
45
+ @lang=lang
46
+ end
47
+
48
+ def getUrl()
49
+ @url
50
+ end
51
+
52
+ def url
53
+ getUrl()
54
+ end
55
+
56
+ def setUrl(u)
57
+ @url=u
58
+ end
59
+
60
+ def getEyesReport()
61
+ @eyesReport
62
+ end
63
+
64
+ def getLanguage()
65
+ getLang()
66
+ end
67
+
68
+ def getUser()
69
+ @user
70
+ end
71
+
72
+ def getLang()
73
+ @lang
74
+ end
75
+
76
+ def getBUT()
77
+ @browserType
78
+ end
79
+
80
+ def setEUT(e)
81
+ @eut=e
82
+ end
83
+
84
+ def getEUT()
85
+ @eut
86
+ end
87
+
88
+ def browserType()
89
+ @browserType
90
+ end
91
+
92
+ def enableEyes(b=true)
93
+ @bEyes=b
94
+ end
95
+
96
+ def disableEyes()
97
+ @bEyes=false
98
+ end
99
+
100
+ def isEyes?
101
+ @bEyes
102
+ end
103
+
104
+ end
105
+
106
+
107
+ end
108
+
109
+