itms_automation 2.5.6 → 2.6.4
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/Gemfile +3 -0
- data/features-skeleton/README.md +132 -0
- data/features-skeleton/cucumber.yml +4 -0
- data/features-skeleton/my_first.feature +9 -4
- data/features-skeleton/step_definitions/repositories/project_object.yml +1 -0
- data/features-skeleton/support/env.rb +8 -5
- data/features-skeleton/support/hooks.rb +5 -41
- data/lib/itms_automation/methods/assertion_methods.rb +33 -44
- data/lib/itms_automation/methods/click_elements_methods.rb +6 -7
- 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 +34 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30a810fadeedd85c66be2487e85f27f592ba294587aae14e2cd76f88bb3bebe3
|
4
|
+
data.tar.gz: f571985b3f188a311c31fffdc572eb48eb2df8bb4a5052a57363f0099489e50d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ab5441cff00f45a7fa1d336512374680ffa4e241a7dea3b53c1a6755e12f570fcf509182287e7c5d9fe6d358853c35119dd675b6bdb9c1a8d75fc6775bb70e1
|
7
|
+
data.tar.gz: a22c540ada6ef13902b7e8a4e0beda12892c27f88b381e7ba6229a563f7419c9f18e3d12a8e2a5f866e4e65698b4f10e73645697e79984c73d7177180fc8c005
|
@@ -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,132 @@
|
|
1
|
+
Welcome to itms_automation
|
2
|
+
=================
|
3
|
+
|
4
|
+
itms_automation : Automation Tesing Using Ruby
|
5
|
+
|
6
|
+
itms_automation is a behavior driven development (BDD) approach to write automation test script to test Web and Android Apps.
|
7
|
+
It enables you to write and execute automated acceptance/unit tests.
|
8
|
+
It is cross-platform, open source and free.
|
9
|
+
Automate your test cases with minimal coding.
|
10
|
+
|
11
|
+
itms_automation Ruby API's
|
12
|
+
============================
|
13
|
+
|
14
|
+
If you are writing code for your custom steps you can use the following methods :
|
15
|
+
|
16
|
+
Note : For some of the API paramtere values are fixed. Such values for paramaters are mentioned below.
|
17
|
+
|
18
|
+
Navigation API's
|
19
|
+
----------------
|
20
|
+
|
21
|
+
navigate_to("link")
|
22
|
+
|
23
|
+
navigate(direction) # direction => "back" / "forward"
|
24
|
+
|
25
|
+
close_driver()
|
26
|
+
|
27
|
+
|
28
|
+
Browser Interaction API's
|
29
|
+
-------------------------
|
30
|
+
|
31
|
+
resize_browser(width, height)
|
32
|
+
|
33
|
+
scroll_page(to) # to => "top" / "end"
|
34
|
+
|
35
|
+
scroll_to_element(by, access_value)
|
36
|
+
|
37
|
+
zoom_in_out(in_out) # in_out => "add" / "subtract"
|
38
|
+
|
39
|
+
zoom_in_out_till_element_display(by, in_out, access_value) # in_out => "add" / "subtract"
|
40
|
+
|
41
|
+
|
42
|
+
Input API's
|
43
|
+
------------
|
44
|
+
|
45
|
+
click(element)
|
46
|
+
|
47
|
+
double_click(element)
|
48
|
+
|
49
|
+
click_forcefully(element)
|
50
|
+
|
51
|
+
enter_text(element, text)
|
52
|
+
|
53
|
+
clear_text(element)
|
54
|
+
|
55
|
+
check_checkbox(element)
|
56
|
+
|
57
|
+
uncheck_checkbox(element)
|
58
|
+
|
59
|
+
toggle_checkbox(element)
|
60
|
+
|
61
|
+
select_radio_button(element)
|
62
|
+
|
63
|
+
get_page_title()
|
64
|
+
|
65
|
+
get_element_text(element)
|
66
|
+
|
67
|
+
get_element_attribute(element, attribute)
|
68
|
+
|
69
|
+
is_element_enabled(element)
|
70
|
+
|
71
|
+
is_element_displayed(element)
|
72
|
+
|
73
|
+
hover_over_element(element)
|
74
|
+
|
75
|
+
by => "locators type" ("id", "name", "class", "xpath", "css")
|
76
|
+
|
77
|
+
access_value => "locator value"
|
78
|
+
|
79
|
+
|
80
|
+
Javascript Handling API
|
81
|
+
-----------------------
|
82
|
+
|
83
|
+
handle_alert(decision) # decision => "accept" / "dismiss"
|
84
|
+
|
85
|
+
get_alert_text
|
86
|
+
|
87
|
+
|
88
|
+
Progress API's
|
89
|
+
--------------
|
90
|
+
|
91
|
+
wait(time_in_sec)
|
92
|
+
|
93
|
+
wait_for_element_to_display(element, duration)
|
94
|
+
|
95
|
+
wait_for_element_to_enable(element, duration)
|
96
|
+
|
97
|
+
|
98
|
+
by => "locators type" ("id", "name", "class", "xpath", "css")
|
99
|
+
|
100
|
+
access_value => "locator value"
|
101
|
+
|
102
|
+
duration => duration in seconds.
|
103
|
+
|
104
|
+
|
105
|
+
Screenshot API
|
106
|
+
--------------
|
107
|
+
take_screenshots
|
108
|
+
|
109
|
+
|
110
|
+
Configuration API
|
111
|
+
-----------------
|
112
|
+
|
113
|
+
print_congifugartion
|
114
|
+
|
115
|
+
|
116
|
+
Usage: itms_automation <command-name> [parameters] [options]
|
117
|
+
|
118
|
+
<command-name> can be one of
|
119
|
+
help
|
120
|
+
gen
|
121
|
+
version
|
122
|
+
|
123
|
+
Commands:
|
124
|
+
help : prints more detailed help information.
|
125
|
+
|
126
|
+
gen : creates a skeleton features dir. This is usually used once when
|
127
|
+
setting up selnium-cucumber to ensure that the features folder contains
|
128
|
+
the right step definitions and environment to run with cucumber.
|
129
|
+
|
130
|
+
version : prints the gem version
|
131
|
+
|
132
|
+
Options: -v, --verbose Turns on verbose logging
|
@@ -1,5 +1,10 @@
|
|
1
|
-
Feature:
|
1
|
+
Feature: Addition
|
2
|
+
As a math idiot
|
3
|
+
In order to not feel silly
|
4
|
+
I add two numbers
|
2
5
|
|
3
|
-
Scenario:
|
4
|
-
|
5
|
-
|
6
|
+
Scenario: Adding a and b
|
7
|
+
Given I have variable a
|
8
|
+
And I have variable b
|
9
|
+
When I add a and b
|
10
|
+
Then I display the sum
|
@@ -0,0 +1 @@
|
|
1
|
+
button: { id: 'submit' }
|
@@ -2,6 +2,8 @@ require "rubygems"
|
|
2
2
|
require "itms_automation"
|
3
3
|
require "httparty"
|
4
4
|
require "cucumber"
|
5
|
+
require "report_builder"
|
6
|
+
require "selenium-webdriver"
|
5
7
|
|
6
8
|
$browser_type = ENV["BROWSER"] || "firefox"
|
7
9
|
$platform = ENV["PLATFORM"] || "desktop"
|
@@ -81,22 +83,23 @@ else # else create driver instance for desktop browser
|
|
81
83
|
Selenium::WebDriver.for(:chrome, :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: { args: %w(headless) }))
|
82
84
|
when "remote"
|
83
85
|
if ENV["SERVER_URL"].nil? || ENV["REMOTE_BROWSER"].nil?
|
84
|
-
puts "\nMissing SERVER_URL : SERVER_URL=http
|
86
|
+
puts "\nMissing SERVER_URL : SERVER_URL=http://SERVER_URL:4444/wd/hub"
|
85
87
|
puts "\nMissing REMOTE_BROWSER: REMOTE_BROWSER=browser_name"
|
86
88
|
Process.exit(0)
|
87
89
|
else
|
88
90
|
caps = Selenium::WebDriver::Remote::Capabilities.new
|
89
91
|
caps["browserName"] = ENV["REMOTE_BROWSER"]
|
92
|
+
caps["enableVNC"] = !ENV["ENABLE_VNC"].nil? && ENV["ENABLE_VNC"] == "true"
|
93
|
+
caps["enableVideo"] = !ENV["ENABLE_VIDEO"].nil? && ENV["ENABLE_VIDEO"] == "true"
|
94
|
+
caps["screenResolution"] = ENV["SCREEN_RESOLUTION"] unless ENV["SCREEN_RESOLUTION"].nil?
|
95
|
+
caps["projectId"] = ENV["PROJECT_ID"] unless ENV["PROJECT_ID"].nil?
|
96
|
+
caps["issueId"] = ENV["ISSUE_ID"] unless ENV["ISSUE_ID"].nil?
|
90
97
|
Selenium::WebDriver.for(:remote, :url => ENV["SERVER_URL"], :desired_capabilities => caps)
|
91
98
|
end
|
92
99
|
else
|
93
100
|
Selenium::WebDriver.for(:firefox)
|
94
101
|
end
|
95
102
|
$driver.manage().window().maximize()
|
96
|
-
p "session_id: #{$driver.session_id}"
|
97
|
-
if ENV["UPDATE_SESSION_ID_API"]
|
98
|
-
HTTParty.post(ENV["UPDATE_SESSION_ID_API"], body: { session_id: $driver.session_id })
|
99
|
-
end
|
100
103
|
rescue Exception => e
|
101
104
|
puts e.message
|
102
105
|
Process.exit(0)
|
@@ -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,61 +41,56 @@ 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
|
-
|
55
|
-
def check_element_text(element, actual_value, test_case)
|
52
|
+
# param 3 : Boolean : test case [true or flase]
|
53
|
+
def check_element_text(element, expected_value, test_case)
|
56
54
|
element_text = get_element_text(element)
|
57
55
|
|
58
56
|
if test_case
|
59
|
-
if element_text !=
|
60
|
-
raise TestCaseFailed,
|
57
|
+
if element_text != expected_value
|
58
|
+
raise TestCaseFailed, "Text Not Matched. Actual Value :#{expected_value}"
|
61
59
|
end
|
62
60
|
else
|
63
|
-
if element_text ==
|
64
|
-
raise TestCaseFailed,
|
61
|
+
if element_text == expected_value
|
62
|
+
raise TestCaseFailed, "Text Matched. Actual Value :#{expected_value}"
|
65
63
|
end
|
66
64
|
end
|
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
|
-
|
74
|
-
def check_element_partial_text(element, actual_value, test_case)
|
70
|
+
# param 3 : Boolean : test case [true or flase]
|
71
|
+
def check_element_partial_text(element, expected_value, test_case)
|
75
72
|
element_text = get_element_text(element)
|
76
73
|
|
77
74
|
if test_case
|
78
|
-
if not element_text.include? "#{
|
79
|
-
raise TestCaseFailed,
|
75
|
+
if not element_text.include? "#{expected_value}"
|
76
|
+
raise TestCaseFailed, "Text Not Matched. Actual Value :#{expected_value}"
|
80
77
|
end
|
81
78
|
else
|
82
|
-
if element_text.include? "#{
|
83
|
-
raise TestCaseFailed,
|
79
|
+
if element_text.include? "#{expected_value}"
|
80
|
+
raise TestCaseFailed, "Text Matched. Actual Value :#{expected_value}"
|
84
81
|
end
|
85
82
|
end
|
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,45 +102,41 @@ 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)
|
126
119
|
|
127
120
|
if test_case
|
128
121
|
if attr_val != attribute_value
|
129
|
-
raise TestCaseFailed,
|
122
|
+
raise TestCaseFailed, "Attribute Value Not Matched. Actual Value :#{attr_val}"
|
130
123
|
end
|
131
124
|
else
|
132
125
|
if attr_val == attribute_value
|
133
|
-
raise TestCaseFailed,
|
126
|
+
raise TestCaseFailed, "Attribute Value Matched. Actual Value :#{attr_val}"
|
134
127
|
end
|
135
128
|
end
|
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
|
|
@@ -215,7 +204,7 @@ end
|
|
215
204
|
# method to check javascript pop-up alert text
|
216
205
|
def check_alert_text(text)
|
217
206
|
if get_alert_text != text
|
218
|
-
raise TestCaseFailed,
|
207
|
+
raise TestCaseFailed, "Text on alert pop up not matched. Actual Value :#{get_alert_text}"
|
219
208
|
end
|
220
209
|
end
|
221
210
|
|
@@ -8,15 +8,14 @@ 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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
parameters = { "element" => "#{element}", "duration" => "#{duration}" }
|
16
|
+
def long_press( element, duration)
|
17
|
+
found_element = WAIT.until { find_object(element) }
|
18
|
+
parameters = { "element" => "#{found_element}", "duration" => "#{duration}" }
|
20
19
|
args = parameters.select { |k, v| [:element, :duration].include? k }
|
21
20
|
args = args_with_ele_ref(args)
|
22
21
|
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.
|
4
|
+
version: 2.6.4
|
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-28 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
|
@@ -76,20 +76,40 @@ dependencies:
|
|
76
76
|
requirements:
|
77
77
|
- - "~>"
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version: 0.
|
79
|
+
version: 0.18.1
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.
|
82
|
+
version: 0.18.1
|
83
83
|
type: :runtime
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
89
|
+
version: 0.18.1
|
90
90
|
- - ">="
|
91
91
|
- !ruby/object:Gem::Version
|
92
|
-
version: 0.
|
92
|
+
version: 0.18.1
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: report_builder
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '1.8'
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.8'
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.8'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '1.8'
|
93
113
|
description: Behavior driven development (BDD) approach to write automation test script
|
94
114
|
to test Web and Android applications.
|
95
115
|
email: anh.pham@infodation.vn
|
@@ -127,9 +147,13 @@ files:
|
|
127
147
|
- example/desktop web/desktop_web_gmail_login/features/step_definitions/custom_steps.rb
|
128
148
|
- example/desktop web/desktop_web_gmail_login/features/support/env.rb
|
129
149
|
- example/desktop web/desktop_web_gmail_login/features/support/hooks.rb
|
150
|
+
- features-skeleton/Gemfile
|
151
|
+
- features-skeleton/README.md
|
152
|
+
- features-skeleton/cucumber.yml
|
130
153
|
- features-skeleton/my_first.feature
|
131
154
|
- features-skeleton/screenshots/test.png
|
132
155
|
- features-skeleton/step_definitions/custom_steps.rb
|
156
|
+
- features-skeleton/step_definitions/repositories/project_object.yml
|
133
157
|
- features-skeleton/support/env.rb
|
134
158
|
- features-skeleton/support/hooks.rb
|
135
159
|
- lib/itms_automation.rb
|