Ifd_Automation 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/bin/Ifd_Automation +30 -0
  3. data/bin/generate.rb +20 -0
  4. data/bin/helper.rb +51 -0
  5. data/features/TestData/testdata.yml +4 -0
  6. data/features/TestSuite/Login/login.feature +6 -0
  7. data/features/step_definitions/lib_steps/login_steps.rb +3 -0
  8. data/features/step_definitions/repositories/ob_login.rb +3 -0
  9. data/features/support/env.rb +102 -0
  10. data/features/support/hooks.rb +57 -0
  11. data/features/support/project_env.rb +51 -0
  12. data/lib/Ifd_Automation/assertion_steps.rb +96 -0
  13. data/lib/Ifd_Automation/email_steps.rb +91 -0
  14. data/lib/Ifd_Automation/javascript_handling_steps.rb +34 -0
  15. data/lib/Ifd_Automation/lib_file_steps.rb +45 -0
  16. data/lib/Ifd_Automation/lib_schema_data_steps.rb +110 -0
  17. data/lib/Ifd_Automation/lib_web_steps.rb +184 -0
  18. data/lib/Ifd_Automation/lib_webservice_steps.rb +44 -0
  19. data/lib/Ifd_Automation/methods/IFD_Assertion_methods.rb +206 -0
  20. data/lib/Ifd_Automation/methods/IFD_Connection.rb +28 -0
  21. data/lib/Ifd_Automation/methods/IFD_email_methods.rb +16 -0
  22. data/lib/Ifd_Automation/methods/IFD_webservice.rb +17 -0
  23. data/lib/Ifd_Automation/methods/core.rb +342 -0
  24. data/lib/Ifd_Automation/methods/database_methods.rb +25 -0
  25. data/lib/Ifd_Automation/methods/db_utils.rb +37 -0
  26. data/lib/Ifd_Automation/methods/error_handling_methods.rb +87 -0
  27. data/lib/Ifd_Automation/methods/javascript_handling_methods.rb +46 -0
  28. data/lib/Ifd_Automation/methods/lib_var.rb +59 -0
  29. data/lib/Ifd_Automation/methods/misc_methods.rb +33 -0
  30. data/lib/Ifd_Automation/methods/required_files.rb +33 -0
  31. data/lib/Ifd_Automation/methods/util.rb +168 -0
  32. data/lib/Ifd_Automation/methods/web_methods.rb +291 -0
  33. data/lib/Ifd_Automation/methods/web_service_methods.rb +63 -0
  34. data/lib/Ifd_Automation/version.rb +5 -0
  35. data/lib/Ifd_Automation.rb +1 -0
  36. metadata +439 -0
@@ -0,0 +1,168 @@
1
+ class Util
2
+
3
+ #-----------------------------------------------------
4
+ # support define and bind variable dynamically
5
+ #-----------------------------------------------------
6
+ $dyn_vars = nil
7
+
8
+ # set value to a variable
9
+ def self.set_var(var_name, var_value)
10
+ if $dyn_vars == nil
11
+ $dyn_vars = binding
12
+ end
13
+ strEval = var_name + "=" + var_value
14
+ eval strEval, $dyn_vars
15
+ end
16
+
17
+ # bind string with $dyn_vars context
18
+ def self.bind_with_dyn_vars(str)
19
+ if $dyn_vars == nil
20
+ $dyn_vars = binding
21
+ end
22
+
23
+ strEval = '"' + str +'"'
24
+ return eval strEval, $dyn_vars
25
+ end
26
+
27
+ # bind json with $dyn_vars context
28
+ def self.bind_json_with_dyn_vars(data_json)
29
+ if data_json.kind_of? Hash
30
+ data_json.each_pair { |k,v|
31
+ data_json[k] = Util.bind_json_with_dyn_vars(v)
32
+ }
33
+ for i in 0..data_json.keys.size - 1
34
+ if data_json.keys[i] != Util.bind_with_dyn_vars(data_json.keys[i])
35
+ k = Util.bind_with_dyn_vars(data_json.keys[i])
36
+ v = data_json[data_json.keys[i]]
37
+
38
+ data_json.delete(data_json.keys[i])
39
+ data_json[k] = v
40
+ end
41
+ end
42
+ return data_json
43
+ elsif data_json.kind_of? Array
44
+ for i in 0..data_json.size - 1
45
+ data_json[i] = Util.bind_json_with_dyn_vars(data_json[i])
46
+ end
47
+ return data_json
48
+ elsif data_json.kind_of? String
49
+ return Util.bind_with_dyn_vars(data_json)
50
+ else
51
+ raise "*** ERROR: unexpected error at cirrus_utils. Util.bind_json_with_dyn_vars function."
52
+ end
53
+ end
54
+
55
+ def self.read_table_data_from_steps_with_header(table_data)
56
+ # The table include header so the loop starting from 1 instead of 0
57
+ json_array = Array.new
58
+ for i in 1..table_data.size - 1
59
+ json_temp = Hash.new
60
+ for j in 0..table_data[0].size - 1
61
+ json_temp[table_data[0][j]] = table_data[i][j]
62
+ end
63
+ json_array << json_temp
64
+ end
65
+
66
+ # get dyn_vars if any
67
+ json_array = Util.bind_json_with_dyn_vars(json_array)
68
+
69
+ # replace [[TODAY]] with current time
70
+ json_array = Util.replace_json_with_date_holders(json_array)
71
+ json_array
72
+ end
73
+
74
+ def self.replace_json_with_date_holders(json_string)
75
+ # replace [[TODAY]] = current date
76
+ # replace [[NULL]] = nil
77
+
78
+ if json_string.kind_of? Hash
79
+ #puts "Hash: #{json_string}"
80
+ json_string.each_pair {|k, v|
81
+ json_string[k] = replace_json_with_date_holders(v)
82
+ }
83
+ return json_string
84
+ elsif json_string.kind_of? Array
85
+ #puts "Array: #{json_string}"
86
+ for i in 0..json_string.size - 1
87
+ json_string[i] = replace_json_with_date_holders(json_string[i])
88
+ end
89
+ return json_string
90
+ elsif json_string.kind_of? String
91
+ #puts "String: #{json_string}"
92
+ if json_string.include? "[[TODAY]]"
93
+ json_string = eval json_string.gsub("[[TODAY]]", "Date.today")
94
+ json_string = json_string.strftime('%Y-%m-%d')
95
+ end
96
+ if json_string == "[[NULL]]"
97
+ json_string = nil
98
+ end
99
+
100
+ return json_string
101
+ else
102
+ raise "*** ERROR: unexpected error at Environment.replace_json_with_date_holder function."
103
+ end
104
+ end
105
+
106
+ def self.convert_to_symbol_json(json)
107
+ begin
108
+ json = JSON.parse(json)
109
+ rescue
110
+ end
111
+
112
+ if json.kind_of? Hash
113
+ json_sym = Hash.new()
114
+ json.each {|k,v|
115
+ json_sym[k.downcase.to_sym] = convert_to_symbol_json(v)
116
+ }
117
+ return json_sym
118
+ elsif json.kind_of? Array
119
+ array_sym = Array.new()
120
+ json.each {|temp|
121
+ array_sym << convert_to_symbol_json(temp)
122
+ }
123
+ return array_sym
124
+ else
125
+ return json
126
+ end
127
+ end
128
+
129
+ def self.generate_condition_statement(condition_json, wildcard_type = nil)
130
+ v_condition = ''
131
+
132
+ condition_json.each_pair { |col, vals|
133
+ #puts "DatabaseMethods.generate_condition_statement.col: #{col}"
134
+ #puts "DatabaseMethods.generate_condition_statement.vals: #{vals}"
135
+ condition = ''
136
+ if vals.nil?
137
+ condition = "#{col} is null"
138
+ # elsif self.metadata[:datetime_cols].include? col.downcase.to_sym
139
+ # condition = "#{col} >= to_date(#{DB_Utils.sql_value_format(vals)}, 'yyyy-mm-dd') AND #{col} < to_date(#{DB_Utils.sql_value_format(vals)}, 'yyyy-mm-dd') + 1"
140
+ else
141
+ vals = vals.to_s.split(',') unless vals.kind_of? Array
142
+
143
+ vals = vals.map { |val|
144
+ if wildcard_type.nil?
145
+ DB_Utils.sql_value_format(val)
146
+ else
147
+ case wildcard_type.to_s.downcase.to_sym
148
+ when :prefix
149
+ DB_Utils.sql_value_format_prefix_wildcard(val)
150
+ when :suffix
151
+ DB_Utils.sql_value_format_suffix_wildcard(val)
152
+ when :wildcard
153
+ DB_Utils.sql_value_format_wildcard(val)
154
+ else
155
+ DB_Utils.sql_value_format(val)
156
+ end
157
+ end
158
+ }
159
+ vals.each { |val|
160
+ temp_condition = val == 'null' ? "#{col} is #{val}" : "#{col} like #{val}"
161
+ condition += condition.empty? ? temp_condition : " OR #{temp_condition}"
162
+ }
163
+ end
164
+ v_condition += v_condition.empty? ? "(#{condition})" : " AND (#{condition})"
165
+ }
166
+ v_condition
167
+ end
168
+ end
@@ -0,0 +1,291 @@
1
+ require 'net/https'
2
+ require_relative 'required_files'
3
+
4
+ # This file contains assertion methods which are called from assertion_steps.rb
5
+
6
+ # Method to return page title
7
+ def get_page_title
8
+ page.title
9
+ end
10
+
11
+ # Method to verify title
12
+ # param 1 : String : expected title
13
+ # param 2 : Boolean : test case [true or flase]
14
+ def check_title(title, test_case)
15
+ page_title = get_page_title
16
+ if test_case
17
+ if page_title != "#{title}"
18
+ raise TestCaseFailed, "Page Title Not Matched, Actual Page Title : #{page_title}, Expected Page Title : #{title}"
19
+ end
20
+ else
21
+ if page_title == "#{title}"
22
+ raise TestCaseFailed, "Page Title Matched, Actual Page Title: #{page_title}"
23
+ end
24
+ end
25
+ end
26
+
27
+ # Method to verify partial title
28
+ # param 1 : String : partial title string
29
+ # param 2 : Boolean : test case [true or flase]
30
+ def check_partial_title(partial_text_title, test_case)
31
+ page_title = get_page_title
32
+ if test_case
33
+ if not page_title.include? "#{partial_text_title}"
34
+ raise TestCaseFailed, 'Partial Page Title Not Present'
35
+ end
36
+ else
37
+ if page_title.include? "#{partial_text_title}"
38
+ raise TestCaseFailed, 'Page Title Matched'
39
+ end
40
+ end
41
+ end
42
+
43
+
44
+ # Open Browser with config-able maximize browser option
45
+ def execute_openbrowser url_site #, redirect
46
+ begin
47
+ if $_CFWEB['Maximize Browser'] == true
48
+ page.driver.browser.manage.window.maximize
49
+ end
50
+ rescue StandardError => myStandardError
51
+ put_log "\n>>> Error: #{myStandardError}"
52
+ end
53
+
54
+ if url_site == ""
55
+ visit("")
56
+ else
57
+ visit(url_site)
58
+ end
59
+ end
60
+
61
+ # Click on element
62
+ def execute_click element
63
+ foundElement = find_object(element)
64
+ if foundElement != nil
65
+ page.driver.execute_script('window.focus();')
66
+ startTime = Time.new.to_i
67
+ begin
68
+ sleep(0.5)
69
+ currentTime = Time.new.to_i
70
+ end while (foundElement.native.enabled? == false and (currentTime - startTime) < $_CFWEB['Wait Time'])
71
+ page.driver.browser.execute_script("arguments[0].scrollIntoView(true);", foundElement.native)
72
+ page.driver.browser.mouse.click(foundElement.native)
73
+ else
74
+ put_log "\nError >> Not found object: #{element}"
75
+ end
76
+ end
77
+
78
+ # Set option state with state value True/False
79
+ def execute_setstate element, state
80
+ foundElement = find_object(element)
81
+ if foundElement != nil
82
+ if state.upcase == "TRUE"
83
+ foundElement.set(true)
84
+ else
85
+ foundElement.set(false)
86
+ end
87
+ else
88
+ put_log "\nError >> Not found object: #{element}"
89
+ exit
90
+ end
91
+ end
92
+
93
+ #Enter text to element
94
+ def execute_settext element, text
95
+ foundElement = find_object(element)
96
+ if foundElement != nil
97
+ begin
98
+ foundElement.set(text)
99
+ #page.driver.browser.mouse.click(foundElement.native)
100
+ #foundElement.native.send_keys(text)
101
+ # put_log "\nfoundElement.value: #{foundElement.value}"
102
+ #foundElement.native.send_keys([:tab])
103
+ rescue StandardError => myStandardError
104
+ put_log "\n>>> Error: #{myStandardError}"
105
+ end
106
+ else
107
+ put_log "\nError >> Not found object: #{element}"
108
+ exit
109
+ end
110
+ end
111
+
112
+ # Move mouse to element then click
113
+ def execute_mousehoverandclick element
114
+ foundElement = find_object(element)
115
+ if foundElement != nil
116
+ page.driver.browser.mouse.move_to(foundElement.native, element)
117
+ page.driver.browser.mouse.click(foundElement.native)
118
+ sleep(2)
119
+ else
120
+ put_log "\nError >> Not found object: #{element}"
121
+ end
122
+ end
123
+
124
+ def execute_drag_to_new_object from_element, element
125
+ found_from_element = find_object(from_element)
126
+ foundElement = find_object(element)
127
+ if foundElement != nil and found_from_element != nil
128
+ found_from_element.drag_to(foundElement)
129
+ end
130
+ end
131
+
132
+ def execute_hover_mouse_on element
133
+ foundElement = find_object(element)
134
+ if foundElement != nil
135
+ page.driver.browser.mouse.move_to(foundElement.native, element)
136
+ sleep 1
137
+ else
138
+ put_log "\nError >> Not found object: #{element}"
139
+ end
140
+ end
141
+
142
+ def execute_click_to_upload object, file_name
143
+ upload_file = ($test_data_dir + file_name).gsub!(/\//, "\\")
144
+ foundElement = find_object(object)
145
+ if foundElement != nil
146
+ call_step("I click on \"#{object}\"")
147
+ window = RAutomation::Window.new(:title => /File Upload/)
148
+ window.text_field(:class => "Edit").set(upload_file)
149
+ window.button(:value => "&Open").click
150
+ else
151
+ raise "Error >> Object #{object} not found.!"
152
+ end
153
+ end
154
+
155
+ # Check exists
156
+ def execute_checkexists negate, element, timeout
157
+ origin_timeout = $_CFWEB['Wait Time']
158
+ set_time_out(timeout)
159
+ foundElement = find_object(element)
160
+ set_time_out(origin_timeout)
161
+ #put_log "\nexecute_checkexists : #{foundElement}"
162
+ check = false
163
+ if foundElement != nil
164
+ check = true
165
+ end
166
+
167
+ negate = negate.strip if negate != nil
168
+ #puts "---------->#{negate}"
169
+ if negate == "not"
170
+ # check.should_not eq true
171
+ expect(check).not_to eql true
172
+ elsif check.should eq true
173
+ expect(check).to eq true
174
+ end
175
+ end
176
+
177
+ # Send Key
178
+ def execute_sendkeys element, text
179
+ foundElement = find_object(element)
180
+ if foundElement != nil
181
+ if foundElement[:disabled] == ''
182
+ if text == ":down"
183
+ foundElement.native.send_keys([:down])
184
+ elsif text == ":enter"
185
+ foundElement.native.send_keys([:enter])
186
+ elsif text == ":tab"
187
+ foundElement.native.send_keys([:tab])
188
+ else
189
+ foundElement.native.send_keys(text)
190
+ end
191
+ end
192
+ else
193
+ put_log "\nError >> Not found object: #{element}"
194
+ exit
195
+ end
196
+ end
197
+
198
+ # method to scroll page to top or end
199
+ def scroll_page(to)
200
+ if to == 'end'
201
+ page.driver.execute_script('window.scrollTo(0,Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight));')
202
+ elsif to == 'top'
203
+ page.driver.execute_script('window.scrollTo(Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight),0);')
204
+ else
205
+ raise "Exception : Invalid Direction (only scroll \"top\" or \"end\")"
206
+ end
207
+ end
208
+
209
+ # Method to return element status - enabled?
210
+ # param 1 : String : Locator type (id, name, class, xpath, css)
211
+ # param 2 : String : Locator value
212
+ def is_element_enabled(element)
213
+ foundElement = find_object(element)
214
+ expect(foundElement).to be_visible
215
+ end
216
+
217
+ # Element enabled checking
218
+ # param 1 : String : Expected element text
219
+ # param 2 : Boolean : test case [true or flase]
220
+ def check_element_enable(element, test_case)
221
+ result = is_element_enabled(element)
222
+
223
+ if test_case
224
+ raise TestCaseFailed, 'Element Not Enabled' unless result
225
+ else
226
+ raise TestCaseFailed, 'Element Enabled' unless !result
227
+ end
228
+ end
229
+
230
+
231
+ # method to assert checkbox check/uncheck
232
+ # param 1 : String : Locator value
233
+ # param 2 : Boolean : test case [true or flase]
234
+ def is_checkbox_checked(element, should_be_checked = true)
235
+ foundElement = find_object(element)
236
+ checkbox = expect(foundElement).to be_checked
237
+
238
+ if !checkbox && should_be_checked
239
+ raise TestCaseFailed, 'Checkbox is not checked'
240
+ elsif checkbox && !should_be_checked
241
+ raise TestCaseFailed, 'Checkbox is checked'
242
+ end
243
+ end
244
+
245
+ # method to assert radio button selected/unselected
246
+ # param 1 : String : Locator value
247
+ # param 2 : Boolean : test case [true or flase]
248
+ def is_radio_button_selected(element, should_be_selected = true)
249
+ foundElement = find_object(element)
250
+ radio = expect(foundElement).to be_checked
251
+
252
+ if !radio && should_be_selected
253
+ raise TestCaseFailed, 'Radio Button not selected'
254
+ elsif radio && !should_be_selected
255
+ raise TestCaseFailed, 'Radio Button is selected'
256
+ end
257
+ end
258
+
259
+ def double_click(element)
260
+ foundElement = find_object(element)
261
+ page.driver.browser.mouse.double_click(foundElement.native)
262
+ end
263
+
264
+ # Method to maximize browser
265
+ def maximize_browser
266
+ page.driver.browser.manage.window.maximize
267
+ end
268
+
269
+ # Method to switch to window by title
270
+ def switch_to_window_by_title window_title
271
+ $previous_window = page.driver.browser.window_handle
272
+ window_found = false
273
+ page.driver.browser.window_handles.each{ |handle|
274
+ page.driver.browser.switch_to.window handle
275
+ if page.title == window_title
276
+ window_found = true
277
+ break
278
+ end
279
+ }
280
+ raise "Window having title \"#{window_title}\" not found" if not window_found
281
+ end
282
+
283
+ # Method to resize browser
284
+ def resize_browser(width, heigth)
285
+ page.driver.browser.manage.window.resize_to(width, heigth)
286
+ end
287
+
288
+ def take_screenshot
289
+ cur_time = Time.now.strftime('%Y%m%d%H%M%S%L')
290
+ page.driver.browser.save_screenshot($test_data_dir + '/screenshots/screenshot' + cur_time + '.png')
291
+ end
@@ -0,0 +1,63 @@
1
+ require 'rest-client'
2
+ class WebServiceMethods
3
+
4
+ def self.get_response_code(url, timeout)
5
+ response = HTTParty.get url, {timeout => timeout}
6
+ return response.code
7
+ end
8
+
9
+ def self.url_reach? (url, timeout)
10
+ response_code = get_response_code(url, timeout)
11
+ if response_code/10 ==2
12
+ return true
13
+ else
14
+ return false
15
+ end
16
+ end
17
+
18
+ def self.send_put_request(url, data)
19
+ begin
20
+ response = HTTParty.put url, {:body => data, :timeout => 180000}
21
+ return response
22
+ rescue => e
23
+ raise "*** ERROR: when sending put request to '#{url}'. Info: \n\n #{e.message}"
24
+ end
25
+ end
26
+
27
+ def self.send_post_request(url, data)
28
+ begin
29
+ puts "*** #{'WebServiceMethods.send_post_request.url'.ljust(47,' ')}: #{url}"
30
+ puts "WebServiceMethods.send_post_request.data: #{data}"
31
+ response = HTTParty.post url, {:body => data, :timeout => 180000}
32
+ return response
33
+ rescue => e
34
+ raise "*** ERROR: when sending put request to '#{url}'. Info: \n\n #{e.message}"
35
+ end
36
+ end
37
+
38
+ def self.send_XML_post_request(url, data)
39
+ begin
40
+ # puts "*** #{'WebServiceMethods.send_post_request.url'.ljust(47,' ')}: #{url}"
41
+ # puts "WebServiceMethods.send_post_request.data: #{data}"
42
+ response = RestClient.post url, data, :content_type => "text/xml", :timeout => 180000
43
+ return response
44
+ rescue => e
45
+ raise "*** ERROR: when sending put request to '#{url}'. Info: \n\n #{e.message}"
46
+ end
47
+ end
48
+
49
+ def self.send_get_request(url)
50
+ begin
51
+ response = HTTParty.get url, timeout: 180000
52
+ return response
53
+ rescue => e
54
+ raise "*** ERROR: when sending get request to '#{url}'. Info: \n\n #{e.message}"
55
+ end
56
+ end
57
+
58
+ def self.verify_response(reponse)
59
+ if response.code/100 != 2
60
+ raise "*** ERROR: when processing the request. More info: \n\n #{response.body.to_s}"
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,5 @@
1
+ module Ifd
2
+ module Automation
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ Dir[File.dirname(__FILE__) + '/Ifd_Automation/*.rb'].each { |file| require file }