testcentricity 2.4.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +29 -0
  3. data/.rspec +2 -1
  4. data/.rubocop.yml +38 -0
  5. data/.ruby-version +1 -1
  6. data/.simplecov +9 -0
  7. data/.yardopts +3 -0
  8. data/CHANGELOG.md +275 -0
  9. data/CODE_OF_CONDUCT.md +13 -0
  10. data/{LICENSE.txt → LICENSE.md} +3 -4
  11. data/README.md +938 -1384
  12. data/Rakefile +63 -1
  13. data/config/cucumber.yml +145 -0
  14. data/config/locales/en-US.yml +56 -0
  15. data/config/test_data/LOCAL_data.yml +11 -0
  16. data/config/test_data/data.yml +10 -0
  17. data/features/deep_links.feature +26 -0
  18. data/features/login.feature +30 -0
  19. data/features/navigation.feature +31 -0
  20. data/features/step_definitions/generic_steps.rb +72 -0
  21. data/features/support/android/screens/about_screen.rb +11 -0
  22. data/features/support/android/screens/base_app_screen.rb +29 -0
  23. data/features/support/android/screens/checkout_address_screen.rb +17 -0
  24. data/features/support/android/screens/checkout_payment_screen.rb +22 -0
  25. data/features/support/android/screens/login_screen.rb +18 -0
  26. data/features/support/android/screens/products_screen.rb +13 -0
  27. data/features/support/android/screens/saucebot_screen.rb +16 -0
  28. data/features/support/android/screens/webview_screen.rb +13 -0
  29. data/features/support/android/sections/nav_widgets/nav_menu.rb +39 -0
  30. data/features/support/env.rb +61 -0
  31. data/features/support/hooks.rb +135 -0
  32. data/features/support/ios/screens/about_screen.rb +11 -0
  33. data/features/support/ios/screens/base_app_screen.rb +19 -0
  34. data/features/support/ios/screens/checkout_address_screen.rb +17 -0
  35. data/features/support/ios/screens/checkout_payment_screen.rb +22 -0
  36. data/features/support/ios/screens/login_screen.rb +18 -0
  37. data/features/support/ios/screens/products_screen.rb +13 -0
  38. data/features/support/ios/screens/saucebot_screen.rb +16 -0
  39. data/features/support/ios/screens/webview_screen.rb +13 -0
  40. data/features/support/ios/sections/list_items/product_cell_item.rb +13 -0
  41. data/features/support/ios/sections/modals/base_modal.rb +23 -0
  42. data/features/support/ios/sections/modals/logout_modal.rb +6 -0
  43. data/features/support/ios/sections/modals/reset_app_state_modal.rb +6 -0
  44. data/features/support/ios/sections/nav_widgets/nav_bar.rb +31 -0
  45. data/features/support/ios/sections/nav_widgets/nav_menu.rb +41 -0
  46. data/features/support/shared_components/screens/base_app_screen.rb +31 -0
  47. data/features/support/shared_components/screens/checkout_address_screen.rb +17 -0
  48. data/features/support/shared_components/screens/checkout_payment_screen.rb +22 -0
  49. data/features/support/shared_components/screens/login_screen.rb +39 -0
  50. data/features/support/shared_components/screens/saucebot_screen.rb +17 -0
  51. data/features/support/shared_components/screens/webview_screen.rb +12 -0
  52. data/features/support/shared_components/sections/nav_menu.rb +58 -0
  53. data/features/support/world_data.rb +12 -0
  54. data/features/support/world_pages.rb +26 -0
  55. data/lib/testcentricity/app_core/appium_connect_helper.rb +343 -111
  56. data/lib/testcentricity/app_core/screen_object.rb +252 -0
  57. data/lib/testcentricity/app_core/screen_objects_helper.rb +29 -201
  58. data/lib/testcentricity/app_core/{screen_sections_helper.rb → screen_section.rb} +40 -105
  59. data/lib/testcentricity/app_elements/app_element_helper.rb +17 -8
  60. data/lib/testcentricity/app_elements/checkbox.rb +3 -3
  61. data/lib/testcentricity/data_objects/environment.rb +133 -39
  62. data/lib/testcentricity/version.rb +1 -1
  63. data/lib/testcentricity.rb +4 -129
  64. data/reports/.keep +1 -0
  65. data/spec/fixtures/page_object.rb +22 -0
  66. data/spec/fixtures/page_section_object.rb +21 -0
  67. data/spec/fixtures/screen_object.rb +16 -0
  68. data/spec/fixtures/screen_section_object.rb +16 -0
  69. data/spec/spec_helper.rb +28 -9
  70. data/spec/testcentricity/elements/button_spec.rb +18 -0
  71. data/spec/testcentricity/elements/checkbox_spec.rb +28 -0
  72. data/spec/testcentricity/elements/image_spec.rb +13 -0
  73. data/spec/testcentricity/elements/label_spec.rb +18 -0
  74. data/spec/testcentricity/elements/list_spec.rb +13 -0
  75. data/spec/testcentricity/elements/ui_element_spec.rb +72 -0
  76. data/spec/testcentricity/mobile/appium_connect_spec.rb +117 -0
  77. data/spec/testcentricity/mobile/screen_object_spec.rb +63 -0
  78. data/spec/testcentricity/mobile/screen_section_object_spec.rb +56 -0
  79. data/spec/testcentricity/version_spec.rb +7 -0
  80. data/spec/testcentricity/web/browser_spec.rb +41 -0
  81. data/spec/testcentricity/web/local_webdriver_spec.rb +86 -0
  82. data/spec/testcentricity/web/mobile_webdriver_spec.rb +123 -0
  83. data/spec/testcentricity/web/page_object_spec.rb +85 -0
  84. data/spec/testcentricity/web/page_section_object_spec.rb +72 -0
  85. data/testcentricity.gemspec +28 -27
  86. metadata +196 -127
  87. data/.ruby-gemset +0 -1
  88. data/Gemfile.lock +0 -93
  89. data/bin/console +0 -14
  90. data/bin/setup +0 -8
  91. data/lib/devices/devices.yml +0 -352
  92. data/lib/testcentricity/app_core/appium_server.rb +0 -69
  93. data/lib/testcentricity/browser_helper.rb +0 -174
  94. data/lib/testcentricity/data_objects/data_objects_helper.rb +0 -78
  95. data/lib/testcentricity/data_objects/excel_helper.rb +0 -242
  96. data/lib/testcentricity/exception_queue_helper.rb +0 -111
  97. data/lib/testcentricity/utility_helpers.rb +0 -32
  98. data/lib/testcentricity/web_core/drag_drop_helper.rb +0 -15
  99. data/lib/testcentricity/web_core/page_objects_helper.rb +0 -677
  100. data/lib/testcentricity/web_core/page_sections_helper.rb +0 -895
  101. data/lib/testcentricity/web_core/webdriver_helper.rb +0 -588
  102. data/lib/testcentricity/web_elements/button.rb +0 -8
  103. data/lib/testcentricity/web_elements/cell_button.rb +0 -8
  104. data/lib/testcentricity/web_elements/cell_checkbox.rb +0 -38
  105. data/lib/testcentricity/web_elements/cell_element.rb +0 -69
  106. data/lib/testcentricity/web_elements/cell_image.rb +0 -8
  107. data/lib/testcentricity/web_elements/cell_radio.rb +0 -31
  108. data/lib/testcentricity/web_elements/checkbox.rb +0 -100
  109. data/lib/testcentricity/web_elements/file_field.rb +0 -45
  110. data/lib/testcentricity/web_elements/image.rb +0 -34
  111. data/lib/testcentricity/web_elements/label.rb +0 -8
  112. data/lib/testcentricity/web_elements/link.rb +0 -8
  113. data/lib/testcentricity/web_elements/list.rb +0 -100
  114. data/lib/testcentricity/web_elements/list_button.rb +0 -8
  115. data/lib/testcentricity/web_elements/list_checkbox.rb +0 -38
  116. data/lib/testcentricity/web_elements/list_element.rb +0 -61
  117. data/lib/testcentricity/web_elements/list_radio.rb +0 -31
  118. data/lib/testcentricity/web_elements/radio.rb +0 -74
  119. data/lib/testcentricity/web_elements/select_list.rb +0 -208
  120. data/lib/testcentricity/web_elements/siebel_open_ui_helper.rb +0 -15
  121. data/lib/testcentricity/web_elements/table.rb +0 -612
  122. data/lib/testcentricity/web_elements/textfield.rb +0 -114
  123. data/lib/testcentricity/web_elements/ui_elements_helper.rb +0 -532
  124. data/lib/testcentricity/world_extensions.rb +0 -26
  125. data/my_templates/default/method_details/setup.rb +0 -3
  126. data/spec/testcentricity_spec.rb +0 -9
@@ -0,0 +1,12 @@
1
+ module WorldData
2
+ #
3
+ # data_objects method returns a hash table of your web app's data objects and associated data object classes to be instantiated
4
+ # by the TestCentricity™ DataManager. Data Object class definitions are contained in the features/support/data folder.
5
+ #
6
+ def data_objects
7
+ {}
8
+ end
9
+ end
10
+
11
+
12
+ World(WorldData)
@@ -0,0 +1,26 @@
1
+ module WorldPages
2
+
3
+ #
4
+ # The page_objects method returns a hash table of your web or native mobile app's page objects and associated page
5
+ # classes to be instantiated by the TestCentricity PageManager.
6
+ #
7
+ # Web Page Object class definitions are contained in the features/support/web/pages folder.
8
+ # iOS Screen Object class definitions are contained in the features/support/ios/screens folder.
9
+ # Android Screen Object class definitions are contained in the features/support/android/screens folder.
10
+ #
11
+ def page_objects
12
+ {
13
+ base_app_screen: BaseAppScreen,
14
+ about_screen: AboutScreen,
15
+ login_screen: LoginScreen,
16
+ webview_screen: WebViewScreen,
17
+ products_screen: ProductsScreen,
18
+ checkout_address_screen: CheckoutAddressScreen,
19
+ checkout_payment_screen: CheckoutPaymentScreen,
20
+ saucebot_video_screen: SauceBotScreen
21
+ }
22
+ end
23
+ end
24
+
25
+
26
+ World(WorldPages)
@@ -1,61 +1,84 @@
1
1
  require 'appium_lib'
2
+ require 'curb'
3
+ require 'json'
2
4
 
3
5
 
4
6
  module TestCentricity
5
7
  module AppiumConnect
6
8
 
7
9
  attr_accessor :running
8
- attr_accessor :config_file
9
-
10
- def self.initialize_appium(project_path = nil)
11
- Environ.platform = :mobile
12
- Environ.driver = :appium
10
+ attr_accessor :endpoint
11
+ attr_accessor :capabilities
12
+
13
+ def self.initialize_appium(options = nil)
14
+ @endpoint = nil
15
+ @capabilities = nil
16
+ if options.is_a?(Hash)
17
+ @endpoint = options[:endpoint] if options.key?(:endpoint)
18
+ @capabilities = options[:desired_capabilities] if options.key?(:desired_capabilities)
19
+ end
20
+ Environ.platform = :mobile
21
+ Environ.driver = :appium
13
22
  Environ.device_type = ENV['DEVICE_TYPE'] if ENV['DEVICE_TYPE']
14
- Environ.device_orientation = ENV['ORIENTATION'] if ENV['ORIENTATION']
15
23
 
16
- @config_file = project_path
17
-
18
- if project_path.nil?
19
- browser = ENV['WEB_BROWSER']
20
- Environ.browser = browser
21
- case browser.downcase.to_sym
22
- when :appium
23
- Environ.device_name = ENV['APP_DEVICE']
24
- Environ.device_os = ENV['APP_PLATFORM_NAME']
25
- ENV['UDID'] ? Environ.device = :device : Environ.device = :simulator
26
- when :browserstack
27
- Environ.device_name = ENV['BS_DEVICE']
28
- Environ.device_os = ENV['BS_OS']
29
- end
24
+ Environ.device_orientation = ENV['ORIENTATION'] if ENV['ORIENTATION']
25
+ Environ.device_os_version = ENV['APP_VERSION']
26
+ browser = ENV['WEB_BROWSER']
27
+ Environ.browser = browser
28
+ case browser.downcase.to_sym
29
+ when :appium
30
+ Environ.device_name = ENV['APP_DEVICE']
31
+ Environ.device_os = ENV['APP_PLATFORM_NAME']
32
+ Environ.device = ENV['UDID'] ? :device : :simulator
33
+ when :browserstack
34
+ Environ.device_name = ENV['BS_DEVICE']
35
+ Environ.device_os = ENV['BS_OS']
36
+ Environ.device = :device
37
+ upload_app(:browserstack) if ENV['UPLOAD_APP']
38
+ when :saucelabs
39
+ Environ.device_name = ENV['SL_DEVICE']
40
+ Environ.device_os = ENV['SL_OS']
41
+ when :testingbot
42
+ Environ.device_name = ENV['TB_DEVICE']
43
+ Environ.device_os = ENV['TB_OS']
44
+ Environ.device = :device
45
+ upload_app(:testingbot) if ENV['UPLOAD_APP']
46
+ when :lambdatest
47
+ Environ.device_name = ENV['LT_DEVICE']
48
+ Environ.device_os = ENV['LT_OS']
49
+ else
50
+ raise "#{browser} is not a valid selector"
30
51
  end
31
52
  @running = false
32
53
  end
33
54
 
34
55
  def self.start_driver
35
- if @config_file.nil?
36
- browser = ENV['WEB_BROWSER']
37
- case browser.downcase.to_sym
38
- when :appium
39
- desired_capabilities = appium_local_capabilities
40
- when :browserstack
41
- desired_capabilities = browserstack_capabilities
42
- end
43
- else
44
- base_path = 'config'
45
- unless File.directory?(File.join(@config_file, base_path))
46
- raise 'Could not find appium.txt files in /config folder'
47
- end
48
- appium_caps = File.join(@config_file, base_path, 'appium.txt')
49
- desired_capabilities = Appium.load_appium_txt file: appium_caps
50
- end
51
-
52
- puts "Appium desired_capabilities = #{desired_capabilities}" if ENV['DEBUG']
56
+ browser = Environ.browser
57
+ capabilities = case browser.downcase.to_sym
58
+ when :appium
59
+ appium_local_capabilities
60
+ when :browserstack
61
+ browserstack_capabilities
62
+ when :saucelabs
63
+ sauce_capabilities
64
+ when :testingbot
65
+ testingbot_capabilities
66
+ when :lambdatest
67
+ lambdatest_capabilities
68
+ else
69
+ raise "#{browser} is not a valid selector"
70
+ end
71
+ puts "Appium desired_capabilities = #{capabilities}" if ENV['DEBUG']
53
72
 
54
- Appium::Driver.new(desired_capabilities).start_driver
73
+ desired_capabilities = {
74
+ caps: capabilities,
75
+ appium_lib: { server_url: @endpoint }
76
+ }
77
+ Appium::Driver.new(desired_capabilities, true).start_driver
55
78
  @running = true
56
- Appium.promote_appium_methods TestCentricity::ScreenObject
57
- Appium.promote_appium_methods TestCentricity::ScreenSection
58
- Appium.promote_appium_methods TestCentricity::AppUIElement
79
+ Appium.promote_appium_methods(TestCentricity::ScreenObject)
80
+ Appium.promote_appium_methods(TestCentricity::ScreenSection)
81
+ Appium.promote_appium_methods(TestCentricity::AppUIElement)
59
82
 
60
83
  Environ.screen_size = $driver.window_size
61
84
  end
@@ -80,14 +103,18 @@ module TestCentricity
80
103
  $driver.install_app(app_path)
81
104
  end
82
105
 
83
- def self.app_installed?(bundle_id)
84
- $driver.app_installed?(bundle_id)
106
+ def self.app_installed?(bundle_id = nil)
107
+ $driver.app_installed?(get_app_id(bundle_id))
85
108
  end
86
109
 
87
110
  def self.launch_app
88
111
  $driver.launch_app
89
112
  end
90
113
 
114
+ def self.background_app(duration)
115
+ $driver.background_app(duration)
116
+ end
117
+
91
118
  def self.close_app
92
119
  $driver.close_app
93
120
  end
@@ -96,8 +123,20 @@ module TestCentricity
96
123
  $driver.reset
97
124
  end
98
125
 
99
- def self.remove_app(bundle_id)
100
- $driver.remove_app(bundle_id)
126
+ def self.remove_app(bundle_id = nil)
127
+ $driver.remove_app(get_app_id(bundle_id))
128
+ end
129
+
130
+ def self.activate_app(bundle_id = nil)
131
+ $driver.activate_app(get_app_id(bundle_id))
132
+ end
133
+
134
+ def self.app_state(bundle_id = nil)
135
+ $driver.app_state(get_app_id(bundle_id))
136
+ end
137
+
138
+ def self.terminate_app(bundle_id = nil)
139
+ $driver.terminate_app(get_app_id(bundle_id))
101
140
  end
102
141
 
103
142
  def self.implicit_wait(timeout)
@@ -112,10 +151,18 @@ module TestCentricity
112
151
  $driver.is_keyboard_shown
113
152
  end
114
153
 
154
+ def self.orientation
155
+ $driver.orientation
156
+ end
157
+
115
158
  def self.set_orientation(orientation)
116
159
  $driver.rotation = orientation.downcase.to_sym
117
160
  end
118
161
 
162
+ def self.geolocation
163
+ $driver.location
164
+ end
165
+
119
166
  def self.set_geolocation(latitude, longitude, altitude)
120
167
  $driver.set_location(latitude, longitude, altitude)
121
168
  end
@@ -152,81 +199,266 @@ module TestCentricity
152
199
  puts "Current context = #{$driver.current_context}" if ENV['DEBUG']
153
200
  end
154
201
 
202
+ def self.upload_app(service)
203
+ case service
204
+ when :browserstack
205
+ url = 'https://api-cloud.browserstack.com/app-automate/upload'
206
+ user_id = ENV['BS_USERNAME']
207
+ auth_key = ENV['BS_AUTHKEY']
208
+ when :testingbot
209
+ url = 'https://api.testingbot.com/v1/storage'
210
+ user_id = ENV['TB_USERNAME']
211
+ auth_key = ENV['TB_AUTHKEY']
212
+ else
213
+ raise "#{service} is not a valid selector"
214
+ end
215
+
216
+ file_path = if Environ.is_android?
217
+ Environ.current.android_apk_path
218
+ elsif Environ.is_ios?
219
+ Environ.is_device? ?
220
+ Environ.current.ios_ipa_path :
221
+ Environ.current.ios_app_path
222
+ end
223
+
224
+ c = Curl::Easy.new(url)
225
+ c.http_auth_types = :basic
226
+ c.username = user_id
227
+ c.password = auth_key
228
+ c.multipart_form_post = true
229
+ c.http_post(Curl::PostField.file('file', file_path))
230
+ result = JSON.parse(c.body_str)
231
+ puts "app_url = #{result['app_url']}"
232
+ ENV['APP'] = result['app_url']
233
+ end
234
+
155
235
  private
156
236
 
157
- def self.appium_local_capabilities
158
- desired_capabilities = {
159
- caps: {
160
- platformName: ENV['APP_PLATFORM_NAME'],
161
- platformVersion: ENV['APP_VERSION'],
162
- deviceName: ENV['APP_DEVICE'],
163
- automationName: ENV['AUTOMATION_ENGINE']
164
- }
165
- }
166
- capabilities = desired_capabilities[:caps]
167
- capabilities[:avd] = ENV['APP_DEVICE'] if ENV['APP_PLATFORM_NAME'].downcase.to_sym == :android
168
- capabilities[:orientation] = ENV['ORIENTATION'].upcase if ENV['ORIENTATION']
169
- capabilities[:language] = ENV['LANGUAGE'] if ENV['LANGUAGE']
170
- capabilities[:locale] = ENV['LOCALE'].gsub('-', '_') if ENV['LOCALE']
171
- capabilities[:newCommandTimeout] = ENV['NEW_COMMAND_TIMEOUT'] if ENV['NEW_COMMAND_TIMEOUT']
172
- capabilities[:noReset] = ENV['APP_NO_RESET'] if ENV['APP_NO_RESET']
173
- capabilities[:fullReset] = ENV['APP_FULL_RESET'] if ENV['APP_FULL_RESET']
174
- capabilities[:webkitDebugProxyPort] = ENV['WEBKIT_DEBUG_PROXY_PORT'] if ENV['WEBKIT_DEBUG_PROXY_PORT']
175
- capabilities[:webDriverAgentUrl] = ENV['WEBDRIVER_AGENT_URL'] if ENV['WEBDRIVER_AGENT_URL']
176
- capabilities[:wdaLocalPort] = ENV['WDA_LOCAL_PORT'] if ENV['WDA_LOCAL_PORT']
177
- capabilities[:usePrebuiltWDA] = ENV['USE_PREBUILT_WDA'] if ENV['USE_PREBUILT_WDA']
178
- capabilities[:useNewWDA] = ENV['USE_NEW_WDA'] if ENV['USE_NEW_WDA']
179
- capabilities[:startIWDP] = ENV['START_IWDP'] if ENV['START_IWDP']
180
- capabilities[:autoWebview] = ENV['AUTO_WEBVIEW'] if ENV['AUTO_WEBVIEW']
181
- capabilities[:chromedriverExecutable] = ENV['CHROMEDRIVER_EXECUTABLE'] if ENV['CHROMEDRIVER_EXECUTABLE']
182
- capabilities[:autoWebviewTimeout] = ENV['AUTO_WEBVIEW_TIMEOUT'] if ENV['AUTO_WEBVIEW_TIMEOUT']
183
-
184
- if ENV['UDID']
185
- capabilities[:udid] = ENV['UDID']
186
- capabilities[:bundleId] = ENV['BUNDLE_ID'] if ENV['BUNDLE_ID']
187
- capabilities[:xcodeOrgId] = ENV['TEAM_ID'] if ENV['TEAM_ID']
188
- capabilities[:xcodeSigningId] = ENV['TEAM_NAME'] if ENV['TEAM_NAME']
189
- capabilities[:appActivity] = ENV['APP_ACTIVITY'] if ENV['APP_ACTIVITY']
190
- capabilities[:appPackage] = ENV['APP_PACKAGE'] if ENV['APP_PACKAGE']
191
- end
237
+ def self.get_app_id(bundle_id = nil)
238
+ return bundle_id unless bundle_id.nil?
192
239
 
193
- if ENV['APP']
194
- capabilities[:app] = ENV['APP']
240
+ if Environ.is_ios?
241
+ Environ.current.ios_bundle_id
242
+ elsif Environ.is_android?
243
+ Environ.current.android_app_id
195
244
  else
196
- if Environ.is_android?
197
- capabilities[:app] = Environ.current.android_apk_path
198
- elsif Environ.is_ios?
199
- Environ.is_device? ?
200
- capabilities[:app] = Environ.current.ios_ipa_path :
201
- capabilities[:app] = Environ.current.ios_app_path
245
+ nil
246
+ end
247
+ end
248
+
249
+ def self.appium_local_capabilities
250
+ # specify endpoint url
251
+ @endpoint = 'http://127.0.0.1:4723/wd/hub' if @endpoint.nil?
252
+ # define local Appium capabilities
253
+ if @capabilities.nil?
254
+ caps = {
255
+ platformName: ENV['APP_PLATFORM_NAME'],
256
+ platformVersion: ENV['APP_VERSION'],
257
+ deviceName: ENV['APP_DEVICE'],
258
+ automationName: ENV['AUTOMATION_ENGINE']
259
+ }
260
+ caps[:avd] = ENV['APP_DEVICE'] if ENV['APP_PLATFORM_NAME'].downcase.to_sym == :android
261
+ caps[:orientation] = ENV['ORIENTATION'].upcase if ENV['ORIENTATION']
262
+ caps[:language] = ENV['LANGUAGE'] if ENV['LANGUAGE']
263
+ if ENV['LOCALE']
264
+ caps[:locale] = if Environ.is_android?
265
+ locale = ENV['LOCALE'].gsub('-', '_')
266
+ locale.split('_')[1]
267
+ else
268
+ ENV['LOCALE'].gsub('-', '_')
269
+ end
270
+ end
271
+ caps[:newCommandTimeout] = ENV['NEW_COMMAND_TIMEOUT'] if ENV['NEW_COMMAND_TIMEOUT']
272
+ caps[:noReset] = ENV['APP_NO_RESET'] if ENV['APP_NO_RESET']
273
+ caps[:fullReset] = ENV['APP_FULL_RESET'] if ENV['APP_FULL_RESET']
274
+ caps[:webkitDebugProxyPort] = ENV['WEBKIT_DEBUG_PROXY_PORT'] if ENV['WEBKIT_DEBUG_PROXY_PORT']
275
+ caps[:webDriverAgentUrl] = ENV['WEBDRIVER_AGENT_URL'] if ENV['WEBDRIVER_AGENT_URL']
276
+ caps[:wdaLocalPort] = ENV['WDA_LOCAL_PORT'] if ENV['WDA_LOCAL_PORT']
277
+ caps[:usePrebuiltWDA] = ENV['USE_PREBUILT_WDA'] if ENV['USE_PREBUILT_WDA']
278
+ caps[:useNewWDA] = ENV['USE_NEW_WDA'] if ENV['USE_NEW_WDA']
279
+ caps[:autoWebview] = ENV['AUTO_WEBVIEW'] if ENV['AUTO_WEBVIEW']
280
+ caps[:chromedriverExecutable] = ENV['CHROMEDRIVER_EXECUTABLE'] if ENV['CHROMEDRIVER_EXECUTABLE']
281
+ caps[:autoWebviewTimeout] = ENV['AUTO_WEBVIEW_TIMEOUT'] if ENV['AUTO_WEBVIEW_TIMEOUT']
282
+ caps[:udid] = ENV['UDID'] if ENV['UDID']
283
+ caps[:xcodeOrgId] = ENV['TEAM_ID'] if ENV['TEAM_ID']
284
+ caps[:xcodeSigningId] = ENV['TEAM_NAME'] if ENV['TEAM_NAME']
285
+ caps[:appActivity] = ENV['APP_ACTIVITY'] if ENV['APP_ACTIVITY']
286
+ caps[:appPackage] = ENV['APP_PACKAGE'] if ENV['APP_PACKAGE']
287
+
288
+ if ENV['BUNDLE_ID']
289
+ caps[:bundleId] = ENV['BUNDLE_ID']
290
+ else
291
+ app_id = get_app_id
292
+ caps[:bundleId] = app_id unless app_id.nil?
293
+ end
294
+
295
+ caps[:app] = if ENV['APP']
296
+ ENV['APP']
297
+ else
298
+ if Environ.is_android?
299
+ Environ.current.android_apk_path
300
+ elsif Environ.is_ios?
301
+ Environ.is_device? ?
302
+ Environ.current.ios_ipa_path :
303
+ Environ.current.ios_app_path
304
+ end
202
305
  end
306
+ caps
307
+ else
308
+ @capabilities
203
309
  end
204
- desired_capabilities
205
310
  end
206
311
 
312
+ # :nocov:
207
313
  def self.browserstack_capabilities
208
- endpoint = "http://#{ENV['BS_USERNAME']}:#{ENV['BS_AUTHKEY']}@hub-cloud.browserstack.com/wd/hub"
209
-
210
- capabilities = {}
211
- capabilities['device'] = ENV['BS_DEVICE']
212
- capabilities['os_version'] = ENV['BS_OS_VERSION']
213
- capabilities['app'] = "bs://#{ENV['APP_URL']}" if ENV['APP_URL']
214
- capabilities['app'] = ENV['APP_ID'] if ENV['APP_ID']
215
- capabilities['realMobile'] = true
216
- capabilities['project'] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
217
- capabilities['build'] = ENV['AUTOMATE_BUILD'] if ENV['AUTOMATE_BUILD']
218
- capabilities['deviceOrientation'] = ENV['ORIENTATION'] if ENV['ORIENTATION']
219
- capabilities['browserstack.debug'] = true
220
- capabilities['browserstack.video'] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
221
- capabilities['browserstack.debug'] = 'true'
222
-
223
- appium_lib_options = { server_url: endpoint }
224
- desired_capabilities = {
225
- appium_lib: appium_lib_options,
226
- caps: capabilities
227
- }
228
- desired_capabilities
314
+ # specify endpoint url
315
+ @endpoint = 'http://hub-cloud.browserstack.com/wd/hub' if @endpoint.nil?
316
+ # define BrowserStack options
317
+ options = if @capabilities.nil?
318
+ # define the required set of BrowserStack options
319
+ bs_options = {
320
+ userName: ENV['BS_USERNAME'],
321
+ accessKey: ENV['BS_AUTHKEY'],
322
+ sessionName: test_context_message
323
+ }
324
+ # define the optional BrowserStack options
325
+ bs_options[:projectName] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
326
+ bs_options[:buildName] = ENV['AUTOMATE_BUILD'] if ENV['AUTOMATE_BUILD']
327
+ bs_options[:geoLocation] = ENV['IP_GEOLOCATION'] if ENV['IP_GEOLOCATION']
328
+ bs_options[:timezone] = ENV['TIME_ZONE'] if ENV['TIME_ZONE']
329
+ bs_options[:video] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
330
+ bs_options[:debug] = ENV['SCREENSHOTS'] if ENV['SCREENSHOTS']
331
+ bs_options[:local] = ENV['TUNNELING'] if ENV['TUNNELING']
332
+ bs_options[:deviceOrientation] = ENV['ORIENTATION'] if ENV['ORIENTATION']
333
+ bs_options[:appiumLogs] = ENV['APPIUM_LOGS'] if ENV['APPIUM_LOGS']
334
+ bs_options[:networkLogs] = ENV['NETWORK_LOGS'] if ENV['NETWORK_LOGS']
335
+ bs_options[:deviceLogs] = ENV['DEVICE_LOGS'] if ENV['DEVICE_LOGS']
336
+ bs_options[:networkProfile] = ENV['NETWORK_PROFILE'] if ENV['NETWORK_PROFILE']
337
+ bs_options[:idleTimeout] = ENV['IDLE_TIMEOUT'] if ENV['IDLE_TIMEOUT']
338
+ bs_options[:resignApp] = ENV['RESIGN_APP'] if ENV['RESIGN_APP']
339
+ bs_options[:gpsLocation] = ENV['GPS_LOCATION'] if ENV['GPS_LOCATION']
340
+ bs_options[:acceptInsecureCerts] = ENV['ACCEPT_INSECURE_CERTS'] if ENV['ACCEPT_INSECURE_CERTS']
341
+ bs_options[:disableAnimations] = ENV['DISABLE_ANIMATION'] if ENV['DISABLE_ANIMATION']
342
+ bs_options[:appiumVersion] = if ENV['APPIUM_VERSION']
343
+ ENV['APPIUM_VERSION']
344
+ else
345
+ '1.22.0'
346
+ end
347
+ capabilities = {
348
+ platformName: ENV['BS_OS'],
349
+ platformVersion: ENV['BS_OS_VERSION'],
350
+ deviceName: ENV['BS_DEVICE'],
351
+ app: ENV['APP'],
352
+ 'bstack:options': bs_options
353
+ }
354
+ capabilities[:language] = ENV['LANGUAGE'] if ENV['LANGUAGE']
355
+ capabilities[:locale] = ENV['LOCALE'] if ENV['LOCALE']
356
+ capabilities
357
+ else
358
+ @capabilities
359
+ end
360
+ options
361
+ end
362
+
363
+ def self.sauce_capabilities
364
+ # specify endpoint url
365
+ @endpoint = "https://#{ENV['SL_USERNAME']}:#{ENV['SL_AUTHKEY']}@ondemand.#{ENV['DATA_CENTER']}.saucelabs.com:443/wd/hub" if @endpoint.nil?
366
+ # define SauceLab options
367
+ options = if @capabilities.nil?
368
+ capabilities = {
369
+ platformName: ENV['SL_OS'],
370
+ app: ENV['APP'],
371
+ deviceName: ENV['SL_DEVICE'],
372
+ platformVersion: ENV['SL_OS_VERSION'],
373
+ deviceType: ENV['DEVICE_TYPE'],
374
+ build: test_context_message
375
+ }
376
+ capabilities[:name] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
377
+ capabilities[:deviceOrientation] = ENV['ORIENTATION'].upcase if ENV['ORIENTATION']
378
+ capabilities[:recordVideo] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
379
+ capabilities[:recordScreenshots] = ENV['SCREENSHOTS'] if ENV['SCREENSHOTS']
380
+ capabilities[:appiumVersion] = if ENV['APPIUM_VERSION']
381
+ ENV['APPIUM_VERSION']
382
+ else
383
+ '1.22.3'
384
+ end
385
+ capabilities
386
+ else
387
+ @capabilities
388
+ end
389
+ options
390
+ end
391
+
392
+ def self.testingbot_capabilities
393
+ # specify endpoint url
394
+ @endpoint = "http://#{ENV['TB_USERNAME']}:#{ENV['TB_AUTHKEY']}@hub.testingbot.com/wd/hub" if @endpoint.nil?
395
+ # define TestingBot options
396
+ options = if @capabilities.nil?
397
+ capabilities = {
398
+ user: ENV['TB_USERNAME'],
399
+ accessKey: ENV['TB_AUTHKEY'],
400
+ platformName: ENV['TB_OS'],
401
+ app: ENV['APP'],
402
+ deviceName: ENV['TB_DEVICE'],
403
+ version: ENV['TB_OS_VERSION'],
404
+ build: test_context_message
405
+ }
406
+ capabilities[:realDevice] = ENV['REAL_DEVICE'].to_bool if ENV['REAL_DEVICE']
407
+ capabilities[:name] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
408
+ capabilities
409
+ else
410
+ @capabilities
411
+ end
412
+ options
413
+ end
414
+
415
+ def self.lambdatest_capabilities
416
+ # specify endpoint url
417
+ @endpoint = "https://#{ENV['LT_USERNAME']}:#{ENV['LT_AUTHKEY']}@beta-hub.lambdatest.com/wd/hub" if @endpoint.nil?
418
+ # define LambdaTest options
419
+ options = if @capabilities.nil?
420
+ # define the required set of LambdaTest options
421
+ lt_options = {
422
+ deviceName: ENV['LT_DEVICE'],
423
+ platformName: ENV['LT_OS'],
424
+ platformVersion: ENV['LT_OS_VERSION'],
425
+ app: ENV['APP'],
426
+ w3c: true,
427
+ build: test_context_message
428
+ }
429
+ # define the optional LambdaTest options
430
+ lt_options[:name] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
431
+ lt_options[:isRealMobile] = ENV['REAL_DEVICE'].to_bool if ENV['REAL_DEVICE']
432
+ lt_options[:deviceOrientation] = ENV['ORIENTATION'] if ENV['ORIENTATION']
433
+ lt_options[:geoLocation] = ENV['GEO_LOCATION'] if ENV['GEO_LOCATION']
434
+ lt_options[:video] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
435
+ lt_options[:visual] = ENV['SCREENSHOTS'] if ENV['SCREENSHOTS']
436
+ lt_options[:network] = ENV['NETWORK_LOGS'] if ENV['NETWORK_LOGS']
437
+ lt_options[:deviceLogs] = ENV['DEVICE_LOGS'] if ENV['DEVICE_LOGS']
438
+ lt_options[:tunnel] = ENV['TUNNELING'] if ENV['TUNNELING']
439
+ lt_options[:idleTimeout] = ENV['IDLE_TIMEOUT'] if ENV['IDLE_TIMEOUT']
440
+
441
+ { 'LT:Options': lt_options }
442
+ else
443
+ @capabilities
444
+ end
445
+ options
446
+ end
447
+
448
+ def self.test_context_message
449
+ context_message = if ENV['TEST_CONTEXT']
450
+ "#{Environ.test_environment.to_s.upcase} - #{ENV['TEST_CONTEXT']}"
451
+ else
452
+ Environ.test_environment.to_s.upcase
453
+ end
454
+ if ENV['PARALLEL']
455
+ thread_num = ENV['TEST_ENV_NUMBER']
456
+ thread_num = 1 if thread_num.blank?
457
+ context_message = "#{context_message} - Thread ##{thread_num}"
458
+ end
459
+ context_message
229
460
  end
461
+ # :nocov:
230
462
  end
231
463
  end
232
464