scoutui 0.1.0 → 0.1.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 +4 -4
- data/lib/scoutui/base/app_model.rb +31 -0
- data/lib/scoutui/base/q_accounts.rb +48 -0
- data/lib/scoutui/base/q_applitools.rb +125 -0
- data/lib/scoutui/base/q_browser.rb +52 -0
- data/lib/scoutui/base/test_runner.rb +123 -0
- data/lib/scoutui/base/test_settings.rb +119 -0
- data/lib/scoutui/base/user_vars.rb +56 -0
- data/lib/scoutui/base/visual_test_framework.rb +165 -0
- data/lib/scoutui/navigator.rb +23 -0
- data/lib/scoutui/utils/utils.rb +160 -0
- data/lib/scoutui/version.rb +1 -1
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 938077e990f3023a4aa9e4dafd7e8ae5bbc3dd3d
|
4
|
+
data.tar.gz: a5e065f72639d6f9776a82e821dfd9417868ea1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0e95dc05d1f4544bdd6b50ef04e7d98c86edfe9e9ddf24e6e954a6613ceffe7a744bba48bfefbe8de49e95da93ba1de720275a89adec347612a690318090907
|
7
|
+
data.tar.gz: 765e55a3126b0782041d23fe47ea2d9e3708388f64f2b0c633f177c0a530d5d640d8d18d37d5f23989168013183eed7fc73cbb322effb47e5b89bc000699703e
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
#require 'selenium-webdriver'
|
3
|
+
|
4
|
+
module Scoutui::Base
|
5
|
+
|
6
|
+
class AppModel
|
7
|
+
|
8
|
+
attr_accessor :drv
|
9
|
+
attr_accessor :pages
|
10
|
+
|
11
|
+
def initialize()
|
12
|
+
@drv=nil
|
13
|
+
@pages={}
|
14
|
+
end
|
15
|
+
|
16
|
+
def getPage(n)
|
17
|
+
@pages[n]
|
18
|
+
end
|
19
|
+
|
20
|
+
def addPage(n, p)
|
21
|
+
@pages[n]=p
|
22
|
+
end
|
23
|
+
|
24
|
+
def setup()
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
module Scoutui::Base
|
3
|
+
|
4
|
+
class QAccounts
|
5
|
+
|
6
|
+
|
7
|
+
attr_accessor :dut
|
8
|
+
attr_accessor :accounts
|
9
|
+
|
10
|
+
def initialize(f='/Users/pkim/working/nui-qa/apps/gat/data/accounts.yaml')
|
11
|
+
@accounts = YAML.load_stream File.read(f)
|
12
|
+
end
|
13
|
+
|
14
|
+
def _find(id, attr)
|
15
|
+
hit = accounts.find { |h| h['account']['loginid'] == id }
|
16
|
+
if !hit.nil?
|
17
|
+
id=hit['account'][attr]
|
18
|
+
end
|
19
|
+
id
|
20
|
+
end
|
21
|
+
|
22
|
+
def getUserRecord(u)
|
23
|
+
hit=nil
|
24
|
+
|
25
|
+
userid=getUserId(u)
|
26
|
+
if !userid.nil?
|
27
|
+
hit={'userid' => getUserId(u), 'password' => getPassword(u) }
|
28
|
+
end
|
29
|
+
|
30
|
+
hit
|
31
|
+
end
|
32
|
+
|
33
|
+
def getUserId(userid)
|
34
|
+
id=nil
|
35
|
+
hit = accounts.find { |h| h['account']['loginid'].to_s == userid.to_s }
|
36
|
+
if !hit.nil?
|
37
|
+
id=hit['account']['loginid']
|
38
|
+
end
|
39
|
+
id
|
40
|
+
end
|
41
|
+
|
42
|
+
def getPassword(u)
|
43
|
+
_find(u, 'password')
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'eyes_selenium'
|
3
|
+
require 'httparty'
|
4
|
+
|
5
|
+
|
6
|
+
module Scoutui::Base
|
7
|
+
|
8
|
+
class QApplitools
|
9
|
+
|
10
|
+
|
11
|
+
attr_accessor :eyes
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@eyes=nil
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def setup
|
19
|
+
@eyes = Applitools::Eyes.new
|
20
|
+
# This is your api key, make sure you use it in all your tests.
|
21
|
+
@eyes.api_key = "API_KEY"
|
22
|
+
|
23
|
+
# Get a selenium web driver object.
|
24
|
+
@driver = Selenium::WebDriver.for :chrome
|
25
|
+
#Eyes.log_handler = Logger.new(STDOUT)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Called after every test method runs. Can be used to tear
|
29
|
+
# down fixtures information.
|
30
|
+
|
31
|
+
def teardown
|
32
|
+
@eyes.abort_if_not_closed
|
33
|
+
end
|
34
|
+
|
35
|
+
def report(results)
|
36
|
+
download_diffs(results, "VIEW_KEY", '/tmp/diff_images')
|
37
|
+
end
|
38
|
+
|
39
|
+
# Fake test
|
40
|
+
def xxxtestit
|
41
|
+
#@eyes.baseline_name='my_test_name'
|
42
|
+
wrapped_driver = @eyes.open(
|
43
|
+
app_name: 'Applitools website',
|
44
|
+
test_name: 'Example test',
|
45
|
+
viewport_size: {width: 900, height: 650},
|
46
|
+
driver: @driver)
|
47
|
+
wrapped_driver.get 'https://www.applitools.com'
|
48
|
+
# Visual validation point #1
|
49
|
+
@eyes.check_window('Main Page')
|
50
|
+
|
51
|
+
wrapped_driver.find_element(:css, ".features>a").click
|
52
|
+
# Visual validation point #2
|
53
|
+
@eyes.check_window('Features Page')
|
54
|
+
results = @eyes.close(false)
|
55
|
+
|
56
|
+
download_diffs(results, "VIEW_KEY", './diff_images')
|
57
|
+
print_results(results, "VIEW_KEY")
|
58
|
+
end
|
59
|
+
|
60
|
+
def print_results(results, view_key)
|
61
|
+
if results.is_passed
|
62
|
+
print "Your test was passed!\n"
|
63
|
+
elsif results.is_new
|
64
|
+
print "Created new baseline, this is a new test or/and new configuration!"
|
65
|
+
else
|
66
|
+
print "Your test was failed!\n"
|
67
|
+
print "#{results.mismatches} out of #{results.steps} steps failed \n"
|
68
|
+
print "Here are the failed steps:\n"
|
69
|
+
session_id = get_session_id(results.url)
|
70
|
+
diff_urls = get_diff_urls(session_id, view_key)
|
71
|
+
diff_urls.each do |index, diff_url|
|
72
|
+
print "Step #{index} --> #{diff_url} \n"
|
73
|
+
end
|
74
|
+
print "For more details please go to #{results.url} to review the differences! \n"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def download_diffs(results, view_key, destination)
|
79
|
+
session_id = get_session_id(results.url)
|
80
|
+
diff_urls = get_diff_urls(session_id, view_key)
|
81
|
+
download_images(diff_urls, destination)
|
82
|
+
end
|
83
|
+
|
84
|
+
def download_images(diff_urls, destination)
|
85
|
+
diff_urls.each do |index, url|
|
86
|
+
File.open("#{destination}/step_#{index}_diff.png", 'wb') do |file|
|
87
|
+
file.write HTTParty.get(url)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_diff_urls(session_id, view_key)
|
93
|
+
info = "https://eyes.applitools.com/api/sessions/#{session_id}/?ApiKey=#{view_key}&format=json"
|
94
|
+
diff_template = "https://eyes.applitools.com/api/sessions/#{session_id}/steps/%s/diff?ApiKey=#{view_key}"
|
95
|
+
diff_urls = Hash.new
|
96
|
+
|
97
|
+
puts __FILE__ + (__LINE__).to_s + " info => #{info}"
|
98
|
+
response = HTTParty.get(info)
|
99
|
+
|
100
|
+
begin
|
101
|
+
data = JSON.parse(response.body)
|
102
|
+
index = 1
|
103
|
+
data['actualOutput'].each do |elem|
|
104
|
+
if (elem['isMatching'] == false)
|
105
|
+
diff_urls[index] = diff_template % [index]
|
106
|
+
index+=1
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
diff_urls
|
111
|
+
|
112
|
+
rescue JSON::ParserError
|
113
|
+
;
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
def get_session_id(url)
|
119
|
+
/sessions\/(?<session>\d+)/.match(url)[1]
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'eyes_selenium'
|
3
|
+
require 'selenium-webdriver'
|
4
|
+
|
5
|
+
|
6
|
+
module Scoutui::Base
|
7
|
+
|
8
|
+
|
9
|
+
class QBrowser
|
10
|
+
|
11
|
+
attr_accessor :driver
|
12
|
+
|
13
|
+
def initialize()
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.wait_for_exist(drv, xpath, _timeout=30)
|
17
|
+
puts __FILE__ + (__LINE__).to_s + " wait_for_exist(#{xpath}"
|
18
|
+
rc=nil
|
19
|
+
begin
|
20
|
+
Selenium::WebDriver::Wait.new(timeout: _timeout).until { drv.find_element(:xpath => xpath) }
|
21
|
+
rc=drv.find_element(:xpath => xpath)
|
22
|
+
rescue => ex
|
23
|
+
;
|
24
|
+
end
|
25
|
+
rc
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.getObject(drv, xpath, _timeout=30)
|
29
|
+
rc=nil
|
30
|
+
begin
|
31
|
+
Selenium::WebDriver::Wait.new(timeout: _timeout).until { drv.find_element(:xpath => xpath).displayed? }
|
32
|
+
rc=drv.find_element(:xpath => xpath)
|
33
|
+
rescue => ex
|
34
|
+
;
|
35
|
+
end
|
36
|
+
rc
|
37
|
+
end
|
38
|
+
|
39
|
+
def wait_for(seconds)
|
40
|
+
Selenium::WebDriver::Wait.new(timeout: seconds).until { yield }
|
41
|
+
end
|
42
|
+
|
43
|
+
def driver
|
44
|
+
@driver
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Scoutui::Base
|
4
|
+
|
5
|
+
|
6
|
+
class TestRunner
|
7
|
+
attr_reader :drv # Selenium Webdriver
|
8
|
+
attr_reader :eyes # Applitools::Eyes
|
9
|
+
attr_reader :driver # Applitools::Eyes Driver
|
10
|
+
attr_reader :context
|
11
|
+
attr_reader :test_settings # { host, localization, dut }
|
12
|
+
attr_reader :userRecord
|
13
|
+
attr_reader :eyesRecord # {'title' , 'app'}
|
14
|
+
|
15
|
+
def initialize(_context)
|
16
|
+
|
17
|
+
@test_settings=nil
|
18
|
+
@eyesRecord=nil
|
19
|
+
|
20
|
+
if Scoutui::Utils::TestUtils.instance.hasTestConfig?
|
21
|
+
|
22
|
+
puts __FILE__ + (__LINE__).to_s + " * test config json => " + Scoutui::Utils::TestUtils.instance.testConfigFile() if Scoutui::Utils::TestUtils.instance.isDebug?
|
23
|
+
|
24
|
+
@test_settings=Scoutui::Utils::TestUtils.instance.getTestSettings()
|
25
|
+
|
26
|
+
accounts = Scoutui::Base::QAccounts.new()
|
27
|
+
@userRecord = accounts.getUserRecord(@test_settings['user'])
|
28
|
+
|
29
|
+
@eyesRecord = @test_settings['eyes']
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
def hasSettings?
|
38
|
+
Scoutui::Utils::TestUtils.instance.hasTestConfig?
|
39
|
+
end
|
40
|
+
|
41
|
+
def dumpSettings()
|
42
|
+
puts __FILE__ + (__LINE__).to_s + " dumpSettings()"
|
43
|
+
puts '-' * 72
|
44
|
+
puts @test_settings
|
45
|
+
|
46
|
+
puts "UserRecord => #{@userRecord}"
|
47
|
+
puts "Eyes Record => #{@eyesRecord}"
|
48
|
+
puts "Host => #{@test_settings['host']}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def teardown()
|
52
|
+
@drv.quit()
|
53
|
+
end
|
54
|
+
|
55
|
+
def setup()
|
56
|
+
browserType = Scoutui::Utils::TestUtils.instance.getBrowserType()
|
57
|
+
puts __FILE__ + (__LINE__).to_s + " setup() : #{browserType}"
|
58
|
+
|
59
|
+
begin
|
60
|
+
@drv=Selenium::WebDriver.for browserType.to_sym
|
61
|
+
@eyes=Scoutui::Eyes::EyeFactory.instance.create(true)
|
62
|
+
puts __FILE__ + (__LINE__).to_s + " eyes => #{eyes}"
|
63
|
+
|
64
|
+
@driver = @eyes.open(
|
65
|
+
app_name: @eyesRecord['app'],
|
66
|
+
test_name: @eyesRecord['title'],
|
67
|
+
viewport_size: {width: 1024, height: 768},
|
68
|
+
# viewport_size: {width: 800, height: 600},
|
69
|
+
driver: @drv)
|
70
|
+
|
71
|
+
rescue => ex
|
72
|
+
puts ex.backtrace
|
73
|
+
end
|
74
|
+
@drv
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
def goto(url)
|
80
|
+
@drv.navigate().to(url)
|
81
|
+
end
|
82
|
+
|
83
|
+
def snapPage(tag)
|
84
|
+
@eyes.check_window(tag) if Scoutui::Utils::TestUtils.instance.eyesEnabled?
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
def run()
|
89
|
+
puts __FILE__ + (__LINE__).to_s + " run()" if Scoutui::Utils::TestUtils.instance.isDebug?
|
90
|
+
|
91
|
+
my_driver=nil
|
92
|
+
|
93
|
+
begin
|
94
|
+
|
95
|
+
app = Scoutui::Base::AppModel.new()
|
96
|
+
|
97
|
+
setup() # Browser is created
|
98
|
+
|
99
|
+
# Navigate to the specified host
|
100
|
+
goto(Scoutui::Base::UserVars.instance.get(:host))
|
101
|
+
|
102
|
+
snapPage('Landing Page')
|
103
|
+
|
104
|
+
Scoutui::Base::VisualTestFramework.processFile(@drv, @eyes, @test_settings)
|
105
|
+
|
106
|
+
teardown()
|
107
|
+
|
108
|
+
rescue => ex
|
109
|
+
puts ex.backtrace
|
110
|
+
ensure
|
111
|
+
puts __FILE__ + (__LINE__ ).to_s + " Close Eyes"
|
112
|
+
eyes.close(false)
|
113
|
+
eyes.abort_if_not_closed if !eyes.nil?
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
end
|
@@ -0,0 +1,119 @@
|
|
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
|
+
attr_accessor :localization
|
15
|
+
|
16
|
+
|
17
|
+
def initialize(opts)
|
18
|
+
@bEyes=false
|
19
|
+
@browserType=opts[:but] || :firefox
|
20
|
+
@eut=opts[:eut] || :qa
|
21
|
+
@lang=opts[:lang] || "en-us"
|
22
|
+
@user=opts[:user] || nil
|
23
|
+
@eyesReport=opts[:eyesReport] || nil
|
24
|
+
@url=opts[:url]||nil
|
25
|
+
|
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
|
+
end
|
30
|
+
|
31
|
+
def setConfig(c)
|
32
|
+
if c.instance_of?(Hash)
|
33
|
+
@testConfig=c
|
34
|
+
else
|
35
|
+
# a JSON file was passed
|
36
|
+
jFile = File.read(c)
|
37
|
+
@testConfig=JSON.parse(jFile)
|
38
|
+
end
|
39
|
+
|
40
|
+
@testConfig
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def getScout()
|
45
|
+
@testConfig["dut"]
|
46
|
+
end
|
47
|
+
|
48
|
+
def setLang(lang)
|
49
|
+
@lang=lang
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def getLocalization()
|
54
|
+
# @testConfig["language-mapping"][@lang]
|
55
|
+
@localizationObj["language-mapping"][@lang]
|
56
|
+
end
|
57
|
+
|
58
|
+
def getUrl()
|
59
|
+
@url
|
60
|
+
end
|
61
|
+
|
62
|
+
def url
|
63
|
+
getUrl()
|
64
|
+
end
|
65
|
+
|
66
|
+
def setUrl(u)
|
67
|
+
@url=u
|
68
|
+
end
|
69
|
+
|
70
|
+
def getEyesReport()
|
71
|
+
@eyesReport
|
72
|
+
end
|
73
|
+
|
74
|
+
def getLanguage()
|
75
|
+
getLang()
|
76
|
+
end
|
77
|
+
|
78
|
+
def getUser()
|
79
|
+
@user
|
80
|
+
end
|
81
|
+
|
82
|
+
def getLang()
|
83
|
+
@lang
|
84
|
+
end
|
85
|
+
|
86
|
+
def getBUT()
|
87
|
+
@browserType
|
88
|
+
end
|
89
|
+
|
90
|
+
def setEUT(e)
|
91
|
+
@eut=e
|
92
|
+
end
|
93
|
+
|
94
|
+
def getEUT()
|
95
|
+
@eut
|
96
|
+
end
|
97
|
+
|
98
|
+
def browserType()
|
99
|
+
@browserType
|
100
|
+
end
|
101
|
+
|
102
|
+
def enableEyes(b=true)
|
103
|
+
@bEyes=b
|
104
|
+
end
|
105
|
+
|
106
|
+
def disableEyes()
|
107
|
+
@bEyes=false
|
108
|
+
end
|
109
|
+
|
110
|
+
def isEyes?
|
111
|
+
@bEyes
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'singleton'
|
3
|
+
|
4
|
+
module Scoutui::Base
|
5
|
+
|
6
|
+
class UserVars
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
attr_accessor :globals
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@globals={
|
13
|
+
:userid => nil,
|
14
|
+
:password => nil,
|
15
|
+
:host => nil,
|
16
|
+
:localization => 'en-us'
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def getHost()
|
21
|
+
@globals[:host].to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def get(k)
|
25
|
+
v=k
|
26
|
+
|
27
|
+
if k=='${userid}'
|
28
|
+
k=:userid
|
29
|
+
elsif k=='${password}'
|
30
|
+
k=:password
|
31
|
+
elsif k=='${host}'
|
32
|
+
k=:host
|
33
|
+
end
|
34
|
+
|
35
|
+
if @globals.has_key?(k)
|
36
|
+
v=@globals[k]
|
37
|
+
end
|
38
|
+
v
|
39
|
+
end
|
40
|
+
|
41
|
+
def set(k, v)
|
42
|
+
setVar(k, v)
|
43
|
+
v
|
44
|
+
end
|
45
|
+
|
46
|
+
def setVar(k, v)
|
47
|
+
@globals[k]=v
|
48
|
+
v
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
##
|
4
|
+
# 1. q_applitools
|
5
|
+
# 2. q_accounts
|
6
|
+
|
7
|
+
module Scoutui::Base
|
8
|
+
|
9
|
+
class VisualTestFramework
|
10
|
+
|
11
|
+
def initialize()
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def self.processExpected(my_driver, e)
|
17
|
+
puts "\to Expected: #{e['page']['expected'].class.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
18
|
+
|
19
|
+
if e['page'].has_key?('expected')
|
20
|
+
expected_list=e['page']['expected']
|
21
|
+
|
22
|
+
expected_list.each_pair do |link_name, xpath|
|
23
|
+
puts "\t\t#{link_name} => #{xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
24
|
+
|
25
|
+
obj = Scoutui::Base::QBrowser.getObject(my_driver, xpath)
|
26
|
+
|
27
|
+
if obj.nil?
|
28
|
+
puts " NOT FOUND : #{link_name} with xpath #{xpath}"
|
29
|
+
else
|
30
|
+
puts " link object(#{link_name} with xpath #{xpath}=> #{obj.displayed?}"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def self.processCommand(_action, e, my_driver)
|
39
|
+
puts __FILE__ + (__LINE__).to_s + " Process ACTION : #{_action}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
40
|
+
|
41
|
+
if !_action.match(/type\(/).nil?
|
42
|
+
_xpath = _action.match(/type\((.*),\s*/)[1].to_s
|
43
|
+
_val = _action.match(/type\(.*,\s*(.*)\)/)[1].to_s
|
44
|
+
|
45
|
+
puts __FILE__ + (__LINE__).to_s + "Process TYPE #{_val} into #{_xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
46
|
+
|
47
|
+
obj = Scoutui::Base::QBrowser.getObject(my_driver, _xpath)
|
48
|
+
if !obj.nil? && !obj.attribute('type').downcase.match(/(text|password)/).nil?
|
49
|
+
obj.send_keys(Scoutui::Base::UserVars.instance.get(_val))
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
if !_action.match(/click\(/).nil?
|
55
|
+
_xpath = _action.match(/click\s*\((.*)\)/)[1].to_s.strip
|
56
|
+
puts __FILE__ + (__LINE__).to_s + " click => #{_xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
57
|
+
obj = Scoutui::Base::QBrowser.getObject(my_driver, _xpath)
|
58
|
+
obj.click
|
59
|
+
|
60
|
+
processExpected(my_driver, e)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
# Scoutui::Base::VisualTestFramework.processFile(@drv, @eyes, @test_settings['host'], @test_settings['dut'])
|
67
|
+
def self.processFile(my_driver, eyes, test_settings)
|
68
|
+
|
69
|
+
baseUrl = Scoutui::Base::UserVars.instance.getHost()
|
70
|
+
datafile = test_settings['dut']
|
71
|
+
|
72
|
+
puts __FILE__ + (__LINE__).to_s + " processFile(#{my_driver}, #{eyes}, #{baseUrl}, #{datafile})" if Scoutui::Utils::TestUtils.instance.isDebug?
|
73
|
+
|
74
|
+
i=0
|
75
|
+
dut_dupes = YAML.load_stream File.read(datafile)
|
76
|
+
dut_dupes.each do |e|
|
77
|
+
puts '-' * 72 if Scoutui::Utils::TestUtils.instance.isDebug?
|
78
|
+
puts "#{i.to_s}. Processing #{e.inspect}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
79
|
+
i+=1
|
80
|
+
|
81
|
+
_action = e["page"]["action"]
|
82
|
+
_name = e["page"]["name"]
|
83
|
+
_url = e["page"]["url"]
|
84
|
+
_skip = e["page"]["skip"]
|
85
|
+
|
86
|
+
if Scoutui::Utils::TestUtils.instance.isDebug?
|
87
|
+
puts __FILE__ + (__LINE__).to_s + " action: #{_action}"
|
88
|
+
puts __FILE__ + (__LINE__).to_s + " name: #{_name}"
|
89
|
+
puts __FILE__ + (__LINE__).to_s + " url : #{_url}"
|
90
|
+
puts __FILE__ + (__LINE__).to_s + " skip: #{_skip}"
|
91
|
+
end
|
92
|
+
|
93
|
+
skipIt = (!_skip.nil?) && (_skip.to_s.strip.downcase=='true')
|
94
|
+
puts "\to skip : #{skipIt}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
95
|
+
|
96
|
+
if skipIt
|
97
|
+
puts __FILE__ + (__LINE__).to_s + " SKIP - #{_name}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
98
|
+
next
|
99
|
+
end
|
100
|
+
|
101
|
+
if !(_action.nil? || _action.empty?)
|
102
|
+
processCommand(_action, e, my_driver)
|
103
|
+
next
|
104
|
+
end
|
105
|
+
|
106
|
+
_relativeUrl = _url.strip.start_with?('/')
|
107
|
+
|
108
|
+
url = e["page"]["url"].to_s
|
109
|
+
|
110
|
+
if _relativeUrl
|
111
|
+
puts __FILE__ + (__LINE__).to_s + " [relative url]: #{baseUrl} with #{url}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
112
|
+
url = baseUrl + url
|
113
|
+
end
|
114
|
+
|
115
|
+
name = e["page"]["name"].to_s
|
116
|
+
my_driver.navigate().to(url)
|
117
|
+
|
118
|
+
|
119
|
+
puts "\to Expected: #{e['page']['expected'].class.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
120
|
+
|
121
|
+
if e['page'].has_key?('expected')
|
122
|
+
expected_list=e['page']['expected']
|
123
|
+
|
124
|
+
expected_list.each_pair do |link_name, xpath|
|
125
|
+
puts "\t\t#{link_name} => #{xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
126
|
+
|
127
|
+
obj = Scoutui::Base::QBrowser.getObject(my_driver, xpath)
|
128
|
+
|
129
|
+
if obj.nil?
|
130
|
+
puts __FILE__ + (__LINE__).to_s + " NOT FOUND : #{link_name} with xpath #{xpath}"
|
131
|
+
else
|
132
|
+
puts __FILE__ + (__LINE__).to_s + " link object(#{link_name} with xpath #{xpath}=> #{obj.displayed?}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
eyes.check_window(name) if Scoutui::Utils::TestUtils.instance.eyesEnabled?
|
139
|
+
|
140
|
+
puts "\to links : #{e['page']['links'].class.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
141
|
+
|
142
|
+
if e['page'].has_key?('links')
|
143
|
+
links=e['page']['links']
|
144
|
+
|
145
|
+
links.each_pair do |link_name, xpath|
|
146
|
+
puts "\t\t#{link_name} => #{xpath}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
147
|
+
|
148
|
+
|
149
|
+
obj = QBrowser.getObject(my_driver, xpath)
|
150
|
+
puts __FILE__ + (__LINE__).to_s + " [click]: link object => #{obj.to_s}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
151
|
+
obj.click
|
152
|
+
|
153
|
+
eyes.check_window(link_name) if Scoutui::Utils::TestUtils.instance.eyesEnabled?
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'version'
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
class Scoutui::Navigator
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
attr_reader :test_options
|
9
|
+
|
10
|
+
attr_reader :app_name
|
11
|
+
attr_reader :test_name
|
12
|
+
attr_reader :viewport_size
|
13
|
+
attr_reader :driver
|
14
|
+
|
15
|
+
def initialize(opts={})
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'singleton'
|
3
|
+
require 'pp'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
|
7
|
+
module Scoutui::Utils
|
8
|
+
|
9
|
+
|
10
|
+
class TestUtils
|
11
|
+
include Singleton
|
12
|
+
|
13
|
+
attr_accessor :options
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
|
17
|
+
@options={}
|
18
|
+
|
19
|
+
[:test_file, :host, :loc, :title, :browser, :userid, :password, :json_config_file, :test_config, :debug].each do |o|
|
20
|
+
o=nil
|
21
|
+
end
|
22
|
+
|
23
|
+
@options[:enable_eyes]=true
|
24
|
+
end
|
25
|
+
|
26
|
+
def parseCommandLine()
|
27
|
+
@options = {}
|
28
|
+
OptionParser.new do |opt|
|
29
|
+
opt.on('-f', '--file TESTFILE') { |o|
|
30
|
+
if !o.nil?
|
31
|
+
@options[:json_config_file]=o
|
32
|
+
|
33
|
+
jFile = File.read(@options[:json_config_file])
|
34
|
+
@options[:test_config]=jsonData=JSON.parse(jFile)
|
35
|
+
end
|
36
|
+
}
|
37
|
+
opt.on('-d', '--debug Bool') { |o| @options[:debug] = (o.to_s.downcase=='true')}
|
38
|
+
opt.on('-h', '--host HOST') { |o| @options[:host] = o }
|
39
|
+
opt.on('-l', '--lang LOCAL') { |o| @options[:loc] = o }
|
40
|
+
opt.on('-t', '--title TITLE') { |o| @options[:title] = o }
|
41
|
+
opt.on('-b', '--browser BROWSER') { |o| @options[:browser] = o }
|
42
|
+
opt.on('-u', '--user USER_ID') { |o|
|
43
|
+
@options[:userid] = o
|
44
|
+
Scoutui::Base::UserVars.instance.setVar(:user, @options[:userid].to_s)
|
45
|
+
}
|
46
|
+
opt.on('-p', '--password PASSWORD') { |o| @options[:password] = o }
|
47
|
+
opt.on('-e', '--eyes Boolean') { |o|
|
48
|
+
if !o.nil?
|
49
|
+
if !o.match(/true|1/i).nil?
|
50
|
+
@options[:enable_eyes]=true
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
}
|
56
|
+
end.parse!
|
57
|
+
|
58
|
+
puts __FILE__ + (__LINE__).to_s + " " + @options.to_s
|
59
|
+
puts "Test file => #{@options[:test_file]}"
|
60
|
+
puts "Host => #{@options[:host]}"
|
61
|
+
puts "Loc => #{@options[:loc]}"
|
62
|
+
puts "Title => #{@options[:title]}"
|
63
|
+
puts "Browser => #{@options[:browser]}"
|
64
|
+
puts "UserID => #{@options[:userid]}"
|
65
|
+
puts "Password => #{@options[:password]}"
|
66
|
+
puts "Eyes => #{@options[:enable_eyes]}"
|
67
|
+
puts "Test Cfg => #{@options[:json_config_file]}"
|
68
|
+
|
69
|
+
@options
|
70
|
+
end
|
71
|
+
|
72
|
+
def isDebug?
|
73
|
+
@options[:debug]
|
74
|
+
end
|
75
|
+
|
76
|
+
def eyesEnabled?
|
77
|
+
@options[:enable_eyes]
|
78
|
+
end
|
79
|
+
|
80
|
+
def getBrowser()
|
81
|
+
getBrowserType()
|
82
|
+
end
|
83
|
+
def getBrowserType()
|
84
|
+
@options[:browser]
|
85
|
+
end
|
86
|
+
|
87
|
+
def hasTestConfig?
|
88
|
+
!@options[:json_config_file].nil?
|
89
|
+
end
|
90
|
+
|
91
|
+
def testConfigFile()
|
92
|
+
@options[:json_config_file]
|
93
|
+
end
|
94
|
+
|
95
|
+
# Returns JSON file contents/format
|
96
|
+
def getTestSettings()
|
97
|
+
|
98
|
+
[:host, :userid, :password].each do |k|
|
99
|
+
|
100
|
+
puts __FILE__ + (__LINE__).to_s + " opt[test_config].has_key(#{k.to_s}) => #{@options[:test_config].has_key?(k.to_s)}"
|
101
|
+
if @options[:test_config].has_key?(k.to_s)
|
102
|
+
|
103
|
+
puts __FILE__ + (__LINE__).to_s + " opts[#{k}].nil => #{@options[k].nil?}"
|
104
|
+
# Ensure commnand line takes precedence
|
105
|
+
if !@options[k].nil?
|
106
|
+
puts __FILE__ + (__LINE__).to_s + " opt[#{k.to_s} => #{@options[k].to_s}"
|
107
|
+
Scoutui::Base::UserVars.instance.set(k, @options[k].to_s)
|
108
|
+
else
|
109
|
+
|
110
|
+
Scoutui::Base::UserVars.instance.set(k, @options[:test_config][k.to_s].to_s)
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
@options[:test_config]
|
117
|
+
end
|
118
|
+
|
119
|
+
def getUserId()
|
120
|
+
@options[:userid]
|
121
|
+
end
|
122
|
+
|
123
|
+
def getUser()
|
124
|
+
getUserId()
|
125
|
+
end
|
126
|
+
|
127
|
+
def getPassword()
|
128
|
+
@options[:password]
|
129
|
+
end
|
130
|
+
|
131
|
+
def testFile()
|
132
|
+
@options[:test_file]
|
133
|
+
end
|
134
|
+
|
135
|
+
def host()
|
136
|
+
@options[:host]
|
137
|
+
end
|
138
|
+
|
139
|
+
def loc()
|
140
|
+
@options[:loc]
|
141
|
+
end
|
142
|
+
def localization()
|
143
|
+
loc()
|
144
|
+
end
|
145
|
+
|
146
|
+
|
147
|
+
def title()
|
148
|
+
@options[:title]
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
|
160
|
+
end
|
data/lib/scoutui/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scoutui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Kim
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -127,6 +127,16 @@ files:
|
|
127
127
|
- bin/console
|
128
128
|
- bin/setup
|
129
129
|
- lib/scoutui.rb
|
130
|
+
- lib/scoutui/base/app_model.rb
|
131
|
+
- lib/scoutui/base/q_accounts.rb
|
132
|
+
- lib/scoutui/base/q_applitools.rb
|
133
|
+
- lib/scoutui/base/q_browser.rb
|
134
|
+
- lib/scoutui/base/test_runner.rb
|
135
|
+
- lib/scoutui/base/test_settings.rb
|
136
|
+
- lib/scoutui/base/user_vars.rb
|
137
|
+
- lib/scoutui/base/visual_test_framework.rb
|
138
|
+
- lib/scoutui/navigator.rb
|
139
|
+
- lib/scoutui/utils/utils.rb
|
130
140
|
- lib/scoutui/version.rb
|
131
141
|
- scoutui.gemspec
|
132
142
|
homepage: https://github.com/h20dragon
|