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.
- checksums.yaml +4 -4
- data/bin/download-logs +14 -16
- data/bin/maze-runner +53 -15
- data/bin/upload-app +6 -6
- data/lib/features/steps/breadcrumb_steps.rb +44 -14
- data/lib/features/steps/error_reporting_steps.rb +16 -0
- data/lib/features/steps/network_steps.rb +66 -6
- data/lib/features/steps/payload_steps.rb +23 -0
- data/lib/features/steps/request_assertion_steps.rb +87 -8
- data/lib/features/steps/runner_steps.rb +22 -0
- data/lib/features/steps/session_tracking_steps.rb +1 -1
- data/lib/features/steps/trace_steps.rb +254 -0
- data/lib/features/support/internal_hooks.rb +31 -84
- data/lib/maze/api/appium/file_manager.rb +29 -0
- data/lib/maze/aws_public_ip.rb +53 -0
- data/lib/maze/checks/assert_check.rb +9 -31
- data/lib/maze/client/appium/base_client.rb +131 -0
- data/lib/maze/client/appium/bb_client.rb +102 -0
- data/lib/maze/client/appium/bb_devices.rb +127 -0
- data/lib/maze/client/appium/bs_client.rb +91 -0
- data/lib/maze/client/appium/bs_devices.rb +141 -0
- data/lib/maze/client/appium/bs_legacy_client.rb +31 -0
- data/lib/maze/client/appium/local_client.rb +67 -0
- data/lib/maze/client/appium.rb +23 -0
- data/lib/maze/client/bb_api_client.rb +102 -0
- data/lib/maze/client/bb_client_utils.rb +181 -0
- data/lib/maze/client/bs_client_utils.rb +168 -0
- data/lib/maze/client/selenium/base_client.rb +15 -0
- data/lib/maze/client/selenium/bb_browsers.yml +188 -0
- data/lib/maze/client/selenium/bb_client.rb +38 -0
- data/lib/maze/client/selenium/bs_browsers.yml +257 -0
- data/lib/maze/client/selenium/bs_client.rb +89 -0
- data/lib/maze/client/selenium/local_client.rb +16 -0
- data/lib/maze/client/selenium.rb +16 -0
- data/lib/maze/configuration.rb +18 -10
- data/lib/maze/docker.rb +40 -1
- data/lib/maze/driver/appium.rb +5 -24
- data/lib/maze/driver/browser.rb +12 -26
- data/lib/maze/errors.rb +32 -0
- data/lib/maze/generator.rb +55 -0
- data/lib/maze/helper.rb +7 -3
- data/lib/maze/hooks/appium_hooks.rb +29 -190
- data/lib/maze/hooks/browser_hooks.rb +2 -55
- data/lib/maze/hooks/error_code_hook.rb +49 -0
- data/lib/maze/hooks/hooks.rb +2 -2
- data/lib/maze/http_request.rb +21 -0
- data/lib/maze/logger.rb +16 -3
- data/lib/maze/maze_output.rb +88 -0
- data/lib/maze/option/parser.rb +17 -22
- data/lib/maze/option/processor.rb +21 -34
- data/lib/maze/option/validator.rb +38 -67
- data/lib/maze/option.rb +16 -18
- data/lib/maze/plugins/cucumber_report_plugin.rb +1 -1
- data/lib/maze/plugins/error_code_plugin.rb +21 -0
- data/lib/maze/request_list.rb +10 -5
- data/lib/maze/request_repeater.rb +49 -0
- data/lib/maze/retry_handler.rb +4 -13
- data/lib/maze/schemas/OtelTraceSchema.json +390 -0
- data/lib/maze/schemas/trace_schema.rb +7 -0
- data/lib/maze/schemas/trace_validator.rb +98 -0
- data/lib/maze/server.rb +74 -30
- data/lib/maze/servlets/base_servlet.rb +10 -5
- data/lib/maze/servlets/command_servlet.rb +10 -7
- data/lib/maze/servlets/log_servlet.rb +2 -2
- data/lib/maze/servlets/reflective_servlet.rb +12 -11
- data/lib/maze/servlets/servlet.rb +47 -8
- data/lib/maze/servlets/temp.rb +0 -0
- data/lib/maze/servlets/trace_servlet.rb +13 -0
- data/lib/maze.rb +2 -2
- data/lib/utils/deep_merge.rb +17 -0
- data/lib/utils/selenium_money_patch.rb +17 -0
- metadata +97 -17
- data/lib/maze/bitbar_devices.rb +0 -84
- data/lib/maze/bitbar_utils.rb +0 -112
- data/lib/maze/browser_stack_devices.rb +0 -160
- data/lib/maze/browser_stack_utils.rb +0 -164
- data/lib/maze/browsers_bs.yml +0 -220
- data/lib/maze/browsers_cbt.yml +0 -100
- data/lib/maze/capabilities.rb +0 -126
- data/lib/maze/driver/resilient_appium.rb +0 -51
- data/lib/maze/sauce_labs_utils.rb +0 -96
- 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
|
data/lib/maze/browsers_bs.yml
DELETED
@@ -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"
|
data/lib/maze/browsers_cbt.yml
DELETED
@@ -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"
|
data/lib/maze/capabilities.rb
DELETED
@@ -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
|