bugsnag-maze-runner 6.27.0 → 7.22.1

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 +206 -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 +101 -21
  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
@@ -0,0 +1,257 @@
1
+ # Selenium capabilities for browsers available on BrowserStack
2
+ ---
3
+ ie_8:
4
+ browserName: "ie"
5
+ browserVersion: "8"
6
+ os: "windows"
7
+ osVersion: "7"
8
+
9
+ ie_9:
10
+ browserName: "ie"
11
+ browserVersion: "9"
12
+ os: "windows"
13
+ osVersion: "7"
14
+
15
+ ie_10:
16
+ browserName: "ie"
17
+ browserVersion: "10"
18
+ os: "windows"
19
+ osVersion: "8"
20
+
21
+ ie_11:
22
+ browserName: "ie"
23
+ browserVersion: "11"
24
+ os: "windows"
25
+ osVersion: "10"
26
+
27
+ edge_14:
28
+ browserName: "edge"
29
+ browserVersion: "14"
30
+ os: "windows"
31
+ osVersion: "10"
32
+
33
+ edge_15:
34
+ browserName: "edge"
35
+ browserVersion: "15"
36
+ os: "windows"
37
+ osVersion: "10"
38
+
39
+ edge_17:
40
+ browser: "edge"
41
+ browser_version: "17"
42
+ os: "windows"
43
+ os_version: "10"
44
+
45
+ edge_80:
46
+ browser: "edge"
47
+ browser_version: "80"
48
+ os: "windows"
49
+ os_version: "11"
50
+
51
+ safari_6:
52
+ browserName: "safari"
53
+ browserVersion: "6"
54
+ os: "OS X"
55
+ osVersion: "lion"
56
+
57
+ safari_10:
58
+ browserName: "safari"
59
+ browserVersion: "10.0"
60
+ os: "OS X"
61
+ osVersion: "sierra"
62
+
63
+ safari_11:
64
+ browserName: "safari"
65
+ browserVersion: "11.1"
66
+ os: "OS X"
67
+ osVersion: "High Sierra"
68
+
69
+ safari_13:
70
+ browserName: "Safari"
71
+ browserVersion: "13.0"
72
+ os: "OS X"
73
+ osVersion: "Catalina"
74
+
75
+ safari_14:
76
+ browserName: "Safari"
77
+ browserVersion: "14.0"
78
+ os: "OS X"
79
+ osVersion: "Big Sur"
80
+
81
+ safari_15:
82
+ browserName: "Safari"
83
+ browserVersion: "15.0"
84
+ os: "OS X"
85
+ osVersion: "Monterey"
86
+
87
+ safari_16:
88
+ browserName: "Safari"
89
+ browserVersion: "16.0"
90
+ os: "OS X"
91
+ osVersion: "Ventura"
92
+
93
+ iphone_6s:
94
+ browserName: "iphone"
95
+ device: "iPhone 6S"
96
+ os: "ios"
97
+ osVersion: "9.0"
98
+ realMobile: true
99
+
100
+ iphone_7:
101
+ browserName: "iphone"
102
+ device: "iPhone 7"
103
+ os: "ios"
104
+ osVersion: "10.3"
105
+ realMobile: true
106
+
107
+ iphone_x:
108
+ browserName: "iphone"
109
+ device: "iPhone X"
110
+ os: "ios"
111
+ osVersion: "11"
112
+ realMobile: true
113
+
114
+ iphone_xs:
115
+ browserName: "iphone"
116
+ device: "iPhone XS"
117
+ os: "ios"
118
+ osVersion: "12"
119
+ realMobile: true
120
+
121
+ iphone_13:
122
+ browserName: "iphone"
123
+ device: "iPhone 13"
124
+ os: "ios"
125
+ osVersion: "15.4"
126
+ realMobile: true
127
+
128
+ android_nexus5:
129
+ browserName: "Android Browser"
130
+ device: "Google Nexus 5"
131
+ os: "android"
132
+ osVersion: "4.4"
133
+ realMobile: true
134
+
135
+ android_s6:
136
+ browserName: "Android Browser"
137
+ device: "Samsung Galaxy S6"
138
+ os: "android"
139
+ osVersion: "5.0"
140
+ realMobile: true
141
+
142
+ android_s7:
143
+ browserName: "Android Browser"
144
+ device: "Samsung Galaxy S7"
145
+ os: "android"
146
+ osVersion: "6.0"
147
+ realMobile: true
148
+
149
+ android_s8:
150
+ browserName: "Android Browser"
151
+ device: "Samsung Galaxy S8 Plus"
152
+ os: "android"
153
+ osVersion: "7.0"
154
+ realMobile: true
155
+
156
+ firefox_30:
157
+ browserName: "firefox"
158
+ browserVersion: "30"
159
+ os: "windows"
160
+ osVersion: "7"
161
+
162
+ firefox_56:
163
+ browserName: "firefox"
164
+ browserVersion: "56"
165
+ os: "windows"
166
+ osVersion: "10"
167
+
168
+ firefox_60:
169
+ browserName: "firefox"
170
+ browserVersion: "60"
171
+ os: "windows"
172
+ osVersion: "10"
173
+
174
+ firefox_78:
175
+ browser: "firefox"
176
+ browser_version: "78"
177
+ os: "windows"
178
+ os_version: "10"
179
+
180
+ firefox_latest:
181
+ browserName: "firefox"
182
+ browserVersion: "latest"
183
+ os: "windows"
184
+ osVersion: "10"
185
+
186
+ chrome_30:
187
+ browserName: "chrome"
188
+ browserVersion: "30.0"
189
+ os: "windows"
190
+ osVersion: "7"
191
+
192
+ chrome_32:
193
+ browserName: "chrome"
194
+ browserVersion: "32.0"
195
+ os: "windows"
196
+ osVersion: "7"
197
+
198
+ chrome_34:
199
+ browserName: "chrome"
200
+ browserVersion: "34.0"
201
+ os: "windows"
202
+ osVersion: "7"
203
+
204
+ chrome_36:
205
+ browserName: "chrome"
206
+ browserVersion: "36.0"
207
+ os: "windows"
208
+ osVersion: "7"
209
+
210
+ chrome_38:
211
+ browserName: "chrome"
212
+ browserVersion: "38.0"
213
+ os: "windows"
214
+ osVersion: "7"
215
+
216
+ chrome_40:
217
+ browserName: "chrome"
218
+ browserVersion: "40.0"
219
+ os: "windows"
220
+ osVersion: "7"
221
+
222
+ chrome_42:
223
+ browserName: "chrome"
224
+ browserVersion: "42.0"
225
+ os: "windows"
226
+ osVersion: "7"
227
+
228
+ chrome_43:
229
+ browserName: "chrome"
230
+ browserVersion: "43.0"
231
+ os: "windows"
232
+ osVersion: "7"
233
+
234
+ chrome_53:
235
+ browser: "chrome"
236
+ browser_version: "53.0"
237
+ os: "windows"
238
+ os_version: "10"
239
+
240
+ chrome_61:
241
+ browserName: "chrome"
242
+ browserVersion: "61.0"
243
+ os: "windows"
244
+ osVersion: "10"
245
+
246
+ chrome_72:
247
+ browser: "chrome"
248
+ browser_version: "72.0"
249
+ os: "windows"
250
+ os_version: "10"
251
+
252
+ chrome_latest:
253
+ browserName: "chrome"
254
+ browserVersion: "latest"
255
+ os: "windows"
256
+ osVersion: "10"
257
+ seleniumVersion: "3.14.0"
@@ -0,0 +1,89 @@
1
+ require 'selenium-webdriver'
2
+
3
+ module Maze
4
+ module Client
5
+ module Selenium
6
+ class BrowserStackClient < BaseClient
7
+ def start_session
8
+ # Set up the capabilities
9
+ browsers = YAML.safe_load(File.read("#{__dir__}/bs_browsers.yml"))
10
+
11
+ config = Maze.config
12
+ browser = browsers[config.browser]
13
+
14
+ if config.legacy_driver?
15
+ capabilities = ::Selenium::WebDriver::Remote::Capabilities.new
16
+ capabilities['browserstack.local'] = 'true'
17
+ capabilities['browserstack.localIdentifier'] = Maze.run_uuid
18
+ capabilities['browserstack.console'] = 'errors'
19
+
20
+ # Convert W3S capabilities to JSON-WP
21
+ capabilities['browser'] = browser['browserName']
22
+ capabilities['browser_version'] = browser['browserVersion']
23
+ capabilities['device'] = browser['device']
24
+ capabilities['os'] = browser['os']
25
+ capabilities['os_version'] = browser['osVersion']
26
+
27
+ capabilities.merge! JSON.parse(config.capabilities_option)
28
+ capabilities.merge! project_name_capabilities
29
+ config.capabilities = capabilities
30
+ else
31
+ capabilities = {
32
+ 'bstack:options' => {
33
+ 'local' => 'true',
34
+ 'localIdentifier' => Maze.run_uuid
35
+ }
36
+ }
37
+ capabilities.deep_merge! browser
38
+ capabilities.deep_merge! JSON.parse(config.capabilities_option)
39
+ capabilities.merge! project_name_capabilities
40
+ config.capabilities = ::Selenium::WebDriver::Remote::Capabilities.new capabilities
41
+ end
42
+
43
+ # Start the tunnel
44
+ Maze::Client::BrowserStackClientUtils.start_local_tunnel config.bs_local,
45
+ Maze.run_uuid,
46
+ config.access_key
47
+
48
+ # Start the driver
49
+ selenium_url = "https://#{config.username}:#{config.access_key}@hub.browserstack.com/wd/hub"
50
+ Maze.driver = Maze::Driver::Browser.new :remote, selenium_url, config.capabilities
51
+ Maze.driver.start_driver
52
+
53
+ # Log details for the session
54
+ log_session_info
55
+ end
56
+
57
+ def stop_session
58
+ super
59
+ Maze::Client::BrowserStackClientUtils.stop_local_tunnel
60
+ end
61
+
62
+ private
63
+
64
+ # Determines and returns sensible project and build capabilities
65
+ #
66
+ # @return [Hash] A hash containing the 'project' and 'build' capabilities
67
+ def project_name_capabilities
68
+ # Default to values for running locally
69
+ project = 'local'
70
+
71
+ if ENV['BUILDKITE']
72
+ # Project
73
+ project = ENV['BUILDKITE_PIPELINE_NAME']
74
+ end
75
+ {
76
+ project: project,
77
+ build: Maze.run_uuid
78
+ }
79
+ end
80
+
81
+ def log_session_info
82
+ # Log a link to the BrowserStack session search dashboard
83
+ url = "https://automate.browserstack.com/dashboard/v2/search?query=#{Maze.run_uuid}&type=builds"
84
+ $logger.info Maze::LogUtil.linkify url, 'BrowserStack session(s)'
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,16 @@
1
+ module Maze
2
+ module Client
3
+ module Selenium
4
+ class LocalClient < BaseClient
5
+ def start_session
6
+ Maze.driver = Maze::Driver::Browser.new Maze.config.browser.to_sym
7
+ Maze.driver.start_driver
8
+ end
9
+
10
+ def stop_session
11
+ # No need to quit the local driver
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Maze
2
+ module Client
3
+ module Selenium
4
+ def self.start
5
+ client_class =
6
+ case Maze.config.farm
7
+ when :bb then BitBarClient
8
+ when :bs then BrowserStackClient
9
+ when :local then LocalClient
10
+ end
11
+
12
+ client_class.new.tap(&:start_session)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -10,6 +10,7 @@ module Maze
10
10
  self.receive_requests_wait = 30
11
11
  self.enforce_bugsnag_integrity = true
12
12
  self.captured_invalid_requests = Set[:errors, :sessions, :builds, :uploads, :sourcemaps]
13
+ @legacy_driver = false
13
14
  end
14
15
 
15
16
  #
@@ -60,13 +61,16 @@ module Maze
60
61
  # The server endpoints for which invalid requests should be captured and cause tests to fail
61
62
  attr_accessor :captured_invalid_requests
62
63
 
64
+ # API key to use when repeating requests
65
+ attr_accessor :repeater_api_key
66
+
67
+ # Enables awareness of a public IP address on Buildkite with the Elastic CI Stack for AWS.
68
+ attr_accessor :aws_public_ip
69
+
63
70
  #
64
71
  # General appium configuration
65
72
  #
66
73
 
67
- # Whether each scenario should have its own Appium session
68
- attr_accessor :appium_session_isolation
69
-
70
74
  # Element locator strategy, :id or :accessibility_id
71
75
  attr_accessor :locator
72
76
 
@@ -82,16 +86,15 @@ module Maze
82
86
  # - on macOS, the name of an installed or previously executed application
83
87
  attr_accessor :app
84
88
 
85
- # Whether the ResilientAppium driver should be used (only applicable when using Appium in the first place)
86
- attr_accessor :resilient
87
-
88
89
  # Device farm to be used, one of:
89
- # :cbt (CrossBrowserTesting)
90
90
  # :bs (BrowserStack)
91
91
  # :local (Using Appium Server with a local device)
92
92
  # :none (Cucumber-driven testing with no devices)
93
93
  attr_accessor :farm
94
94
 
95
+ # Whether the device farm secure tunnel should be started
96
+ attr_accessor :start_tunnel
97
+
95
98
  #
96
99
  # Device farm specific configuration
97
100
  #
@@ -102,9 +105,6 @@ module Maze
102
105
  # Location of the BrowserStackLocal binary (if used)
103
106
  attr_accessor :bs_local
104
107
 
105
- # Location of the Sauce Connect binary (if used)
106
- attr_accessor :sl_local
107
-
108
108
  # Bundle ID of the test application
109
109
  attr_accessor :app_bundle_id
110
110
 
@@ -132,6 +132,14 @@ module Maze
132
132
  # Access token for the test-management service
133
133
  attr_accessor :tms_token
134
134
 
135
+ # Whether the legacy (JSON-WP) Appium driver should be used
136
+ def legacy_driver?
137
+ @legacy_driver
138
+ end
139
+
140
+ def legacy_driver=(value)
141
+ @legacy_driver = value
142
+ end
135
143
 
136
144
  #
137
145
  # Local testing specific configuration
data/lib/maze/docker.rb CHANGED
@@ -54,6 +54,45 @@ module Maze
54
54
  @services_started = true
55
55
  end
56
56
 
57
+ # Execute a command in an already running docker container. Use {start_service}
58
+ # to build and run the service before calling this method
59
+ #
60
+ # This is equivalent to the Docker Compose 'exec' command:
61
+ # https://docs.docker.com/engine/reference/commandline/compose_exec/
62
+ #
63
+ # @param service [String] The name of the service. This must already be running
64
+ # @param command [String] The command to run
65
+ # @param detach [Boolean] Optional. Whether to run detached
66
+ def exec(service, command, detach: false)
67
+ flags = detach ? " --detach" : ""
68
+
69
+ run_docker_compose_command("exec #{flags} #{service} /bin/sh -c '#{command}'")
70
+ end
71
+
72
+ # Copy a file or directory from a container to the local filesystem
73
+ #
74
+ # This is equivalent to the Docker Compose 'cp' command:
75
+ # https://docs.docker.com/engine/reference/commandline/compose_cp/
76
+ #
77
+ # @param service [String] The name of the service to copy from. This must already be running
78
+ # @param from [String] The path to the file/directory that should be copied
79
+ # @param to [String] The path to copy the file/directory to
80
+ def copy_from_container(service, from:, to:)
81
+ run_docker_compose_command("cp #{service}:#{from} #{to}", success_codes: [0])
82
+ end
83
+
84
+ # Copy a file or directory from the local filesystem to a container
85
+ #
86
+ # This is equivalent to the Docker Compose 'cp' command:
87
+ # https://docs.docker.com/engine/reference/commandline/compose_cp/
88
+ #
89
+ # @param service [String] The name of the service to copy to. This must already be running
90
+ # @param from [String] The path to the file/directory that should be copied
91
+ # @param to [String] The path to copy the file/directory to
92
+ def copy_to_container(service, from:, to:)
93
+ run_docker_compose_command("cp #{from} #{service}:#{to}", success_codes: [0])
94
+ end
95
+
57
96
  # Kills a running service
58
97
  #
59
98
  # @param service [String] The name of the service to kill
@@ -91,7 +130,7 @@ module Maze
91
130
  def get_docker_compose_command(command)
92
131
  project_name = compose_project_name.nil? ? '' : "-p #{compose_project_name}"
93
132
 
94
- "docker-compose #{project_name} -f #{COMPOSE_FILENAME} #{command}"
133
+ "docker compose #{project_name} -f #{COMPOSE_FILENAME} #{command}"
95
134
  end
96
135
 
97
136
  def run_docker_compose_command(command, success_codes: nil)
@@ -10,6 +10,10 @@ module Maze
10
10
  # Provide a thin layer of abstraction above @see Appium::Driver
11
11
  class Appium < Appium::Driver
12
12
 
13
+ # @!attribute [rw] app_id
14
+ # @return [String] The app_id derived from session_capabilities (appPackage on Android, bundleID on iOS)
15
+ attr_accessor :app_id
16
+
13
17
  # @!attribute [r] device_type
14
18
  # @return [String] The device, from the list of device capabilities, used for this test
15
19
  attr_reader :device_type
@@ -25,11 +29,10 @@ module Maze
25
29
  # @param locator [Symbol] the primary locator strategy Appium should use to find elements
26
30
  def initialize(server_url, capabilities, locator = :id)
27
31
  # Sets up identifiers for ease of connecting jobs
28
- name_capabilities = project_name_capabilities
32
+ capabilities ||= {}
29
33
 
30
34
  @element_locator = locator
31
35
  @capabilities = capabilities
32
- @capabilities.merge! name_capabilities
33
36
 
34
37
  # Timers
35
38
  @find_element_timer = Maze.timers.add 'Appium - find element'
@@ -43,10 +46,6 @@ module Maze
43
46
  server_url: server_url
44
47
  }
45
48
  }, true)
46
-
47
- $logger.info 'Appium driver initialized for:'
48
- $logger.info " project : #{name_capabilities[:project]}"
49
- $logger.info " build : #{name_capabilities[:build]}"
50
49
  end
51
50
 
52
51
  # Starts the Appium driver
@@ -187,24 +186,6 @@ module Maze
187
186
  reset
188
187
  end
189
188
 
190
- # Determines and returns sensible project, build, and name capabilities
191
- #
192
- # @return [Hash] A hash containing the 'project' and 'build' capabilities
193
- def project_name_capabilities
194
- # Default to values for running locally
195
- project = 'local'
196
- build = SecureRandom.uuid
197
-
198
- if ENV['BUILDKITE']
199
- # Project
200
- project = ENV['BUILDKITE_PIPELINE_NAME']
201
- end
202
- {
203
- project: project,
204
- build: build
205
- }
206
- end
207
-
208
189
  def device_info
209
190
  driver.execute_script('mobile:deviceInfo')
210
191
  end
@@ -11,12 +11,10 @@ module Maze
11
11
  attr_reader :capabilities
12
12
 
13
13
  def initialize(driver_for, selenium_url=nil, capabilities=nil)
14
- capabilities.merge! project_name_capabilities
14
+ capabilities ||= {}
15
15
  @capabilities = capabilities
16
16
  @driver_for = driver_for
17
17
  @selenium_url = selenium_url
18
-
19
- start_driver
20
18
  end
21
19
 
22
20
  def find_element(*args)
@@ -62,24 +60,6 @@ module Maze
62
60
  JAVASCRIPT
63
61
  end
64
62
 
65
- # Determines and returns sensible project and build capabilities
66
- #
67
- # @return [Hash] A hash containing the 'project' and 'build' capabilities
68
- def project_name_capabilities
69
- # Default to values for running locally
70
- project = 'local'
71
- build = SecureRandom.uuid
72
-
73
- if ENV['BUILDKITE']
74
- # Project
75
- project = ENV['BUILDKITE_PIPELINE_NAME']
76
- end
77
- {
78
- project: project,
79
- build: build
80
- }
81
- end
82
-
83
63
  # Restarts the underlying-driver in the case an unrecoverable error occurs
84
64
  #
85
65
  # @param attempts [Integer] The number of times we should retry a failed attempt (defaults to 6)
@@ -91,8 +71,6 @@ module Maze
91
71
  start_driver(attempts)
92
72
  end
93
73
 
94
- private
95
-
96
74
  # Attempts to create a new selenium driver a given number of times
97
75
  #
98
76
  # @param attempts [Integer] The number of times we should retry a failed attempt (defaults to 6)
@@ -114,15 +92,23 @@ module Maze
114
92
  end
115
93
  end
116
94
 
95
+ private
96
+
117
97
  # Creates and starts the selenium driver
118
98
  def create_driver(driver_for, selenium_url=nil)
119
99
  begin
120
100
  $logger.info "Starting Selenium driver"
121
101
  time = Time.now
122
102
  if driver_for == :remote
123
- driver = ::Selenium::WebDriver.for :remote,
124
- url: selenium_url,
125
- desired_capabilities: @capabilities
103
+ if Maze.config.legacy_driver?
104
+ driver = ::Selenium::WebDriver.for :remote,
105
+ url: selenium_url,
106
+ desired_capabilities: @capabilities
107
+ else
108
+ driver = ::Selenium::WebDriver.for :remote,
109
+ url: selenium_url,
110
+ capabilities: @capabilities
111
+ end
126
112
  else
127
113
  driver = ::Selenium::WebDriver.for driver_for
128
114
  end
data/lib/maze/errors.rb CHANGED
@@ -1,3 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'appium_lib'
4
+
1
5
  module Maze
2
6
  module Error
3
7
  # An error raised when an appium element cannot be found
@@ -16,5 +20,33 @@ module Maze
16
20
  super(message)
17
21
  end
18
22
  end
23
+
24
+ ERROR_CODES = {
25
+ ::Selenium::WebDriver::Error::UnknownError => {
26
+ retry: true,
27
+ error_code: 10
28
+ },
29
+ ::Selenium::WebDriver::Error::WebDriverError => {
30
+ retry: true,
31
+ error_code: 10
32
+ },
33
+ Maze::Error::AppiumElementNotFoundError => {
34
+ retry: true,
35
+ error_code: 11
36
+ },
37
+ ::Selenium::WebDriver::Error::NoSuchElementError => {
38
+ retry: true,
39
+ error_code: 12
40
+ },
41
+ ::Selenium::WebDriver::Error::TimeoutError => {
42
+ retry: true,
43
+ error_code: 13
44
+ },
45
+ ::Selenium::WebDriver::Error::StaleElementReferenceError => {
46
+ retry: true,
47
+ error_code: 14
48
+ },
49
+ }.freeze
50
+
19
51
  end
20
52
  end