friendly-cukes 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/DETAILED_DESCRIPTION.md +235 -0
  4. data/Gemfile +17 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +108 -0
  7. data/Rakefile +2 -0
  8. data/bin/build-extractor +69 -0
  9. data/bin/friendly-cukes +48 -0
  10. data/friendly-cukes.gemspec +41 -0
  11. data/lib/friendly/build_extractor.rb +647 -0
  12. data/lib/friendly/cukes.rb +29 -0
  13. data/lib/friendly/cukes/framework/Gemfile +16 -0
  14. data/lib/friendly/cukes/framework/Gemfile.lock +113 -0
  15. data/lib/friendly/cukes/framework/Rakefile.rb +19 -0
  16. data/lib/friendly/cukes/framework/config/config.yml +87 -0
  17. data/lib/friendly/cukes/framework/config/cucumber.yml +49 -0
  18. data/lib/friendly/cukes/framework/coverage/.last_run.json +5 -0
  19. data/lib/friendly/cukes/framework/coverage/.resultset.json +3519 -0
  20. data/lib/friendly/cukes/framework/coverage/.resultset.json.lock +0 -0
  21. data/lib/friendly/cukes/framework/coverage/rcov/assets/0.2.3/jquery-1.3.2.min.js +19 -0
  22. data/lib/friendly/cukes/framework/coverage/rcov/assets/0.2.3/jquery.tablesorter.min.js +15 -0
  23. data/lib/friendly/cukes/framework/coverage/rcov/assets/0.2.3/print.css +12 -0
  24. data/lib/friendly/cukes/framework/coverage/rcov/assets/0.2.3/rcov.js +42 -0
  25. data/lib/friendly/cukes/framework/coverage/rcov/assets/0.2.3/screen.css +270 -0
  26. data/lib/friendly/cukes/framework/coverage/rcov/index.html +392 -0
  27. data/lib/friendly/cukes/framework/coverage/rcov/library-app_init-app_driver_rb.html +98 -0
  28. data/lib/friendly/cukes/framework/coverage/rcov/library-app_utils-data_file_names_rb.html +65 -0
  29. data/lib/friendly/cukes/framework/coverage/rcov/library-app_utils-page_utils_rb.html +533 -0
  30. data/lib/friendly/cukes/framework/coverage/rcov/library-generic-create_log_rb.html +521 -0
  31. data/lib/friendly/cukes/framework/coverage/rcov/library-generic-custom_html_report_rb.html +2522 -0
  32. data/lib/friendly/cukes/framework/coverage/rcov/library-generic-datetime_library_rb.html +296 -0
  33. data/lib/friendly/cukes/framework/coverage/rcov/library-generic-file_library_rb.html +995 -0
  34. data/lib/friendly/cukes/framework/coverage/rcov/library-generic-performance_report_rb.html +1613 -0
  35. data/lib/friendly/cukes/framework/coverage/rcov/library-generic-read_from_yml_rb.html +944 -0
  36. data/lib/friendly/cukes/framework/coverage/rcov/object_repository-desktop-gem_search_rb.html +773 -0
  37. data/lib/friendly/cukes/framework/coverage/rcov/object_repository-desktop-google_search_rb.html +230 -0
  38. data/lib/friendly/cukes/framework/coverage/rcov/object_repository-mobile-mobile_google_search_rb.html +230 -0
  39. data/lib/friendly/cukes/framework/coverage/rcov/step_definitions-desktop-gem_search_rb.html +188 -0
  40. data/lib/friendly/cukes/framework/coverage/rcov/step_definitions-desktop-google_search_steps_rb.html +167 -0
  41. data/lib/friendly/cukes/framework/coverage/rcov/step_definitions-mobile-mobile_google_search_steps_rb.html +167 -0
  42. data/lib/friendly/cukes/framework/coverage/rcov/support-browser_settings_rb.html +851 -0
  43. data/lib/friendly/cukes/framework/coverage/rcov/support-env_rb.html +242 -0
  44. data/lib/friendly/cukes/framework/coverage/rcov/support-hooks_rb.html +878 -0
  45. data/lib/friendly/cukes/framework/coverage/rcov/support-html_formatter_rb.html +230 -0
  46. data/lib/friendly/cukes/framework/features/desktop/google_search/google_search.feature +19 -0
  47. data/lib/friendly/cukes/framework/features/desktop/rubygems_search/gem_name_tc_04.yml +2 -0
  48. data/lib/friendly/cukes/framework/features/desktop/rubygems_search/gem_search.feature +37 -0
  49. data/lib/friendly/cukes/framework/features/desktop/test_data/gem_name.yml +2 -0
  50. data/lib/friendly/cukes/framework/features/mobile/google_search/mobile_google_search.feature +19 -0
  51. data/lib/friendly/cukes/framework/library/app_init/app_init.rb +13 -0
  52. data/lib/friendly/cukes/framework/library/app_utils/data_file_names.rb +2 -0
  53. data/lib/friendly/cukes/framework/library/app_utils/page_utils.rb +157 -0
  54. data/lib/friendly/cukes/framework/library/generic/app_logo_1.png +0 -0
  55. data/lib/friendly/cukes/framework/library/generic/create_log.rb +154 -0
  56. data/lib/friendly/cukes/framework/library/generic/custom_html_report.rb +852 -0
  57. data/lib/friendly/cukes/framework/library/generic/datetime_library.rb +79 -0
  58. data/lib/friendly/cukes/framework/library/generic/file_library.rb +311 -0
  59. data/lib/friendly/cukes/framework/library/generic/performance_report.rb +518 -0
  60. data/lib/friendly/cukes/framework/library/generic/read_from_yml.rb +294 -0
  61. data/lib/friendly/cukes/framework/object_repository/desktop/desktop_web_object_repo.rb +50 -0
  62. data/lib/friendly/cukes/framework/object_repository/mobile/mobile_web_object_repo.rb +22 -0
  63. data/lib/friendly/cukes/framework/page_objects/desktop/gem_search.rb +213 -0
  64. data/lib/friendly/cukes/framework/page_objects/desktop/google_search.rb +53 -0
  65. data/lib/friendly/cukes/framework/page_objects/mobile/mobile_google_search.rb +53 -0
  66. data/lib/friendly/cukes/framework/step_definitions/desktop/gem_search.rb +43 -0
  67. data/lib/friendly/cukes/framework/step_definitions/desktop/google_search_steps.rb +36 -0
  68. data/lib/friendly/cukes/framework/step_definitions/mobile/mobile_google_search_steps.rb +36 -0
  69. data/lib/friendly/cukes/framework/support/browser_settings.rb +264 -0
  70. data/lib/friendly/cukes/framework/support/env.rb +65 -0
  71. data/lib/friendly/cukes/framework/support/hooks.rb +274 -0
  72. data/lib/friendly/cukes/framework/support/html_formatter.rb +57 -0
  73. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_33/app_env.log +15 -0
  74. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_33/custom_report/detailed_report/app_logo_1.png +0 -0
  75. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_33/custom_report/detailed_report/desktop_gem_search.html +647 -0
  76. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_33/custom_report/detailed_report/desktop_google_search.html +590 -0
  77. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_33/custom_report/report_home.html +593 -0
  78. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_33/desktop_rubygems_search.log +84 -0
  79. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_33/report_21_05_2015-11_04_54.html +472 -0
  80. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_33/report_21_05_2015-11_04_54.json +299 -0
  81. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_37/app_env.log +15 -0
  82. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_37/desktop_google_search.log +22 -0
  83. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_37/report_21_05_2015-11_03_49.html +472 -0
  84. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-11_03_37/report_21_05_2015-11_03_49.json +155 -0
  85. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-17_28_10/app_env.log +15 -0
  86. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-17_28_10/mobile_google_search.log +22 -0
  87. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-17_28_10/report_21_05_2015-17_29_26.html +472 -0
  88. data/lib/friendly/cukes/framework/test_result/test_report_21_05_2015-17_28_10/report_21_05_2015-17_29_26.json +143 -0
  89. data/lib/friendly/cukes/version.rb +61 -0
  90. metadata +309 -0
@@ -0,0 +1,294 @@
1
+ =begin
2
+ *Name : Read_From_YML
3
+ *Description : class definition for reading data value from yml file
4
+ *Author : Chandra sekaran
5
+ *Creation Date : 23/08/2014
6
+ *Updation Date :
7
+ =end
8
+
9
+ module CUKES
10
+ class Read_From_YML
11
+ include FileLibrary # module that define methods for all file manipulations
12
+
13
+ # Description : opens the yml file
14
+ # Author : Chandra sekaran
15
+ # Arguments :
16
+ # str_file_path : relative path of the yml file
17
+ #
18
+ def initialize(str_file_path = "")
19
+ raise "Exception : ReadFromYML instance cannot be created with filename" if str_file_path.nil?
20
+ raise "Exception : file does not exists #{str_file_path}" if !is_file_exists(str_file_path)
21
+ @yml = open_yml_file(str_file_path)
22
+ @yml_file_path = str_file_path
23
+ rescue Exception => ex
24
+ $log.error("Error in opening file '#{str_file_path}' : #{ex}")
25
+ exit
26
+ end
27
+
28
+ # Description : returns the value for the given input ypath
29
+ # Author : Chandra sekaran
30
+ # Arguments :
31
+ # str_ypath : ypath of the key element
32
+ # Return value :
33
+ # req_val : value of the key element
34
+ #
35
+ def get_value(str_ypath = "")
36
+ raise "Exception : ReadFromYML - ypath cannot be empty" if str_ypath.nil?
37
+ req_val = traverse_yml(str_ypath)
38
+ return req_val
39
+ rescue Exception => ex
40
+ $log.error("Error in getting value for ypath '#{str_ypath}' : #{ex}")
41
+ exit
42
+ end
43
+
44
+ # Description : returns the hash value for the given unique key
45
+ # Author : Chandra sekaran
46
+ # Arguments :
47
+ # str_key : name of the unique key
48
+ # Return value :
49
+ # @req_hash : hash value of the unique key element
50
+ #
51
+ def get_values(str_key)
52
+ raise "Exception : ReadFromYML - key cannot be empty" if str_key.nil?
53
+ @yml.each do |key, value|
54
+ @req_hash = ''
55
+ if key == str_key
56
+ @req_hash = value
57
+ break
58
+ else
59
+ if value.size >= 1 and value.class.to_s == "Hash"
60
+ @req_hash = traverse_hash(value, str_key)
61
+ return @req_hash if @req_hash.class.to_s == "Hash"
62
+ end
63
+ end
64
+ end
65
+ rescue Exception => ex
66
+ $log.error("Error in getting value for '#{str_key}' : #{ex}")
67
+ exit
68
+ end
69
+
70
+ # Description : returns the hash from the given input hash that matches the given key
71
+ # Author : Chandra sekaran
72
+ # Arguments :
73
+ # hash_val : hash element
74
+ # req_key : key to be found inside the hash element
75
+ # Return value :
76
+ # @hash_value : value of the key element
77
+ #
78
+ def traverse_hash(hash_val, req_key)
79
+ hash_val.each do |key, value|
80
+ traverse_hash(value, req_key) if !value.nil? and value.size >= 1 and value.class.to_s == "Hash"
81
+ if key == req_key
82
+ @hash_value = value
83
+ break
84
+ end
85
+ end
86
+ return @hash_value
87
+ rescue Exception => ex
88
+ $log.error("Error in traversing hash '#{hash_val}' for '#{req_key}' : #{ex}")
89
+ exit
90
+ end
91
+
92
+ # Description : traverses the yml file and gets the value for the given input ypath
93
+ # Author : Chandra sekaran
94
+ # Arguments :
95
+ # str_ypath : ypath of the key element
96
+ # Return value :
97
+ # str_value : value of the key element
98
+ #
99
+ def traverse_yml(str_ypath)
100
+ str_value = ''
101
+ arr_key = str_ypath.split('/')
102
+ num_level = arr_key.size
103
+
104
+ case num_level
105
+ when 1
106
+ str_value = @yml[arr_key[0]]
107
+ when 2
108
+ str_value = @yml[arr_key[0]][arr_key[1]]
109
+ when 3
110
+ str_value = @yml[arr_key[0]][arr_key[1]][arr_key[2]]
111
+ when 4
112
+ str_value = @yml[arr_key[0]][arr_key[1]][arr_key[2]][arr_key[3]]
113
+ when 5
114
+ str_value = @yml[arr_key[0]][arr_key[1]][arr_key[2]][arr_key[3]][arr_key[4]]
115
+ when 6
116
+ str_value = @yml[arr_key[0]][arr_key[1]][arr_key[2]][arr_key[3]][arr_key[4]][arr_key[5]]
117
+ when 7
118
+ str_value = @yml[arr_key[0]][arr_key[1]][arr_key[2]][arr_key[3]][arr_key[4]][arr_key[5]][arr_key[6]]
119
+ else
120
+ raise "Given YML path cannot be traversed"
121
+ end
122
+ return str_value
123
+ rescue Exception => ex
124
+ $log.error("Error in traverse_yml '#{str_ypath}' : #{ex}")
125
+ exit
126
+ end
127
+
128
+ # Description : returns the profile name that is currently available
129
+ # Author : Chandra sekaran
130
+ # Arguments :
131
+ # str_box : profile name whether development/test
132
+ # Return value :
133
+ # str_key : key name of the profile
134
+ #
135
+ def get_specific_profile(str_box)
136
+ str_key = ""
137
+ # iterates through the @yml content to find the BOX key and reads the value of :in_use key and returns the key
138
+ # if its value is "no"
139
+ @yml.each do |key, value|
140
+ value.each do |k, v|
141
+ if k.downcase == BOX.downcase
142
+ v.each do |k1, v1|
143
+ if k1.downcase.include? str_box.downcase
144
+ v1.each do |k2, v2|
145
+ if k2.downcase.include? "in_use"
146
+ if v2.downcase == "no"
147
+ str_key = k1
148
+ set_value("application/#{BOX}/#{str_key}/in_use", "yes") # updates the key values to "yes"
149
+ change_execution_count("environment/parallel_execution_count", get_value("application/#{BOX}/#{str_key}/in_use"))
150
+ break
151
+ end
152
+ end
153
+ end
154
+ break if str_key != ""
155
+ end
156
+ break if str_key != ""
157
+ end
158
+ break if str_key != ""
159
+ end
160
+ break if str_key != ""
161
+ end
162
+ break if str_key != ""
163
+ end
164
+ raise "All the profiles (for Login credentials) are in use and hence stopping the execution for #{BOX}/#{str_box}" if str_key == ""
165
+ $log.info("Currently using '#{str_key}' under '#{str_box}' profile under '#{BOX}' box")
166
+ str_key
167
+ rescue Exception => ex
168
+ $log.error("Error in getting free BOX config values : #{ex}")
169
+ exit
170
+ end
171
+
172
+ # Description : returns the box and profile names that is currently available
173
+ # Author : Chandra sekaran
174
+ # Arguments :
175
+ # str_box : profile name whether development/test
176
+ # Return value :
177
+ # str_box : key name of the box
178
+ # str_key : key name of the profile
179
+ #
180
+ def get_any_profile(str_box)
181
+ str_key = ""
182
+ str_box_avail = ""
183
+ # iterates through the @yml content to find the BOX key and reads the value of :in_use key and returns the key
184
+ # if its value is "no"
185
+ @yml.each do |key, value|
186
+ value.each do |k, v|
187
+ str_box_avail = k
188
+ v.each do |k1, v1|
189
+ if k1.downcase.include? str_box.downcase
190
+ v1.each do |k2, v2|
191
+ if k2.downcase.include? "in_use"
192
+ if v2.downcase == "no"
193
+ str_key = k1
194
+ set_value("application/#{str_box_avail}/#{str_key}/in_use", "yes") # updates the key values to "yes"
195
+ change_execution_count("environment/parallel_execution_count", get_value("application/#{str_box_avail}/#{str_key}/in_use"))
196
+ break
197
+ end
198
+ end
199
+ break if str_key != ""
200
+ end
201
+ #break if str_key != ""
202
+ end
203
+ break if str_key != ""
204
+ end
205
+ break if str_key != ""
206
+ end
207
+ break if str_key != ""
208
+ end
209
+ raise "All the profiles (for Login credentials) are in use and hence stopping the execution for #{str_box}" if str_key == ""
210
+ $log.info("Currently using '#{str_key}' under '#{str_box}' profile under '#{str_box_avail}' box")
211
+ return str_box_avail, str_key
212
+ rescue Exception => ex
213
+ $log.error("Error in getting free PROFILE config values : #{ex}")
214
+ exit
215
+ end
216
+
217
+ # Description : updates the parallel execution counter in config.yml file
218
+ # Author : Gomathi
219
+ # Arguments :
220
+ # str_ypath : ypath of yml content
221
+ # str_value : boolean value to update the counter
222
+ #
223
+ def change_execution_count(str_ypath, str_value)
224
+ if str_value.downcase == "yes"
225
+ set_value(str_ypath, get_value(str_ypath) + 1)
226
+ else
227
+ set_value(str_ypath, get_value(str_ypath) - 1)
228
+ end
229
+ end
230
+
231
+ # Description : sets the value for the given ypath
232
+ # Author : Chandra sekaran
233
+ # Arguments :
234
+ # str_ypath : ypath of yml content
235
+ # Return value :
236
+ # str_value : value to be set for ypath
237
+ #
238
+ def set_value(str_ypath, str_value = "")
239
+ raise "Exception : ReadFromYML - ypath cannot be empty" if str_ypath.nil?
240
+
241
+ @yml = open_yml_file(@yml_file_path)
242
+
243
+ arr_key = str_ypath.split('/')
244
+ num_level = arr_key.size
245
+
246
+ case num_level
247
+ when 1
248
+ @yml[arr_key[0]] = str_value
249
+ when 2
250
+ @yml[arr_key[0]][arr_key[1]] = str_value
251
+ when 3
252
+ @yml[arr_key[0]][arr_key[1]][arr_key[2]] = str_value
253
+ when 4
254
+ @yml[arr_key[0]][arr_key[1]][arr_key[2]][arr_key[3]] = str_value
255
+ when 5
256
+ @yml[arr_key[0]][arr_key[1]][arr_key[2]][arr_key[3]][arr_key[4]] = str_value
257
+ when 6
258
+ @yml[arr_key[0]][arr_key[1]][arr_key[2]][arr_key[3]][arr_key[4]][arr_key[5]] = str_value
259
+ when 7
260
+ @yml[arr_key[0]][arr_key[1]][arr_key[2]][arr_key[3]][arr_key[4]][arr_key[5]][arr_key[6]] = str_value
261
+ else
262
+ raise "Given YML path cannot be traversed"
263
+ end
264
+ File.open(@yml_file_path, 'w') { |h| h.write @yml.to_yaml } # updates the yml file content with the updated hash
265
+ @yml = open_yml_file(@yml_file_path)
266
+ rescue Exception => ex
267
+ $log.error("Error in setting value for ypath '#{str_ypath}' : #{ex}")
268
+ exit
269
+ end
270
+
271
+ # Description : resets all the unused profiles
272
+ # Author : Chandra sekaran
273
+ #
274
+ def release_all_profiles
275
+ @yml.each do |key, value|
276
+ if key.downcase == "application"
277
+ value.each do |k, v|
278
+ v.each do |k1, v1|
279
+ v1.each do |k2, v2|
280
+ if k2.downcase.include? "in_use"
281
+ set_value("#{key}/#{k}/#{k1}/#{k2}", "no") if v2.downcase == "yes" # set "no" to in_use key for all profiles
282
+ end
283
+ end
284
+ end
285
+ end
286
+ end
287
+ end
288
+ rescue Exception => ex
289
+ $log.error("Error in releasing all profiles : #{ex}")
290
+ exit
291
+ end
292
+
293
+ end
294
+ end
@@ -0,0 +1,50 @@
1
+ =begin
2
+ *Name : ObjectRepository
3
+ *Description : module that holds the desktop web page object definitions
4
+ *Author : Chandra sekaran
5
+ *Creation Date : 08/05/2015
6
+ *Modification Date:
7
+ =end
8
+
9
+ module CUKES
10
+ module ObjectRepository
11
+
12
+ # object repository for desktop Google page
13
+ module OR_DesktopGoogle
14
+ include PageObject
15
+
16
+ text_field(:textfield_search, :name => "q")
17
+ button(:button_search, :name => "btnG")
18
+ div(:div_result, :id => "search")
19
+ link(:link_bet365, :href => "http://www.bet365.com/")
20
+ end
21
+
22
+ # object repository for desktop Rubygems page
23
+ module OR_RubyGems
24
+ include PageObject
25
+
26
+ # home page objects
27
+ div(:div_header_image, :xpath => "html/body/div/div[1]")
28
+
29
+ link(:link_signin, :href => "/sign_in")
30
+ text_field(:textfield_email, :id => "session_who")
31
+ text_field(:textfield_password, :id => "session_password")
32
+ button(:button_sign_in, :class => "form__submit")
33
+ link(:link_menu, :class => "header__popup-link")
34
+ link(:link_signout, :href => "/sign_out")
35
+ text_field(:input_search, :id => "query")
36
+
37
+ # gem list page objects
38
+ h1(:h1_title, :xpath => "//h1[contains(@class,'page__heading')]")
39
+ div(:div_search_result, :class => "l-wrap--b")
40
+
41
+ # gem description page objects
42
+ text_fields(:textfield_gem_install, :xpath => "//div[@class='gem__code-wrap']/input")
43
+ pre(:pre_gemfile, :xpath => "//div[@class='bundler']/pre")
44
+ div(:div_gem_version, :class => "versions")
45
+ div(:div_gem_runtime_dependencies, :id => "runtime_dependencies")
46
+ div(:div_gem_ruby_dependencies, :id => "ruby_dependency")
47
+ div(:div_gem_development_dependencies, :id => "development_dependencies")
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,22 @@
1
+ =begin
2
+ *Name : ObjectRepository
3
+ *Description : module that holds the mobile web page object definitions
4
+ *Author : Chandra sekaran
5
+ *Creation Date : 08/05/2015
6
+ *Modification Date:
7
+ =end
8
+
9
+ module CUKES
10
+ module ObjectRepository
11
+
12
+ # object repository for mobile Google page
13
+ module OR_MobileGoogle
14
+ include PageObject
15
+
16
+ text_field(:textfield_search, :name => "q")
17
+ button(:button_search, :name => "btnG")
18
+ div(:div_result, :id => "main")
19
+ link(:link_rubygems, :href => "https://rubygems.org/")
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,213 @@
1
+ =begin
2
+ *Name : Gem Search
3
+ *Description : class that holds the Gem page objects and method definitions
4
+ *Author : Chandra sekaran
5
+ *Creation Date : 24/04/2015
6
+ *Modification Date:
7
+ =end
8
+
9
+ module CUKES
10
+ class RubyGems
11
+ include PageObject
12
+ include PageUtils
13
+ include FileLibrary
14
+ include ObjectRepository::OR_RubyGems
15
+
16
+ # Description : invoked automatically when the page class object is created
17
+ # Author : Chandra sekaran
18
+ #
19
+ def initialize_page
20
+ wait_for_page_load
21
+ end
22
+
23
+ # Description : sign into the application
24
+ # Author : Chandra sekaran
25
+ #
26
+ def sign_in
27
+ click_on(link_signin_element)
28
+ wait_for_object(textfield_email_element, "Could not find textfield Email")
29
+ self.textfield_email = USER_NAME # "profchan2k15@gmail.com"
30
+ self.textfield_password = PASSWORD # "chan123@1"
31
+ click_on(button_sign_in_element)
32
+ wait_for_page_load
33
+ #raise "Error in sign in" if !is_text_present(self, "CHAN90", 120)
34
+ $log.success("Sign in successful")
35
+ rescue Exception => ex
36
+ $log.error("Failure while signing in : #{ex}")
37
+ exit
38
+ end
39
+
40
+ # Description : sign out from the application
41
+ # Author : Chandra sekaran
42
+ #
43
+ def sign_out
44
+ click_on(link_menu_element)
45
+ click_on(link_signout_element)
46
+ #raise "Error in sign out" if !is_text_present(self, "Sign in", 120)
47
+ $log.success("Sign out successful")
48
+ rescue Exception => ex
49
+ $log.error("Failure while signing out : #{ex}")
50
+ exit
51
+ end
52
+
53
+ # Description : searches for the given input gem name
54
+ # Author : Chandra sekaran
55
+ # Arguments :
56
+ # gem_name : name of the gem
57
+ # str_data_node : test data root node name
58
+ #
59
+ def search_for_gem(gem_name = "", str_data_node = "gems")
60
+ if gem_name == ""
61
+ # the set_scenario_based_datafile method sets the test data content from the given input file name
62
+ # present in library/app_specific/datafile_names.rb
63
+ # the yml file can be :
64
+ # * a local data file - inside the current feature name directory
65
+ # * a global data file - inside desktop directory
66
+ hash_gem_name = set_scenario_based_datafile(GEM_NAME)
67
+ gem_name = hash_gem_name[str_data_node]["gem_name"]
68
+ end
69
+ wait_for_object(input_search_element, "Could not find search textbox")
70
+ self.input_search = gem_name
71
+ input_search_element.send_keys(:enter)
72
+ rescue Exception => ex
73
+ $log.error("Failure while searching for gem '#{gem_name}' : #{ex}")
74
+ exit
75
+ end
76
+
77
+ # Description : compares the gem header name
78
+ # Author : Chandra sekaran
79
+ # Argument :
80
+ # gem_name : name of the gem
81
+ #
82
+ def compare_heading(gem_name)
83
+ wait_for_object(h1_title_element)
84
+ expected_heading = "search for #{gem_name}"
85
+ actual_heading = h1_title_element.text
86
+ raise "The expected heading is #{expected_heading} but actual heading is #{actual_heading}" if actual_heading != expected_heading
87
+ wait_for_object(div_search_result_element, "Could not find gem result list")
88
+ raise "No gems found for the given gem" if div_search_result_element.text.include?("No gems found")
89
+ rescue Exception => ex
90
+ $log.error("Failure while comparing Gem header for gem '#{gem_name}' : #{ex}")
91
+ exit
92
+ end
93
+
94
+ # Description : searches for the specific gem and selects it
95
+ # Author : Chandra sekaran
96
+ #
97
+ def fetch_desired_gem
98
+ gem_object = ""
99
+ gem_name = ""
100
+ max = 0
101
+ div_search_result_element.link_elements(:xpath => "./a").each do |parent|
102
+ current = parent.paragraph_element(:xpath => "./p").text
103
+ current = current.gsub!(',','').to_i if current.include?(',')
104
+ if max < current.to_i
105
+ max = current.to_i
106
+ gem_object = parent.strong_element(:xpath => "./div/h2")
107
+ end
108
+ end
109
+ gem_name = gem_object.text
110
+ gem_object.click
111
+ gem_name
112
+ rescue Exception => ex
113
+ $log.error("Failure while getting desired gem : #{ex}")
114
+ exit
115
+ end
116
+
117
+ # Description : fetches the gem details
118
+ # Author : Chandra sekaran
119
+ # Argument :
120
+ # gem : name of the gem
121
+ #
122
+ def fetch_gem_details(gem)
123
+ wait_for_object(h1_title_element)
124
+
125
+ gem_name, gem_version = split_gem_and_version(gem)
126
+ gem_heading = gem_name + " " + gem_version
127
+ raise "The expected value is '#{gem_heading}' but the actual value is '#{h1_title_element.text}'" if h1_title_element.text != gem_heading
128
+
129
+ $log.info "Gem Description"
130
+ $log.info "\tGem Name : #{h1_title_element.text}"
131
+ $log.info "\tGem install : #{textfield_gem_install_elements.last.value}"
132
+ $log.info "\tGemfile : #{textfield_gem_install_elements.first.value}"
133
+
134
+ fetch_gem_versions
135
+ fetch_gem_runtime_dependencies
136
+ fetch_gem_ruby_dependencies
137
+ fetch_gem_development_dependencies
138
+ rescue Exception => ex
139
+ $log.error("Failure while fetching Gem details for gem '#{gem_name}' : #{ex}")
140
+ exit
141
+ end
142
+
143
+ # Description : fetches the gem version
144
+ # Author : Chandra sekaran
145
+ #
146
+ def fetch_gem_versions
147
+ $log.info "Versions"
148
+ fetch_list_items(div_gem_version_element)
149
+ end
150
+
151
+ # Description : fetches the gem runtime dependencies
152
+ # Author : Chandra sekaran
153
+ #
154
+ def fetch_gem_runtime_dependencies
155
+ $log.info "Runtime Dependencies"
156
+ fetch_list_items(div_gem_runtime_dependencies_element)
157
+ end
158
+
159
+ # Description : fetches the gem ruby dependencies
160
+ # Author : Chandra sekaran
161
+ #
162
+ def fetch_gem_ruby_dependencies
163
+ $log.info "Ruby Dependency"
164
+ fetch_list_items(div_gem_ruby_dependencies_element)
165
+ end
166
+
167
+ # Description : fetches the gem development dependencies
168
+ # Author : Chandra sekaran
169
+ #
170
+ def fetch_gem_development_dependencies
171
+ $log.info "Ruby Dependency"
172
+ fetch_list_items(div_gem_development_dependencies_element)
173
+ end
174
+
175
+ # Description : fetches the text under list of elements
176
+ # Author : Chandra sekaran
177
+ # Argument :
178
+ # parent_element : parent element object
179
+ #
180
+ def fetch_list_items(parent_element)
181
+ if parent_element.exists? && parent_element.visible?
182
+ list_elements = ""
183
+ if parent_element.div_element(:xpath => "./div[@class='t-list__items']").exists?
184
+ list_elements = parent_element.link_elements(:xpath => "./div[@class='t-list__items']/a")
185
+ elsif parent_element.ordered_list_element(:xpath => "./ol").exists?
186
+ list_elements = parent_element.list_item_elements(:xpath => "./ol/li")
187
+ end
188
+ list_elements.each do |list|
189
+ $log.info "\t #{list.text}"
190
+ end
191
+ else
192
+ $log.info "\t No data found"
193
+ end
194
+ rescue Exception => ex
195
+ $log.error("Failure while fetching gem list items : #{ex}")
196
+ exit
197
+ end
198
+
199
+ # Description : splits gem name and its version from given input string
200
+ # Author : Chandra sekaran
201
+ # Argument :
202
+ # gem : gem name string with version
203
+ # Return Arguments :
204
+ # gem_name : gem name
205
+ # gem_version : gem version
206
+ #
207
+ def split_gem_and_version(gem)
208
+ gem_name = gem.split(" ").first
209
+ gem_version = gem.split(" ").last
210
+ return gem_name, gem_version
211
+ end
212
+ end
213
+ end