itms_automation 2.5.6 → 2.5.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/example/desktop web/desktop_web_gmail_login/features/support/env.rb +67 -12
- data/example/desktop web/desktop_web_gmail_login/features/support/hooks.rb +34 -22
- data/features-skeleton/step_definitions/repositories/project_object.yml +1 -0
- data/features-skeleton/support/env.rb +4 -2
- data/features-skeleton/support/hooks.rb +5 -41
- data/lib/itms_automation/methods/assertion_methods.rb +20 -31
- data/lib/itms_automation/methods/click_elements_methods.rb +6 -6
- data/lib/itms_automation/methods/error_handling_methods.rb +6 -0
- data/lib/itms_automation/methods/misc_methods.rb +16 -0
- data/lib/itms_automation/version.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03c38ca27fff8e41d5bc25a5f98019cbf4e4cc90f1be655b0264b2da1301a2f7
|
4
|
+
data.tar.gz: 6ef0427780ea0b6cfade74682e8d60529fa7194bea56b56546fd786034871bf1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e4d5042bb36effd440cda7b75e0ea9547a3b5039b6b360fe77d940113480fb82fa5bff6ed3719177c2489f8fd4d6d1e43c48db00562f766a5552b5a01025f69
|
7
|
+
data.tar.gz: 4ac9c825eb5584fece56a3106430de1991c439cdbf4040afe8028091dfb5d2555d8cc03caac65a323fc30b88df8ea66451ebacb8257407f5381b198f761ae5f3
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'itms_automation'
|
3
|
-
|
2
|
+
# require 'itms_automation'
|
3
|
+
require_relative '../../../lib/itms_automation.rb'
|
4
|
+
# require 'appium_lib'
|
5
|
+
require 'appium_lib_core'
|
4
6
|
# Store command line arguments
|
5
|
-
$browser_type = ENV['BROWSER'] || '
|
7
|
+
$browser_type = ENV['BROWSER'] || 'firefox'
|
6
8
|
$platform = ENV['PLATFORM'] || 'desktop'
|
7
9
|
$os_version = ENV['OS_VERSION']
|
8
10
|
$device_name = ENV['DEVICE_NAME']
|
@@ -23,29 +25,82 @@ if $platform == 'android' or $platform == 'iOS'
|
|
23
25
|
$device_name, $os_version = get_device_info
|
24
26
|
end
|
25
27
|
|
26
|
-
desired_caps = {
|
27
|
-
|
28
|
-
|
28
|
+
# desired_caps = {
|
29
|
+
# caps: {
|
30
|
+
# platformName: $platform,
|
31
|
+
# browserName: $browser_type,
|
32
|
+
# versionNumber: $os_version,
|
33
|
+
# deviceName: $device_name,
|
34
|
+
# udid: $udid,
|
35
|
+
# app: ".//#{$app_path}"
|
36
|
+
# }
|
37
|
+
# }
|
38
|
+
# appium_url = 'http://localhost:4723/wd/hub'
|
39
|
+
# opts = {
|
40
|
+
# desired_capabilities: { # or { caps: {....} }
|
41
|
+
# platformName: :android,
|
42
|
+
# deviceName: 'Android Simulator',
|
43
|
+
# app: "WikipediaSample.apk"
|
44
|
+
# },
|
45
|
+
# appium_lib: {
|
46
|
+
# wait: 30
|
47
|
+
# }
|
48
|
+
# }
|
49
|
+
|
50
|
+
opts = {
|
51
|
+
desired_capabilities: { # or { caps: {....} }
|
52
|
+
platformName: $platform,
|
29
53
|
browserName: $browser_type,
|
30
|
-
versionNumber: $os_version,
|
31
54
|
deviceName: $device_name,
|
32
|
-
|
33
|
-
app: "
|
34
|
-
|
55
|
+
versionNumber: $os_version,
|
56
|
+
app: "WikipediaSample.apk"
|
57
|
+
},
|
58
|
+
appium_lib: {
|
59
|
+
wait: 30
|
35
60
|
}
|
61
|
+
}
|
36
62
|
|
37
63
|
begin
|
38
|
-
$driver = Appium::Driver.new(desired_caps).start_driver
|
64
|
+
# $driver = Appium::Driver.new(desired_caps, url: appium_url).start_driver
|
65
|
+
|
66
|
+
# $driver = Selenium::WebDriver.for(:remote, :url => appium_url, :desired_capabilities => desired_caps)
|
67
|
+
@core = Appium::Core.for(opts) # create a core driver with `opts`
|
68
|
+
$driver = @core.start_driver
|
69
|
+
|
39
70
|
rescue Exception => e
|
40
71
|
puts e.message
|
41
72
|
Process.exit(0)
|
42
73
|
end
|
43
74
|
else # else create driver instance for desktop browser
|
44
75
|
begin
|
45
|
-
$driver =
|
76
|
+
$driver = case $browser_type
|
77
|
+
when "chrome"
|
78
|
+
Selenium::WebDriver.for(:chrome)
|
79
|
+
when "safari"
|
80
|
+
Selenium::WebDriver.for(:safari)
|
81
|
+
when "internet_explorer"
|
82
|
+
Selenium::WebDriver.for(:internet_explorer)
|
83
|
+
when "chrome_headless"
|
84
|
+
Selenium::WebDriver.for(:chrome, :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: { args: %w(headless) }))
|
85
|
+
when "remote"
|
86
|
+
if ENV['SERVER_URL'].nil? || ENV['REMOTE_BROWSER'].nil?
|
87
|
+
puts "\nMissing SERVER_URL : SERVER_URL=http//SERVER_URL:4444/wd/hub"
|
88
|
+
puts "\nMissing REMOTE_BROWSER: REMOTE_BROWSER=browser_name"
|
89
|
+
Process.exit(0)
|
90
|
+
else
|
91
|
+
caps = Selenium::WebDriver::Remote::Capabilities.new
|
92
|
+
caps["browserName"] = ENV['REMOTE_BROWSER']
|
93
|
+
Selenium::WebDriver.for(:remote, :url => ENV['SERVER_URL'], :desired_capabilities => caps)
|
94
|
+
end
|
95
|
+
|
96
|
+
else
|
97
|
+
Selenium::WebDriver.for(:firefox)
|
98
|
+
end
|
46
99
|
$driver.manage().window().maximize()
|
100
|
+
p "session_id: #{$driver.session_id}"
|
47
101
|
rescue Exception => e
|
48
102
|
puts e.message
|
49
103
|
Process.exit(0)
|
50
104
|
end
|
51
105
|
end
|
106
|
+
|
@@ -1,26 +1,38 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# executed.
|
11
|
-
end
|
12
|
-
|
13
|
-
After do
|
14
|
-
# Do something after each scenario.
|
1
|
+
def validate_params_exist
|
2
|
+
raise "❌ ERROR: Missing param SERVER_URL." if ENV['SERVER_URL'].nil?
|
3
|
+
raise "❌ ERROR: Missing param BROWSER." if ENV['BROWSER'].nil?
|
4
|
+
if ENV['REPORT']
|
5
|
+
raise "❌ ERROR: Missing param TESTSUITE." if ENV['TESTSUITE'].nil?
|
6
|
+
raise "❌ ERROR: Missing param TESTCASE_REPORT_NAME." if ENV['TESTCASE_REPORT_NAME'].nil?
|
7
|
+
$report_path = "Reports/#{ENV['TESTSUITE']}"
|
8
|
+
$testcase_report_name = ENV['TESTCASE_REPORT_NAME']
|
9
|
+
end
|
15
10
|
end
|
16
11
|
|
17
|
-
|
18
|
-
#
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
12
|
+
at_exit do
|
13
|
+
# quite driver
|
14
|
+
$driver.close()
|
15
|
+
if ENV['REPORT']
|
16
|
+
begin
|
17
|
+
# validateReport
|
18
|
+
time = Time.now.getutc
|
19
|
+
ReportBuilder.configure do |config|
|
20
|
+
config.report_path = "#{$report_path}/#{$testcase_report_name}"
|
21
|
+
config.input_path = "#{$report_path}/#{$testcase_report_name}.json"
|
22
|
+
config.report_types = [:json, :html]
|
23
|
+
config.color = 'blue'
|
24
|
+
config.additional_info = {
|
25
|
+
'Browser' => $browser_type,
|
26
|
+
'Platform' => $platform ,
|
27
|
+
'OS Version' => $os_version,
|
28
|
+
'Report Generated' => time
|
29
|
+
}
|
30
|
+
end
|
31
|
+
options = { report_title: "INFODation - Test Management System" }
|
32
|
+
ReportBuilder.build_report options
|
33
|
+
rescue Exception => e
|
34
|
+
puts e.message
|
35
|
+
Process.exit( 0 )
|
36
|
+
end
|
25
37
|
end
|
26
38
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
button: { id: 'submit' }
|
@@ -93,9 +93,11 @@ else # else create driver instance for desktop browser
|
|
93
93
|
Selenium::WebDriver.for(:firefox)
|
94
94
|
end
|
95
95
|
$driver.manage().window().maximize()
|
96
|
-
p "session_id: #{$driver.session_id}"
|
97
96
|
if ENV["UPDATE_SESSION_ID_API"]
|
98
|
-
|
97
|
+
begin
|
98
|
+
HTTParty.post(ENV["UPDATE_SESSION_ID_API"], body: { session_id: $driver.session_id })
|
99
|
+
rescue => exception
|
100
|
+
end
|
99
101
|
end
|
100
102
|
rescue Exception => e
|
101
103
|
puts e.message
|
@@ -1,43 +1,3 @@
|
|
1
|
-
#Cucumber provides a number of hooks which allow us to run blocks at various points in the Cucumber test cycle
|
2
|
-
|
3
|
-
Before do
|
4
|
-
# Do something before each scenario.
|
5
|
-
end
|
6
|
-
|
7
|
-
Before do |scenario|
|
8
|
-
# The +scenario+ argument is optional, but if you use it, you can get the title,
|
9
|
-
# description, or name (title + description) of the scenario that is about to be
|
10
|
-
# executed.
|
11
|
-
end
|
12
|
-
|
13
|
-
After do
|
14
|
-
# Do something after each scenario.
|
15
|
-
end
|
16
|
-
|
17
|
-
After do |scenario|
|
18
|
-
# Do something after each scenario.
|
19
|
-
# The +scenario+ argument is optional, but
|
20
|
-
# if you use it, you can inspect status with
|
21
|
-
# the #failed?, #passed? and #exception methods.
|
22
|
-
|
23
|
-
if(scenario.failed?)
|
24
|
-
#Do something if scenario fails.
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
|
29
|
-
AfterConfiguration do
|
30
|
-
$OBJECT = loadYAMLfile("features/step_definitions/repositories/project_object.yml")
|
31
|
-
end
|
32
|
-
|
33
|
-
def loadYAMLfile(filename)
|
34
|
-
begin
|
35
|
-
return YAML.load_file(filename)
|
36
|
-
rescue Psych::SyntaxError => ex
|
37
|
-
raise "❌ SyntaxError when reading file: #{ex}"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
1
|
def validate_params_exist
|
42
2
|
raise "❌ ERROR: Missing param SERVER_URL." if ENV['SERVER_URL'].nil?
|
43
3
|
raise "❌ ERROR: Missing param BROWSER." if ENV['BROWSER'].nil?
|
@@ -50,6 +10,8 @@ def validate_params_exist
|
|
50
10
|
end
|
51
11
|
|
52
12
|
at_exit do
|
13
|
+
# quite driver
|
14
|
+
$driver.close()
|
53
15
|
if ENV['REPORT']
|
54
16
|
begin
|
55
17
|
# validateReport
|
@@ -68,7 +30,9 @@ at_exit do
|
|
68
30
|
end
|
69
31
|
options = { report_title: "INFODation - Test Management System" }
|
70
32
|
ReportBuilder.build_report options
|
71
|
-
rescue
|
33
|
+
rescue Exception => e
|
34
|
+
puts e.message
|
35
|
+
Process.exit( 0 )
|
72
36
|
end
|
73
37
|
end
|
74
38
|
end
|
@@ -41,17 +41,15 @@ def check_partial_title(partial_text_title, test_case)
|
|
41
41
|
end
|
42
42
|
|
43
43
|
# Method to get element text
|
44
|
-
# param
|
45
|
-
# param 2 : String : Locator value
|
44
|
+
# param : String
|
46
45
|
def get_element_text(element)
|
47
46
|
WAIT.until { find_object(element) }.text
|
48
47
|
end
|
49
48
|
|
50
49
|
# Method to check element text
|
51
|
-
# param 1 : String :
|
50
|
+
# param 1 : String : Element
|
52
51
|
# param 2 : String : Expected element text
|
53
|
-
# param 3 :
|
54
|
-
# param 4 : Boolean : test case [true or flase]
|
52
|
+
# param 3 : Boolean : test case [true or flase]
|
55
53
|
def check_element_text(element, actual_value, test_case)
|
56
54
|
element_text = get_element_text(element)
|
57
55
|
|
@@ -67,10 +65,9 @@ def check_element_text(element, actual_value, test_case)
|
|
67
65
|
end
|
68
66
|
|
69
67
|
# Method to check partial element text
|
70
|
-
# param 1 : String :
|
68
|
+
# param 1 : String : Element
|
71
69
|
# param 2 : String : Expected element partial text
|
72
|
-
# param 3 :
|
73
|
-
# param 4 : Boolean : test case [true or flase]
|
70
|
+
# param 3 : Boolean : test case [true or flase]
|
74
71
|
def check_element_partial_text(element, actual_value, test_case)
|
75
72
|
element_text = get_element_text(element)
|
76
73
|
|
@@ -86,16 +83,14 @@ def check_element_partial_text(element, actual_value, test_case)
|
|
86
83
|
end
|
87
84
|
|
88
85
|
# Method to return element status - enabled?
|
89
|
-
# param
|
90
|
-
# param 2 : String : Locator value
|
86
|
+
# param : String : Element
|
91
87
|
def is_element_enabled(element)
|
92
88
|
WAIT.until{ find_object(element) }.enabled?
|
93
89
|
end
|
94
90
|
|
95
91
|
# Element enabled checking
|
96
|
-
# param 1 : String :
|
97
|
-
# param 2 :
|
98
|
-
# param 4 : Boolean : test case [true or flase]
|
92
|
+
# param 1 : String : Element
|
93
|
+
# param 2 : Boolean : test case [true or flase]
|
99
94
|
def check_element_enable(element, test_case)
|
100
95
|
result = is_element_enabled(element)
|
101
96
|
|
@@ -107,19 +102,17 @@ def check_element_enable(element, test_case)
|
|
107
102
|
end
|
108
103
|
|
109
104
|
# method to get attribute value
|
110
|
-
# param 1 : String :
|
111
|
-
# param 2 : String :
|
112
|
-
# param 3 : String : atrribute name
|
105
|
+
# param 1 : String : Element
|
106
|
+
# param 2 : String : atrribute name
|
113
107
|
def get_element_attribute(element, attribute_name)
|
114
108
|
WAIT.until{ find_object(element) }.attribute("#{attribute_name}")
|
115
109
|
end
|
116
110
|
|
117
111
|
# method to check attribute value
|
118
|
-
# param 1 : String :
|
112
|
+
# param 1 : String : Element
|
119
113
|
# param 2 : String : atrribute name
|
120
114
|
# param 3 : String : atrribute value
|
121
|
-
# param 4 :
|
122
|
-
# param 5 : Boolean : test case [true or flase]
|
115
|
+
# param 4 : Boolean : test case [true or flase]
|
123
116
|
def check_element_attribute(element, attribute_name, attribute_value, test_case)
|
124
117
|
|
125
118
|
attr_val = get_element_attribute(element, attribute_name)
|
@@ -136,16 +129,14 @@ def check_element_attribute(element, attribute_name, attribute_value, test_case)
|
|
136
129
|
end
|
137
130
|
|
138
131
|
# method to get element status - displayed?
|
139
|
-
# param
|
140
|
-
|
141
|
-
def is_element_displayed(access_type, access_name)
|
132
|
+
# param : String : Element
|
133
|
+
def is_element_displayed(element)
|
142
134
|
WAIT.until{ find_object(element) }.displayed?
|
143
135
|
end
|
144
136
|
|
145
137
|
# method to check element presence
|
146
|
-
# param 1 : String :
|
147
|
-
# param 2 :
|
148
|
-
# param 3 : Boolean : test case [true or flase]
|
138
|
+
# param 1 : String : Element
|
139
|
+
# param 2 : Boolean : test case [true or flase]
|
149
140
|
def check_element_presence(element, test_case)
|
150
141
|
if test_case
|
151
142
|
if !is_element_displayed(element)
|
@@ -165,9 +156,8 @@ def check_element_presence(element, test_case)
|
|
165
156
|
end
|
166
157
|
|
167
158
|
# method to assert checkbox check/uncheck
|
168
|
-
# param 1 : String :
|
169
|
-
# param 2 :
|
170
|
-
# param 3 : Boolean : test case [true or flase]
|
159
|
+
# param 1 : String : Element
|
160
|
+
# param 2 : Boolean : test case [true or flase]
|
171
161
|
def is_checkbox_checked(element, should_be_checked = true)
|
172
162
|
checkbox = WAIT.until{ find_object(element) }
|
173
163
|
|
@@ -179,9 +169,8 @@ def is_checkbox_checked(element, should_be_checked = true)
|
|
179
169
|
end
|
180
170
|
|
181
171
|
# method to assert radio button selected/unselected
|
182
|
-
# param 1 : String :
|
183
|
-
# param 2 :
|
184
|
-
# param 3 : Boolean : test case [true or flase]
|
172
|
+
# param 1 : String : Element
|
173
|
+
# param 2 : Boolean : test case [true or flase]
|
185
174
|
def is_radio_button_selected(element, should_be_selected = true)
|
186
175
|
radio_button = WAIT.until{ find_object(element) }
|
187
176
|
|
@@ -8,15 +8,15 @@ def click_forcefully(element)
|
|
8
8
|
$driver.execute_script('arguments[0].click();', WAIT.until { find_object(element) })
|
9
9
|
end
|
10
10
|
|
11
|
-
def double_click(
|
12
|
-
|
13
|
-
$driver.action.double_click(
|
11
|
+
def double_click(element)
|
12
|
+
found_element = WAIT.until { find_object(element) }
|
13
|
+
$driver.action.double_click(found_element).perform
|
14
14
|
end
|
15
15
|
|
16
16
|
|
17
|
-
def long_press(
|
18
|
-
|
19
|
-
parameters = { "element" => "#{
|
17
|
+
def long_press( element, duration)
|
18
|
+
found_element = WAIT.until { find_object(element) }
|
19
|
+
parameters = { "element" => "#{found_element}", "duration" => "#{duration}" }
|
20
20
|
args = parameters.select { |k, v| [:element, :duration].include? k }
|
21
21
|
args = args_with_ele_ref(args)
|
22
22
|
chain_method(:longPress, args)
|
@@ -85,3 +85,9 @@ def print_invalid_platform
|
|
85
85
|
puts "\nTo run on Desktop no need to mention platform."
|
86
86
|
Process.exit(0)
|
87
87
|
end
|
88
|
+
|
89
|
+
def print_error_object_repository
|
90
|
+
puts "\nNo Object Repository found."
|
91
|
+
puts "\nPlease create file \"project_object.yml\" in path \"features/step_definitions/repositories/\""
|
92
|
+
Process.exit(0)
|
93
|
+
end
|
@@ -34,6 +34,7 @@ def get_device_info
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def find_object(string_object)
|
37
|
+
$OBJECT = load_object_repository
|
37
38
|
string_object = string_object.gsub(/"/, "'")
|
38
39
|
hash_object = $OBJECT[string_object]
|
39
40
|
if hash_object == nil
|
@@ -45,3 +46,18 @@ def find_object(string_object)
|
|
45
46
|
$driver.find_element(:"#{locator_type}" => "#{locator_value}")
|
46
47
|
end
|
47
48
|
|
49
|
+
def load_object_repository
|
50
|
+
begin
|
51
|
+
loadYAMLfile("features/step_definitions/repositories/project_object.yml")
|
52
|
+
rescue => exception
|
53
|
+
print_error_object_repository
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def loadYAMLfile(filename)
|
58
|
+
begin
|
59
|
+
return YAML.load_file(filename)
|
60
|
+
rescue Psych::SyntaxError => ex
|
61
|
+
raise "❌ SyntaxError when reading file: #{ex}"
|
62
|
+
end
|
63
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itms_automation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- INFOdation
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-07-
|
11
|
+
date: 2020-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber
|
@@ -16,20 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 3.1.2
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.
|
22
|
+
version: 3.1.2
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 3.1.2
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.
|
32
|
+
version: 3.1.2
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: selenium-webdriver
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- features-skeleton/my_first.feature
|
131
131
|
- features-skeleton/screenshots/test.png
|
132
132
|
- features-skeleton/step_definitions/custom_steps.rb
|
133
|
+
- features-skeleton/step_definitions/repositories/project_object.yml
|
133
134
|
- features-skeleton/support/env.rb
|
134
135
|
- features-skeleton/support/hooks.rb
|
135
136
|
- lib/itms_automation.rb
|