testcentricity 2.4.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) 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 -1378
  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 +355 -111
  56. data/lib/testcentricity/app_core/screen_object.rb +252 -0
  57. data/lib/testcentricity/app_core/screen_objects_helper.rb +29 -280
  58. data/lib/testcentricity/app_core/screen_section.rb +350 -0
  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/app_core/screen_sections_helper.rb +0 -491
  94. data/lib/testcentricity/browser_helper.rb +0 -174
  95. data/lib/testcentricity/data_objects/data_objects_helper.rb +0 -78
  96. data/lib/testcentricity/data_objects/excel_helper.rb +0 -242
  97. data/lib/testcentricity/exception_queue_helper.rb +0 -111
  98. data/lib/testcentricity/utility_helpers.rb +0 -28
  99. data/lib/testcentricity/web_core/drag_drop_helper.rb +0 -15
  100. data/lib/testcentricity/web_core/page_objects_helper.rb +0 -711
  101. data/lib/testcentricity/web_core/page_sections_helper.rb +0 -932
  102. data/lib/testcentricity/web_core/webdriver_helper.rb +0 -588
  103. data/lib/testcentricity/web_elements/button.rb +0 -8
  104. data/lib/testcentricity/web_elements/cell_button.rb +0 -8
  105. data/lib/testcentricity/web_elements/cell_checkbox.rb +0 -38
  106. data/lib/testcentricity/web_elements/cell_element.rb +0 -69
  107. data/lib/testcentricity/web_elements/cell_image.rb +0 -8
  108. data/lib/testcentricity/web_elements/cell_radio.rb +0 -31
  109. data/lib/testcentricity/web_elements/checkbox.rb +0 -100
  110. data/lib/testcentricity/web_elements/file_field.rb +0 -45
  111. data/lib/testcentricity/web_elements/image.rb +0 -34
  112. data/lib/testcentricity/web_elements/label.rb +0 -8
  113. data/lib/testcentricity/web_elements/link.rb +0 -8
  114. data/lib/testcentricity/web_elements/list.rb +0 -100
  115. data/lib/testcentricity/web_elements/list_button.rb +0 -8
  116. data/lib/testcentricity/web_elements/list_checkbox.rb +0 -38
  117. data/lib/testcentricity/web_elements/list_element.rb +0 -61
  118. data/lib/testcentricity/web_elements/list_radio.rb +0 -31
  119. data/lib/testcentricity/web_elements/radio.rb +0 -74
  120. data/lib/testcentricity/web_elements/select_list.rb +0 -208
  121. data/lib/testcentricity/web_elements/siebel_open_ui_helper.rb +0 -15
  122. data/lib/testcentricity/web_elements/table.rb +0 -612
  123. data/lib/testcentricity/web_elements/textfield.rb +0 -114
  124. data/lib/testcentricity/web_elements/ui_elements_helper.rb +0 -532
  125. data/lib/testcentricity/world_extensions.rb +0 -26
  126. data/my_templates/default/method_details/setup.rb +0 -3
  127. 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,125 +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 = {
40
- caps: {
41
- platformName: ENV['APP_PLATFORM_NAME'],
42
- platformVersion: ENV['APP_VERSION'],
43
- deviceName: ENV['APP_DEVICE'],
44
- automationName: ENV['AUTOMATION_ENGINE']
45
- }
46
- }
47
- capabilities = desired_capabilities[:caps]
48
- capabilities[:avd] = ENV['APP_DEVICE'] if ENV['APP_PLATFORM_NAME'].downcase.to_sym == :android
49
- capabilities[:orientation] = ENV['ORIENTATION'].upcase if ENV['ORIENTATION']
50
- capabilities[:language] = ENV['LANGUAGE'] if ENV['LANGUAGE']
51
- capabilities[:locale] = ENV['LOCALE'].gsub('-', '_') if ENV['LOCALE']
52
- capabilities[:newCommandTimeout] = ENV['NEW_COMMAND_TIMEOUT'] if ENV['NEW_COMMAND_TIMEOUT']
53
- capabilities[:noReset] = ENV['APP_NO_RESET'] if ENV['APP_NO_RESET']
54
- capabilities[:fullReset] = ENV['APP_FULL_RESET'] if ENV['APP_FULL_RESET']
55
- capabilities[:webkitDebugProxyPort] = ENV['WEBKIT_DEBUG_PROXY_PORT'] if ENV['WEBKIT_DEBUG_PROXY_PORT']
56
- capabilities[:webDriverAgentUrl] = ENV['WEBDRIVER_AGENT_URL'] if ENV['WEBDRIVER_AGENT_URL']
57
- capabilities[:wdaLocalPort] = ENV['WDA_LOCAL_PORT'] if ENV['WDA_LOCAL_PORT']
58
- capabilities[:usePrebuiltWDA] = ENV['USE_PREBUILT_WDA'] if ENV['USE_PREBUILT_WDA']
59
- capabilities[:useNewWDA] = ENV['USE_NEW_WDA'] if ENV['USE_NEW_WDA']
60
- capabilities[:startIWDP] = ENV['START_IWDP'] if ENV['START_IWDP']
61
- capabilities[:autoWebview] = ENV['AUTO_WEBVIEW'] if ENV['AUTO_WEBVIEW']
62
- capabilities[:chromedriverExecutable] = ENV['CHROMEDRIVER_EXECUTABLE'] if ENV['CHROMEDRIVER_EXECUTABLE']
63
- capabilities[:autoWebviewTimeout] = ENV['AUTO_WEBVIEW_TIMEOUT'] if ENV['AUTO_WEBVIEW_TIMEOUT']
64
-
65
- if ENV['UDID']
66
- capabilities[:udid] = ENV['UDID']
67
- capabilities[:bundleId] = ENV['BUNDLE_ID'] if ENV['BUNDLE_ID']
68
- capabilities[:xcodeOrgId] = ENV['TEAM_ID'] if ENV['TEAM_ID']
69
- capabilities[:xcodeSigningId] = ENV['TEAM_NAME'] if ENV['TEAM_NAME']
70
- capabilities[:appActivity] = ENV['APP_ACTIVITY'] if ENV['APP_ACTIVITY']
71
- capabilities[:appPackage] = ENV['APP_PACKAGE'] if ENV['APP_PACKAGE']
72
- end
73
-
74
- if ENV['APP']
75
- capabilities[:app] = ENV['APP']
76
- else
77
- if Environ.is_android?
78
- capabilities[:app] = Environ.current.android_apk_path
79
- elsif Environ.is_ios?
80
- Environ.is_device? ?
81
- capabilities[:app] = Environ.current.ios_ipa_path :
82
- capabilities[:app] = Environ.current.ios_app_path
83
- end
84
- end
85
- when :browserstack
86
- endpoint = "http://#{ENV['BS_USERNAME']}:#{ENV['BS_AUTHKEY']}@hub-cloud.browserstack.com/wd/hub"
87
-
88
- capabilities = {}
89
- capabilities['device'] = ENV['BS_DEVICE']
90
- capabilities['os_version'] = ENV['BS_OS_VERSION']
91
- capabilities['app'] = "bs://#{ENV['APP_URL']}" if ENV['APP_URL']
92
- capabilities['app'] = ENV['APP_ID'] if ENV['APP_ID']
93
- capabilities['realMobile'] = true
94
- capabilities['project'] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
95
- capabilities['build'] = ENV['AUTOMATE_BUILD'] if ENV['AUTOMATE_BUILD']
96
- capabilities['deviceOrientation'] = ENV['ORIENTATION'] if ENV['ORIENTATION']
97
- capabilities['browserstack.debug'] = true
98
- capabilities['browserstack.video'] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
99
- capabilities['browserstack.debug'] = 'true'
100
-
101
- appium_lib_options = { server_url: endpoint }
102
- desired_capabilities = {
103
- appium_lib: appium_lib_options,
104
- caps: capabilities
105
- }
106
- end
107
- else
108
- base_path = 'config'
109
- unless File.directory?(File.join(@config_file, base_path))
110
- raise 'Could not find appium.txt files in /config folder'
111
- end
112
- appium_caps = File.join(@config_file, base_path, 'appium.txt')
113
- desired_capabilities = Appium.load_appium_txt file: appium_caps
114
- end
115
-
116
- puts "Appium desired_capabilities = #{desired_capabilities}" if ENV['DEBUG']
117
-
118
- Appium::Driver.new(desired_capabilities).start_driver
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']
72
+
73
+ desired_capabilities = {
74
+ caps: capabilities,
75
+ appium_lib: { server_url: @endpoint }
76
+ }
77
+ Appium::Driver.new(desired_capabilities, true).start_driver
119
78
  @running = true
120
- Appium.promote_appium_methods TestCentricity::ScreenObject
121
- Appium.promote_appium_methods TestCentricity::ScreenSection
122
- 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)
123
82
 
124
83
  Environ.screen_size = $driver.window_size
125
84
  end
@@ -144,14 +103,18 @@ module TestCentricity
144
103
  $driver.install_app(app_path)
145
104
  end
146
105
 
147
- def self.app_installed?(bundle_id)
148
- $driver.app_installed?(bundle_id)
106
+ def self.app_installed?(bundle_id = nil)
107
+ $driver.app_installed?(get_app_id(bundle_id))
149
108
  end
150
109
 
151
110
  def self.launch_app
152
111
  $driver.launch_app
153
112
  end
154
113
 
114
+ def self.background_app(duration)
115
+ $driver.background_app(duration)
116
+ end
117
+
155
118
  def self.close_app
156
119
  $driver.close_app
157
120
  end
@@ -160,8 +123,20 @@ module TestCentricity
160
123
  $driver.reset
161
124
  end
162
125
 
163
- def self.remove_app(bundle_id)
164
- $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))
165
140
  end
166
141
 
167
142
  def self.implicit_wait(timeout)
@@ -176,10 +151,18 @@ module TestCentricity
176
151
  $driver.is_keyboard_shown
177
152
  end
178
153
 
154
+ def self.orientation
155
+ $driver.orientation
156
+ end
157
+
179
158
  def self.set_orientation(orientation)
180
159
  $driver.rotation = orientation.downcase.to_sym
181
160
  end
182
161
 
162
+ def self.geolocation
163
+ $driver.location
164
+ end
165
+
183
166
  def self.set_geolocation(latitude, longitude, altitude)
184
167
  $driver.set_location(latitude, longitude, altitude)
185
168
  end
@@ -215,6 +198,267 @@ module TestCentricity
215
198
  set_context(contexts.last)
216
199
  puts "Current context = #{$driver.current_context}" if ENV['DEBUG']
217
200
  end
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
+
235
+ private
236
+
237
+ def self.get_app_id(bundle_id = nil)
238
+ return bundle_id unless bundle_id.nil?
239
+
240
+ if Environ.is_ios?
241
+ Environ.current.ios_bundle_id
242
+ elsif Environ.is_android?
243
+ Environ.current.android_app_id
244
+ else
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
305
+ end
306
+ caps
307
+ else
308
+ @capabilities
309
+ end
310
+ end
311
+
312
+ # :nocov:
313
+ def self.browserstack_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
460
+ end
461
+ # :nocov:
218
462
  end
219
463
  end
220
464