bugsnag-maze-runner 6.27.0 → 7.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/bin/download-logs +14 -16
  3. data/bin/maze-runner +53 -15
  4. data/bin/upload-app +6 -6
  5. data/lib/features/steps/breadcrumb_steps.rb +44 -14
  6. data/lib/features/steps/error_reporting_steps.rb +16 -0
  7. data/lib/features/steps/network_steps.rb +66 -6
  8. data/lib/features/steps/payload_steps.rb +23 -0
  9. data/lib/features/steps/request_assertion_steps.rb +87 -8
  10. data/lib/features/steps/runner_steps.rb +22 -0
  11. data/lib/features/steps/session_tracking_steps.rb +1 -1
  12. data/lib/features/steps/trace_steps.rb +254 -0
  13. data/lib/features/support/internal_hooks.rb +31 -84
  14. data/lib/maze/api/appium/file_manager.rb +29 -0
  15. data/lib/maze/aws_public_ip.rb +53 -0
  16. data/lib/maze/checks/assert_check.rb +9 -31
  17. data/lib/maze/client/appium/base_client.rb +131 -0
  18. data/lib/maze/client/appium/bb_client.rb +102 -0
  19. data/lib/maze/client/appium/bb_devices.rb +127 -0
  20. data/lib/maze/client/appium/bs_client.rb +91 -0
  21. data/lib/maze/client/appium/bs_devices.rb +141 -0
  22. data/lib/maze/client/appium/bs_legacy_client.rb +31 -0
  23. data/lib/maze/client/appium/local_client.rb +67 -0
  24. data/lib/maze/client/appium.rb +23 -0
  25. data/lib/maze/client/bb_api_client.rb +102 -0
  26. data/lib/maze/client/bb_client_utils.rb +181 -0
  27. data/lib/maze/client/bs_client_utils.rb +168 -0
  28. data/lib/maze/client/selenium/base_client.rb +15 -0
  29. data/lib/maze/client/selenium/bb_browsers.yml +188 -0
  30. data/lib/maze/client/selenium/bb_client.rb +38 -0
  31. data/lib/maze/client/selenium/bs_browsers.yml +257 -0
  32. data/lib/maze/client/selenium/bs_client.rb +89 -0
  33. data/lib/maze/client/selenium/local_client.rb +16 -0
  34. data/lib/maze/client/selenium.rb +16 -0
  35. data/lib/maze/configuration.rb +18 -10
  36. data/lib/maze/docker.rb +40 -1
  37. data/lib/maze/driver/appium.rb +5 -24
  38. data/lib/maze/driver/browser.rb +12 -26
  39. data/lib/maze/errors.rb +32 -0
  40. data/lib/maze/generator.rb +55 -0
  41. data/lib/maze/helper.rb +7 -3
  42. data/lib/maze/hooks/appium_hooks.rb +29 -190
  43. data/lib/maze/hooks/browser_hooks.rb +2 -55
  44. data/lib/maze/hooks/error_code_hook.rb +49 -0
  45. data/lib/maze/hooks/hooks.rb +2 -2
  46. data/lib/maze/http_request.rb +21 -0
  47. data/lib/maze/logger.rb +16 -3
  48. data/lib/maze/maze_output.rb +88 -0
  49. data/lib/maze/option/parser.rb +17 -22
  50. data/lib/maze/option/processor.rb +21 -34
  51. data/lib/maze/option/validator.rb +38 -67
  52. data/lib/maze/option.rb +16 -18
  53. data/lib/maze/plugins/cucumber_report_plugin.rb +1 -1
  54. data/lib/maze/plugins/error_code_plugin.rb +21 -0
  55. data/lib/maze/request_list.rb +10 -5
  56. data/lib/maze/request_repeater.rb +49 -0
  57. data/lib/maze/retry_handler.rb +4 -13
  58. data/lib/maze/schemas/OtelTraceSchema.json +390 -0
  59. data/lib/maze/schemas/trace_schema.rb +7 -0
  60. data/lib/maze/schemas/trace_validator.rb +98 -0
  61. data/lib/maze/server.rb +74 -30
  62. data/lib/maze/servlets/base_servlet.rb +10 -5
  63. data/lib/maze/servlets/command_servlet.rb +10 -7
  64. data/lib/maze/servlets/log_servlet.rb +2 -2
  65. data/lib/maze/servlets/reflective_servlet.rb +12 -11
  66. data/lib/maze/servlets/servlet.rb +47 -8
  67. data/lib/maze/servlets/temp.rb +0 -0
  68. data/lib/maze/servlets/trace_servlet.rb +13 -0
  69. data/lib/maze.rb +2 -2
  70. data/lib/utils/deep_merge.rb +17 -0
  71. data/lib/utils/selenium_money_patch.rb +17 -0
  72. metadata +97 -17
  73. data/lib/maze/bitbar_devices.rb +0 -84
  74. data/lib/maze/bitbar_utils.rb +0 -112
  75. data/lib/maze/browser_stack_devices.rb +0 -160
  76. data/lib/maze/browser_stack_utils.rb +0 -164
  77. data/lib/maze/browsers_bs.yml +0 -220
  78. data/lib/maze/browsers_cbt.yml +0 -100
  79. data/lib/maze/capabilities.rb +0 -126
  80. data/lib/maze/driver/resilient_appium.rb +0 -51
  81. data/lib/maze/sauce_labs_utils.rb +0 -96
  82. data/lib/maze/smart_bear_utils.rb +0 -71
@@ -1,164 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Maze
4
- # Utils supporting the BrowserStack device farm integration
5
- class BrowserStackUtils
6
- class << self
7
-
8
- # Uploads an app to BrowserStack for later consumption
9
- # @param username [String] the BrowserStack username
10
- # @param access_key [String] the BrowserStack access key
11
- # @param app_id_file [String] the file to write the uploaded app url to BrowserStack
12
- def upload_app(username, access_key, app, app_id_file=nil)
13
- if app.start_with? 'bs://'
14
- app_url = app
15
- $logger.info "Using pre-uploaded app from #{app}"
16
- else
17
- expanded_app = Maze::Helper.expand_path(app)
18
-
19
- uri = URI('https://api-cloud.browserstack.com/app-automate/upload')
20
- request = Net::HTTP::Post.new(uri)
21
- request.basic_auth(username, access_key)
22
- request.set_form({ 'file' => File.new(expanded_app, 'rb') }, 'multipart/form-data')
23
-
24
- upload_tries = 0
25
- allowed_tries = 10
26
-
27
- while upload_tries < allowed_tries
28
- $logger.info "Uploading app: #{expanded_app}"
29
- res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
30
- http.request(request)
31
- end
32
-
33
- begin
34
- body = res.body
35
- response = JSON.parse body
36
- if response.include?('error')
37
- $logger.error "Upload failed due to error: #{response['error']}"
38
- elsif !response.include?('app_url')
39
- $logger.error "Upload failed, response did not include an app_url: #{res}"
40
- else
41
- # Successful upload
42
- break
43
- end
44
- rescue JSON::ParserError
45
- $logger.error "Error: expected JSON response, received: #{body}"
46
- end
47
-
48
- upload_tries += 1
49
- if upload_tries < allowed_tries
50
- $logger.info 'Retrying upload in 60s'
51
- Kernel::sleep 60
52
- end
53
- end
54
-
55
- if response.nil? || response.include?('error') || !response.include?('app_url')
56
- raise "Failed to upload app after #{upload_tries} attempts"
57
- end
58
-
59
- app_url = response['app_url']
60
- $logger.info "app uploaded to: #{app_url}"
61
- $logger.info 'You can use this url to avoid uploading the same app more than once.'
62
- end
63
-
64
- unless app_id_file.nil?
65
- $logger.info "Writing uploaded app url to #{app_id_file}"
66
- File.write(Maze::Helper.expand_path(app_id_file), app_url)
67
- end
68
-
69
- app_url
70
- end
71
-
72
- # Starts the BrowserStack local tunnel
73
- # @param bs_local [String] path to the BrowserStackLocal binary
74
- # @param local_id [String] unique key for the tunnel instance
75
- # @param access_key [String] BrowserStack access key
76
- def start_local_tunnel(bs_local, local_id, access_key)
77
- $logger.info 'Starting BrowserStack local tunnel'
78
- command = "#{bs_local} -d start --key #{access_key} --local-identifier #{local_id} " \
79
- '--force-local --only-automate --force'
80
-
81
- # Extract the pid from the output so it gets killed at the end of the run
82
- output = Runner.run_command(command)[0][0]
83
- begin
84
- @pid = JSON.parse(output)['pid']
85
- $logger.info "BrowserStackLocal daemon running under pid #{@pid}"
86
- rescue JSON::ParserError
87
- $logger.warn 'Unable to parse pid from output, BrowserStackLocal will be left to die its own death'
88
- end
89
- end
90
-
91
- # Stops the local tunnel
92
- def stop_local_tunnel
93
- if @pid
94
- $logger.info "Stopping BrowserStack local tunnel"
95
- Process.kill('TERM', @pid)
96
- @pid = nil
97
- end
98
- rescue Errno::ESRCH
99
- # ignored
100
- end
101
-
102
- # Gets the build/session info from BrowserStack
103
- # @param username [String] the BrowserStack username
104
- # @param access_key [String] the BrowserStack access key
105
- # @param build_name [String] the name of the BrowserStack build
106
- def build_info(username, access_key, build_name)
107
- # Get the ID of a build
108
- uri = URI("https://api.browserstack.com/app-automate/builds.json?name=#{build_name}")
109
- request = Net::HTTP::Get.new(uri)
110
- request.basic_auth(username, access_key)
111
-
112
- res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
113
- http.request(request)
114
- end
115
-
116
- build_info = JSON.parse(res.body)
117
-
118
- if !build_info.empty?
119
- build_id = build_info[0]['automation_build']['hashed_id']
120
-
121
- # Get the build info
122
- uri = URI("https://api.browserstack.com/app-automate/builds/#{build_id}/sessions")
123
- request = Net::HTTP::Get.new(uri)
124
- request.basic_auth(username, access_key)
125
-
126
- res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
127
- http.request(request)
128
- end
129
-
130
- build_json = JSON.parse(res.body)
131
- else
132
- raise "No build found for given ID: #{build_name}"
133
- end
134
- build_json
135
- end
136
-
137
- # @param username [String] the BrowserStack username
138
- # @param access_key [String] the BrowserStack access key
139
- # @param name [String] name of the build the log is being downloaded from
140
- # @param log_url [String] url to the log
141
- # @param log_type [Symbol] The type of log we are downloading
142
- def download_log(username, access_key, name, log_url, log_type)
143
- begin
144
- path = File.join(Dir.pwd, 'maze_output', log_type.to_s)
145
- FileUtils.makedirs(path)
146
-
147
- uri = URI(log_url)
148
- request = Net::HTTP::Get.new(uri)
149
- request.basic_auth(username, access_key)
150
-
151
- res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
152
- http.request(request)
153
- end
154
-
155
- $logger.info "Saving #{log_type.to_s} log to #{path}/#{name}.log"
156
- File.open("#{path}/#{name}.log", 'w+') { |file| file.write(res.body) }
157
- rescue StandardError => e
158
- $logger.warn "Unable to save log from #{log_url}"
159
- $logger.warn e
160
- end
161
- end
162
- end
163
- end
164
- end
@@ -1,220 +0,0 @@
1
- # Selenium capabilities for browsers available on BrowserStack
2
- ---
3
- ie_8:
4
- browser: "ie"
5
- browser_version: "8"
6
- os: "windows"
7
- os_version: "7"
8
-
9
- ie_9:
10
- browser: "ie"
11
- browser_version: "9"
12
- os: "windows"
13
- os_version: "7"
14
-
15
- ie_10:
16
- browser: "ie"
17
- browser_version: "10"
18
- os: "windows"
19
- os_version: "8"
20
-
21
- ie_11:
22
- browser: "ie"
23
- browser_version: "11"
24
- os: "windows"
25
- os_version: "10"
26
-
27
- edge_14:
28
- browser: "edge"
29
- browser_version: "14"
30
- os: "windows"
31
- os_version: "10"
32
-
33
- edge_15:
34
- browser: "edge"
35
- browser_version: "15"
36
- os: "windows"
37
- os_version: "10"
38
-
39
- edge_17:
40
- browser: "edge"
41
- browser_version: "17"
42
- os: "windows"
43
- os_version: "10"
44
-
45
- safari_6:
46
- browser: "safari"
47
- browser_version: "6"
48
- os: "OS X"
49
- os_version: "lion"
50
-
51
- safari_10:
52
- browser: "safari"
53
- browser_version: "10.0"
54
- os: "OS X"
55
- os_version: "sierra"
56
-
57
- safari_13:
58
- browser: "Safari"
59
- browser_version: "13.0"
60
- os: "OS X"
61
- os_version: "Catalina"
62
-
63
- safari_14:
64
- browser: "Safari"
65
- browser_version: "14.0"
66
- os: "OS X"
67
- os_version: "Big Sur"
68
-
69
- safari_15:
70
- browser: "Safari"
71
- browser_version: "15.0"
72
- os: "OS X"
73
- os_version: "Monterey"
74
-
75
- iphone_6s:
76
- browser: "iphone"
77
- device: "iPhone 6S"
78
- os: "ios"
79
- os_version: "9.0"
80
- real_mobile: true
81
-
82
- iphone_7:
83
- browser: "iphone"
84
- device: "iPhone 7"
85
- os: "ios"
86
- os_version: "10.3"
87
- real_mobile: true
88
-
89
- iphone_13:
90
- browser: "iphone"
91
- device: "iPhone 13"
92
- os: "ios"
93
- os_version: "15.4"
94
- real_mobile: true
95
-
96
- android_nexus5:
97
- browser: "Android Browser"
98
- device: "Google Nexus 5"
99
- os: "android"
100
- os_version: "4.4"
101
- real_mobile: true
102
-
103
- android_s6:
104
- browser: "Android Browser"
105
- device: "Samsung Galaxy S6"
106
- os: "android"
107
- os_version: "5.0"
108
- real_mobile: true
109
-
110
- android_s7:
111
- browser: "Android Browser"
112
- device: "Samsung Galaxy S7"
113
- os: "android"
114
- os_version: "6.0"
115
- real_mobile: true
116
-
117
- android_s8:
118
- browser: "Android Browser"
119
- device: "Samsung Galaxy S8 Plus"
120
- os: "android"
121
- os_version: "7.0"
122
- real_mobile: true
123
-
124
- firefox_30:
125
- browser: "firefox"
126
- browser_version: "30"
127
- os: "windows"
128
- os_version: "7"
129
-
130
- firefox_56:
131
- browser: "firefox"
132
- browser_version: "56"
133
- os: "windows"
134
- os_version: "10"
135
-
136
- firefox_78:
137
- browser: "firefox"
138
- browser_version: "78"
139
- os: "windows"
140
- os_version: "10"
141
-
142
- firefox_latest:
143
- browser: "firefox"
144
- browser_version: "latest"
145
- os: "windows"
146
- os_version: "10"
147
- selenium_version: "3.10.0"
148
-
149
- chrome_30:
150
- browser: "chrome"
151
- browser_version: "30.0"
152
- os: "windows"
153
- os_version: "7"
154
-
155
- chrome_32:
156
- browser: "chrome"
157
- browser_version: "32.0"
158
- os: "windows"
159
- os_version: "7"
160
-
161
- chrome_34:
162
- browser: "chrome"
163
- browser_version: "34.0"
164
- os: "windows"
165
- os_version: "7"
166
-
167
- chrome_36:
168
- browser: "chrome"
169
- browser_version: "36.0"
170
- os: "windows"
171
- os_version: "7"
172
-
173
- chrome_38:
174
- browser: "chrome"
175
- browser_version: "38.0"
176
- os: "windows"
177
- os_version: "7"
178
-
179
- chrome_40:
180
- browser: "chrome"
181
- browser_version: "40.0"
182
- os: "windows"
183
- os_version: "7"
184
-
185
- chrome_42:
186
- browser: "chrome"
187
- browser_version: "42.0"
188
- os: "windows"
189
- os_version: "7"
190
-
191
- chrome_43:
192
- browser: "chrome"
193
- browser_version: "43.0"
194
- os: "windows"
195
- os_version: "7"
196
-
197
- chrome_53:
198
- browser: "chrome"
199
- browser_version: "53.0"
200
- os: "windows"
201
- os_version: "10"
202
-
203
- chrome_61:
204
- browser: "chrome"
205
- browser_version: "61.0"
206
- os: "windows"
207
- os_version: "10"
208
-
209
- chrome_72:
210
- browser: "chrome"
211
- browser_version: "72.0"
212
- os: "windows"
213
- os_version: "10"
214
-
215
- chrome_latest:
216
- browser: "chrome"
217
- browser_version: "latest"
218
- os: "windows"
219
- os_version: "10"
220
- selenium_version: "3.14.0"
@@ -1,100 +0,0 @@
1
- # Selenium capabilities for browserNames available on CrossbrowserNameTesting
2
- ---
3
- ie_8:
4
- browserName: "Internet Explorer"
5
- version: "8"
6
- platform: "Windows 7"
7
-
8
- ie_9:
9
- browserName: "Internet Explorer"
10
- version: "9"
11
- platform: "Windows 7"
12
-
13
- ie_10:
14
- browserName: "Internet Explorer"
15
- version: "10"
16
- os: "windows"
17
- platform: "Windows 7 64-Bit"
18
-
19
- ie_11:
20
- browserName: "Internet Explorer"
21
- version: "11"
22
- platform: "Windows 7 64-Bit"
23
-
24
- edge_14:
25
- browserName: "MicrosoftEdge"
26
- version: "14"
27
- platform: "Windows 10"
28
-
29
- edge_15:
30
- browserName: "MicrosoftEdge"
31
- version: "15"
32
- platform: "Windows 10"
33
-
34
- safari_8:
35
- browserName: "Safari"
36
- version: "8"
37
- platform: "Mac OSX 10.10"
38
-
39
- safari_10:
40
- browserName: "Safari"
41
- version: "10"
42
- platform: "Mac OSX 10.12"
43
-
44
- safari_13:
45
- browserName: "Safari"
46
- version: "13"
47
- platform: "Mac OSX 10.15"
48
-
49
- safari_14:
50
- browserName: "Safari"
51
- version: "14"
52
- platform: "MacOS 11.0"
53
-
54
- iphone_7_simulator:
55
- browserName: "Safari"
56
- deviceName: "iPhone 7 Simulator"
57
- platformVersion': "10.0"
58
- platformName': "iOS"
59
-
60
- iphone_xr:
61
- browserName: "Safari"
62
- deviceName': "iPhone XR"
63
- platformVersion': "12.1"
64
- platformName': "iOS"
65
-
66
- android_s7:
67
- browserName: "Chrome"
68
- deviceName: "Galaxy S7"
69
- platformVersion: "7.0"
70
- platformName: "Android"
71
-
72
- firefox_30:
73
- browserName: "Firefox"
74
- version: "30"
75
- platform: "Windows 7"
76
-
77
- firefox_56:
78
- browserName: "Firefox"
79
- version: "56"
80
- platform: "Mac OSX 10.13"
81
-
82
- firefox_95:
83
- browserName: "Firefox"
84
- version: "95"
85
- platform: "Windows 10"
86
-
87
- chrome_43:
88
- browserName: "Chrome"
89
- version: "43"
90
- platform: "Windows 7"
91
-
92
- chrome_61:
93
- browserName: "Chrome"
94
- version: "61"
95
- platform: "Windows 10"
96
-
97
- chrome_96:
98
- browserName: "Chrome"
99
- version: "96"
100
- platform: "Windows 10"
@@ -1,126 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Maze
4
- # Appium capabilities for each target farm
5
- class Capabilities
6
- class << self
7
- # @param device_type [String] A key from @see BrowserStackDevices::DEVICE_HASH
8
- # @param local_id [String] unique key for the tunnel instance
9
- # @param capabilities_option [String] extra capabilities provided on the command line
10
- def for_browser_stack_device(device_type, local_id, appium_version, capabilities_option)
11
- capabilities = {
12
- 'browserstack.console' => 'errors',
13
- 'browserstack.localIdentifier' => local_id,
14
- 'browserstack.local' => 'true',
15
- 'noReset' => 'true'
16
- }
17
- capabilities.merge! BrowserStackDevices::DEVICE_HASH[device_type]
18
- capabilities.merge! JSON.parse(capabilities_option)
19
- capabilities['browserstack.appium_version'] = appium_version unless appium_version.nil?
20
- capabilities
21
- end
22
-
23
- # @param browser_type [String] A key from @see browsers_bs.yml
24
- # @param local_id [String] unique key for the tunnel instance
25
- # @param capabilities_option [String] extra capabilities provided on the command line
26
- def for_browser_stack_browser(browser_type, local_id, capabilities_option)
27
- capabilities = Selenium::WebDriver::Remote::Capabilities.new
28
- capabilities['browserstack.local'] = 'true'
29
- capabilities['browserstack.localIdentifier'] = local_id
30
- capabilities['browserstack.console'] = 'errors'
31
- browsers = YAML.safe_load(File.read("#{__dir__}/browsers_bs.yml"))
32
- capabilities.merge! browsers[browser_type]
33
- capabilities.merge! JSON.parse(capabilities_option)
34
- capabilities
35
- end
36
-
37
- # @param browser_type [String] A key from @see browsers_cbt.yml
38
- # @param local_id [String] unique key for the SB tunnel instance
39
- # @param capabilities_option [String] extra capabilities provided on the command line
40
- def for_cbt_browser(browser_type, local_id, capabilities_option)
41
- capabilities = Selenium::WebDriver::Remote::Capabilities.new
42
- capabilities['tunnel_name'] = local_id
43
- browsers = YAML.safe_load(File.read("#{__dir__}/browsers_cbt.yml"))
44
- capabilities.merge! browsers[browser_type]
45
- capabilities.merge! JSON.parse(capabilities_option)
46
- capabilities
47
- end
48
-
49
- # @param device_type [String]
50
- def for_bitbar_device(bitbar_api_key, device_type, platform, platform_version, capabilities_option)
51
- capabilities = {
52
- 'bitbar_apiKey' => bitbar_api_key,
53
- 'bitbar_testrun' => "#{platform} #{platform_version}",
54
- 'bitbar_findDevice' => false,
55
- 'bitbar_testTimeout' => 7200,
56
- 'disabledAnimations' => 'true',
57
- 'noReset' => 'true'
58
- }
59
- capabilities.merge! BitBarDevices.get_device(device_type, platform, platform_version, bitbar_api_key)
60
- capabilities.merge! JSON.parse(capabilities_option)
61
- capabilities
62
- end
63
-
64
- # Constructs Appium capabilities for running on a local Android or iOS device.
65
- # @param platform [String] 'ios' or 'android'
66
- # @param capabilities_option [String] extra capabilities provided on the command line
67
- # @param team_id [String] Apple Team Id, for iOS only
68
- # @param udid [String] device UDID, for iOS only
69
- # noinspection RubyStringKeysInHashInspection
70
- def for_local(platform, capabilities_option, team_id = nil, udid = nil)
71
- capabilities = case platform.downcase
72
- when 'android'
73
- {
74
- 'platformName' => 'Android',
75
- 'automationName' => 'UiAutomator2',
76
- 'autoGrantPermissions' => 'true',
77
- 'noReset' => 'true'
78
- }
79
- when 'ios'
80
- {
81
- 'platformName' => 'iOS',
82
- 'automationName' => 'XCUITest',
83
- 'deviceName' => udid,
84
- 'xcodeOrgId' => team_id,
85
- 'xcodeSigningId' => 'iPhone Developer',
86
- 'udid' => udid,
87
- 'noReset' => 'true',
88
- 'waitForQuiescence' => false,
89
- 'newCommandTimeout' => 0
90
- }
91
- when 'macos'
92
- {
93
- 'platformName' => 'Mac'
94
- }
95
- else
96
- raise "Unsupported platform: #{platform}"
97
- end
98
- common = {
99
- 'os' => platform,
100
- 'autoAcceptAlerts': 'true'
101
- }
102
- capabilities.merge! common
103
- capabilities.merge! JSON.parse(capabilities_option)
104
- end
105
-
106
- def for_sauce_labs_device(device_name, os, os_version, tunnel_id, appium_version, capabilities_option)
107
- capabilities = {
108
- 'noReset' => true,
109
- 'deviceOrientation' => 'portrait',
110
- 'tunnelIdentifier' => tunnel_id,
111
- 'browserName' => '',
112
- 'autoAcceptAlerts' => true,
113
- 'sendKeyStrategy' => 'setValue',
114
- 'waitForQuiescence' => false,
115
- 'newCommandTimeout' => 0
116
- }
117
- capabilities['deviceName'] = device_name unless device_name.nil?
118
- capabilities['platformName'] = os unless os.nil?
119
- capabilities['platformVersion'] = os_version unless os_version.nil?
120
- capabilities.merge! JSON.parse(capabilities_option)
121
- capabilities['appiumVersion'] = appium_version unless appium_version.nil?
122
- capabilities
123
- end
124
- end
125
- end
126
- end
@@ -1,51 +0,0 @@
1
- require 'appium_lib'
2
- require_relative '../logger'
3
-
4
- module Maze
5
- module Driver
6
- # Handles Appium driver restarts and retries in the case of failure. BrowserStack's iOS 10 and 11 iOS devices in
7
- # particular seemed prone to the underlying Appium connection failing.
8
- #
9
- # For methods available on this class, @see AppAutomateDriver.
10
- class ResilientAppium
11
- # Creates the Appium Driver
12
- #
13
- # @param server_url [String] URL of the Appium server
14
- # @param capabilities [Hash] a hash of capabilities to be used in this test run
15
- # @param locator [Symbol] the primary locator strategy Appium should use to find elements
16
- def initialize(server_url, capabilities, locator = :id)
17
- @driver = Appium.new server_url,
18
- capabilities,
19
- locator
20
- end
21
-
22
- def respond_to_missing?(method_name, include_private = false)
23
- @driver.respond_to_missing? method_name, include_private
24
- end
25
-
26
- def method_missing(method, *args, &block)
27
- return super unless @driver.respond_to?(method)
28
-
29
- retries = 0
30
- until retries >= 5
31
- begin
32
- return @driver.send(method, *args, &block)
33
- rescue Selenium::WebDriver::Error::UnknownError, Selenium::WebDriver::Error::WebDriverError => error
34
- retries += 1
35
- $logger.warn 'Appium Error occurred - restarting driver:'
36
- $logger.warn error
37
- sleep 3
38
- restart
39
- end
40
- end
41
-
42
- # Re-raise the last error, although it might be better to re-raise the
43
- # first error instead. Review based on whether we ever hit this.
44
- return if error.nil?
45
-
46
- $logger.error 'Maximum retries exceeded - raising the last error'
47
- raise error
48
- end
49
- end
50
- end
51
- end