Test Configuration Options
This page provides a reference for the valid test configuration options (capabilities) you can set to specify the variable settings for your automated tests running on Sauce Labs.
Try our Sauce Labs Platform Configurator! It provides a graphical user interface where you can specify your settings using option buttons and drop-down menus, then automatically generates the corresponding capabilities code based on your selections. For examples, see Examples of Test Configuration Options for Website Tests.
What You'll Need
- A Sauce Labs account (Log in or sign up for a free trial license)
Terminology
When setting up your test, you'll need to configure your script with settings called capabilities that align with your test environment (e.g., desktop browser, mobile web browser, mobile app). While each environment has its own set of capabilities, they can also be combined. Some are required for a test to run in a given environment, while some are optional.
You'll need to add these configurations to the capabilities or options classes.
- W3C WebDriver Capabilities: Required for any test using Selenium or Appium to communicate with the browser. W3C WebDriver capabilities are universal capabilities for any test, and are usually combined with additional capabilities. See the official W3C Recommendations website for more information.
- Sauce Labs Capabilities: Needed for running a test on the Sauce Labs Cloud, with different possible sets for different environments. Though there aren't any capabilities required, you will need to configure the endpoint URL and should pass the test name and status as capabilities to the remote webdriver.
- Appium Capabilities: Required for tests using Appium on mobile apps and Appium on mobile web browsers.
- Browser-Specific Capabilities: Optional, browser-specific Sauce Labs capabilities.
- Browser Vendor Capabilities: Each browser also has its own set of pre-defined options you can set to help you test. You can add these in regular capabilities or options, or use the browser-defined capabilities (browser options classes) to configure your browser tests:
W3C WebDriver Capabilities – Required
Sauce Labs determines W3C sessions with the presence of sauce:options
capabilities and generic W3C WebDriver-compliant capabilities in your code. See W3C Capabilities Support for more information.
Below are the W3C WebDriver primary test configuration settings for Sauce Labs desktop browser tests and mobile tests.
Use the latest version of the Selenium library in your code for the most up-to-date support.
browserName
| STRING |
Identifies the user agent. See the WebDriver W3C Specification for more information. This setting also applies to emulators, simulators and real devices when automating with a mobile browser. It must be set when App Name is not set.
- For Android v5 and below, the value needs to be
"Browser"
, v6 and above, it is"Chrome"
. - For iOS, the value needs to be
"Safari"
. - For mobile native or hybrid apps, the value needs to be an empty String.
"browserName": "firefox"
browserVersion
| STRING |
Identifies the version of the browser you want to use in your test. See the WebDriver W3C Specification for more information.
To use the latest stable version of Chrome or Firefox that we support, you can use "browserVersion": "latest"
. You can also use "browserVersion": "latest-1"
or "browserVersion": "latest-2"
, etc., to request the next most recent versions of a browser.
For example, if the latest stable version of Chrome is 73, you can request "latest-2"
to use Chrome 71.Note that the latest version for Safari browsers will depend on the chosen "platformName"
.
See the Sauce Labs Platform Configurator for valid options.
This setting cannot be used for mobile browsers, as your test will use the default browser installed for the given Appium version.
"browserVersion": "latest"
platformName
| STRING |
Identifies the name of the operating system the browser or mobile device should be running on. You can use this for dynamic device allocation. Values are not case-sensitive (i.e., "ios"
is the same as "iOS"
). See the WebDriver W3C Specification for more information.
"platformName": "macOS 10.13"
W3C WebDriver Browser Capabilities – Optional
Optional, Sauce-compatible W3C WebDriver specification capabilities you can add to your tests. To view their descriptions, see the W3C WebDriver Specification Capabilities.
acceptInsecureCerts
| BOOLEAN |
Indicates whether untrusted and self-signed TLS certificates are implicitly trusted on navigation for the duration of the session. The default value is false
. See the WebDriver W3C Specification for more information.
"acceptInsecureCerts": true
pageLoadStrategy
| STRING |
Defines the current session’s page load strategy. See the WebDriver W3C Specification for more information. For allowed values and their associated required document readiness state, see WebDriver W3C Specification Page Load Strategies Table.
"pageLoadStrategy": "eager"
proxy
| OBJECT |
Defines the current session’s proxy configuration. See the WebDriver W3C Specification for more information.
"proxy": {"proxyType": "manual",
"httpProxy": "myproxy.com:3128"}
timeouts
| OBJECT |
Describes the timeouts imposed on certain session operations. Applicable timeouts can be found on the WebDriver W3C Specification Timeouts Table. See the WebDriver W3C Specification for more information.
"timeouts": {"script": 20000,
"pageLoad": 400000,
"implicit": 1000}
strictFileInteractability
| BOOLEAN |
Defines the current session’s strict file interactability. This indicates that interactabilty checks will be applied to File type input elements. The default is false
. See the WebDriver W3C Specification for more information.
"strictFileInteractability": true
unhandledPromptBehavior
| STRING |
Describes the current session’s user prompt handler. The default value is "dismiss and notify"
. For a list of the allowed options, see WebDriver W3C Specification User Prompt Handler Table. See the WebDriver W3C Specification for more information.
"unhandledPromptBehavior": "ignore"
webSocketUrl
| BOOLEAN | Desktop Only | BETA |
Enables W3C WebDriver BiDi support. This allows Selenium 4 clients to use Bi-Directional functionality. It also enables BiDi for other test frameworks, like WebDriverIO. In particular, this capability exposes the WebSocket endpoint which is available under webSocketUrl
field in session startup response body. This endpoint can be used to issue WebDriver BiDi commands as described by the specification. The default value is false
.
The webSocketUrl
capability is not compatible with extendedDebugging
capability.
"webSocketUrl": true
Desktop Browser Capabilities: Sauce-Specific – Optional
Browser-specific optional capabilities you can add to the sauce:options
block of your test session creation code.
chromedriverVersion
| STRING |
Allows you to specify the ChromeDriver version you want to use for your tests. The default version of ChromeDriver when no value is specified depends on the version of Chrome used. As of Chrome 73, the major version of the driver and the browser must match.
For a list of ChromeDriver versions, see chromedriver versions list.
If you find a bug that you determine is driver related, you can specify the latest point release of the chrome driver that matches the browser version.
For example, Sauce Labs might default to "88.0.4324.27"
, but there is a bug fix in version "88.0.4324.96"
, so you can specify that in your test.
"chromedriverVersion": "88.0.4324.96"
edgedriverVersion
| STRING |
Specifies the Microsoft Edge driver version you want to use for your tests. For a list of edgedriver versions, see the Microsoft Edge Driver website.
Edge Driver is based on Chrome Driver, so the same caveats from chromedriverVersion apply to edgedriverVersion
.
"edgedriverVersion": "90.0.818.51"
geckodriverVersion
| STRING |
Specifies the Firefox GeckoDriver version. The default geckodriver version varies based on the version of Firefox specified. For a list of geckodriver versions and the Firefox versions they support, see geckodriver Supported Platforms.
With geckodriver version 0.31.0, Mozilla removed the capability --remote-debugging-port
, which was never officially supported. You can use the supported capability moz:debuggerAddress
. See this article on our blog for more information.
"geckodriverVersion": "0.27.0"
iedriverVersion
| STRING |
Specifies the Internet Explorer Driver version. If no version is specified, it defaults to 2.53.1. For a list of IE Driver versions, see Internet Explorer Driver Server CHANGELOG.
"iedriverVersion": "3.150.1"
seleniumVersion
| STRING |
Specifies the Selenium version you want to use for your test. Sauce Labs will default to different versions, depending on the age of the browser and platform, and whether or not you're initializing a session with valid W3C syntax.
Always use the latest Selenium version. The Selenium developers are very conscientious about backward compatibility support, so we recommend always using the latest available version unless you find a specific, known issue.
"seleniumVersion": "3.141.1"
avoidProxy
| BOOLEAN |
Allows the browser to communicate directly with servers without going through a proxy that is shipped with Selenium versions prior to v3. By default, Sauce routes traffic from Internet Explorer and Safari through an HTTP proxy server so that HTTPS connections with self-signed certificates will work. The proxy server can cause problems for some users, and this setting allows you to avoid it.
This configuration is only relevant for Selenium versions 2.x and older. Any test run with a Sauce Connect tunnel has to use the proxy and this flag will be ignored.
"avoidProxy": true
extendedDebugging
| BOOLEAN |
Enables Extended Debugging features. This applies to Firefox and Chrome only. It records HAR files and console logs for both of these browsers. In Chrome, it also enables network interception, network and cpu throttling as well as access to network logs during the session. It is required to be true for capturePerformance
. The default value is false
.
"extendedDebugging": true
capturePerformance
| BOOLEAN |
Enables Performance Capture feature. Sauce Performance Testing can be enabled by setting both extendedDebugging
and capturePerformance
to true
. Default value is false
. See Getting Started with Sauce Front-End Performance for more information.
"capturePerformance": true
screenResolution
| STRING |
Specifies the screen resolution to be used during your test session. Default screen resolution for Sauce tests is 1024x768
.
To specify the screen resolution on Windows, we recommend that you set the platformName
to Windows 8 or newer (e.g., Windows 10).
"screenResolution": "1280x1024"
commandTimeout
| INTEGER |
Sets command timeout in seconds. As a safety measure to prevent Selenium crashes from making your tests run indefinitely, we limit how long Selenium can take to run a command in our browsers. This is set to 300 seconds by default. The maximum command timeout value allowed is 600 seconds.
"commandTimeout": 300
idleTimeout
| OPTIONAL | DURATION | INTEGER | Desktop Only |
Sets idle test timeout in seconds. As a safety measure to prevent tests from running too long after something has gone wrong, we limit how long a browser can wait for a test to send a new command. This is set to 90 seconds by default and limited to a maximum value of 1000 seconds.
"idleTimeout": 90
devTools
| OPTIONAL | BOOLEAN | Desktop Only | BETA |
Enables Chrome DevTools Protocol support, which is disabled by default on Sauce Labs platform. This allows Selenium 4 clients to use Bi-Directional functionality. In particular, this capability exposes the WebSocket endpoint which is available under se:cdp
field in session startup response body. This endpoint can be used to issue Chrome DevTools Protocol commands as described by the specification. The default value is false
.
The devTools
capability is not compatible with extendedDebugging
capability.
"devTools": true
Mobile Appium Capabilities
As the W3C WebDriver Protocol is supported in Appium v1.6.5 and higher, and required for Appium v2.0, we encourage and support using it for your Appium mobile app tests instead of the JSON Wire Protocol (JWP). We'll continue to support JWP in all currently supported Appium 1.X versions, but please be aware that with Appium 2.0, JWP support will be fully deprecated in favor of W3C.
The capabilities defined here assume the W3C WebDriver Protocol. See Appium Real Device W3C Specification and Migrating Appium Real Device Tests to W3C for more information.
platformName
| MANDATORY for Virtual and Real Devices | STRING |
Identifies the name of the operating system the mobile device should be running on. Values are not case-sensitive (i.e., "ios"
is the same as "iOS"
). Valid values are Android
and iOS
. See the WebDriver W3C Specification for more information.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("platformName", "Android");
appium:platformVersion
| MANDATORY for Virtual Devices | OPTIONAL for Real Devices | STRING |
Allows you to set the mobile OS platform version that you want to use in your test.
Android and iOS platform versions are based on Semantic Versioning, also known as SEMVER. This means that the versions will have the format MAJOR.MINOR.PATCH
.
Virtual Devices
This is mandatory for Android Emulators and iOS Simulators. You can find the available versions in our Platform Configurator.
iOS Simulators now support the values latest
, current_major
, or previous_major
as the appium:platformVersion
. These values will automatically use the latest, current major, or previous major version of iOS for your specified Simulator. See iOS Version Management for more information.
Real Devices
This is optional for Real Devices. There are three options you can use to determine which version you want to use for your automated Appium, Espresso, or XCUITest tests:
- Don't provide a
platformVersion
, this will result in any available Android or iOS device, no matter the version. - Provide a
platformVersion
that starts with your providedplatformVersion
string:12
: matches all minors and patches forplatformVersion: "12"
. For example12.1.0|12.1.1|12.2.0|...
12.1
: matches all patches forplatformVersion: "12.1"
. For example12.1.0|12.1.1
, it will not match12.2.x|12.3.x
and higher12.1.1
: matches all devices that have this exact platform version
- In/exclude a specific version and or a range of versions by using a regular expression (regex). You don't need to provide the forward slashes (
/{your-regex}/
) as you would normally do with regex. Keep in mind that the regex needs to match the formatMAJOR.MINOR.PATCH
. The possibilities are endless, but here are just a few examples:
The stricter the platformVersions
is, the smaller the pool of available devices will be and the longer you might need to wait for the available device. We recommend using only the major version or using the regex option to get the best results and an available device in the fastest way.
MutableCapabilities capabilities = new MutableCapabilities();
// For Android Emulators or iOS Simulators
// the platformVersion needs to match exactly
capabilities.setCapability("appium:platformVersion", "12.0");
// For Real Devices, dynamically finding an available device
// with at least major version 12
capabilities.setCapability("appium:platformVersion", "12");
// For Real Devices when you exactly know the version of
// the device you want to use
capabilities.setCapability("appium:platformVersion", "12.4.1");
// For Real Devices when you want to exclude version 15
capabilities.setCapability("appium:platformVersion", "^(?!15).*");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:deviceName
| MANDATORY for Virtual Devices | OPTIONAL for Real Devices | STRING |
Allows you to set the name of the simulator, emulator, or real device you want to use in the test.
For Real Devices:
You can use this to set up a test with either static or dynamic allocation for RDC, and run individual or parallel tests. Static allocation allows you to run your tests on a very specific device, while dynamic allocation allows you to specify a family of devices or any device with a certain OS so you can quickly run your test on the first available real device (RDC) device.
- Dynamic allocation example: for an Android RDC test, you can request a generic Samsung Galaxy device by using the option
"appium:deviceName":"Samsung Galaxy.*"
. - Static allocation example: if you want to use a Samsung Real Device, you need to specify the exact Samsung Galaxy device by using it's device ID or display name (e.g.,
"appium:deviceName":"Samsung_Galaxy_S20_real"
or"appium:deviceName":"Samsung Galaxy S20"
).
For Android Emulators
Each Android Emulator skin will have a different configuration depending on the phone or tablet that it emulates. For example, all the skins have different resolutions, screen dimensions, pixel densities, memory, etc. You can use our Platform Configurator to get a list of the available Android emulator skins for the various Android Emulator versions.
Examples
MutableCapabilities capabilities = new MutableCapabilities();
// For a real device
capabilities.setCapability("appium:deviceName", "Samsung Galaxy S20");
// For an Android Emulator
capabilities.setCapability("appium:deviceName", "Google Nexus 7 HD Emulator");
// For an iOS Simulator
capabilities.setCapability("appium:deviceName", "iPhone XS Simulator");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:automationName
| OPTIONAL for Appium 1.x (JWP) | MANDATORY for Appium 2.0 (W3C) | STRING |
Allows you to set the automation engine that will be used. Possible values are:
Emulators / Simulators:
- Android:
UiAutomator2
,Espresso
,Flutter
- iOS:
XCUITest
,Flutter
Real Devices:
- Android:
UiAutomator2
- iOS:
XCUITest
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:automationName", "UiAutomator2");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
browserName
| OPTIONAL | STRING | Virtual and Real Devices |
Identifies the browser to be used when automating with a mobile browser. See the WebDriver W3C Specification for more information. This capability is case-insensitive
- For Android the value needs to be
"Chrome"
. - For iOS, the value needs to be
"Safari"
.
- If this capability is not provided for a virtual device, the
appium:app
capability needs to be set. If none is set the test will throw an error. - This capability can be omitted for virtual devices if the
appium:app
capability is set. - If this capability is not provided for a real device session and also the:
appium:app
- or
appium:bundleId
(iOS) - or
appium:appPackage
andappium:appActivity
(Android) capability is not provided, then a real device session will automatically fall back to the default browser. This will be Chrome for Android and Safari for iOS.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("browserName", "chrome");
appium:app
| OPTIONAL | STRING | Virtual and Real Devices |
Allows you to set a path to an .ipa
, .apk
, .aab
or .zip
file containing the mobile app you want to test. This could be the location of your app in App Storage (e.g., storage:filename=myapp.zip
) or the URL to a remote location where your app is located (e.g., http://myappurl.zip
). The remote location needs to be accessible from the web, Sauce Connect can not access your internal file system where apps are hosted.
-
If this capability is not provided for a virtual device, the
browserName
capability needs to be set. If none is set the test will throw an error. -
This capability can be omitted for virtual devices if the
browserName
capability is set. -
If this capability is not provided for a real device session and also the:
browserName
capability- or
appium:app
- or
appium:bundleId
(iOS) - or
appium:appPackage
andappium:appActivity
(Android)
capability is not provided, then a real device session will automatically fall back to the default browser. This will be Chrome for Android and Safari for iOS
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:app", "storage:filename=my_app.zip");
If your app has been uploaded to Sauce storage, you can set the app
capability to "storage:xxxxxxxxx-xxxxxxx-xxx"
and enter the FILE ID for your app. This allows you to set which specific version you uploaded. Otherwise, if you use the file name it will select the latest version uploaded with the exact same name.
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:bundleId
| OPTIONAL | STRING | Real Devices Only | iOS Only |
Bundle identifier of the app under test, for example com.apple.calculator
. The capability value is calculated automatically if appium:app
is provided.
If neither appium:app
, browserName
, or appium:bundleId
capability is provided then by default Sauce Labs will start the Safari browser for iOS.
These two posts explain how you can get the bundleId
for iOS apps:
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:bundleId", "com.apple.calculator");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:appPackage
| OPTIONAL | STRING | Real Devices Only | Android Only |
Application package identifier to be started, for example, com.google.android.youtube
. If not provided, then UiAutomator2 will try to detect it automatically from the package provided by the appium:app
capability. Read How To Troubleshoot Activities Startup for more details.
If neither appium:app
, browserName
, or appium:appPackage
plus appium:appActivity
capabilities are provided then by default Sauce Labs will start the Chrome browser for Android.
This post explains how you can get the appPackage
for Android apps.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:appPackage", "com.google.android.youtube");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:appActivity
| OPTIONAL | STRING | Real Devices Only | Android Only |
Main application activity identifier, for example, com.google.android.apps.youtube.app.watchwhile.WatchWhileActivity
. If not provided then UiAutomator2 will try to detect it automatically from the package provided by the appium:app
capability. Read How To Troubleshoot Activities Startup for more details.
If neither appium:app
, browserName
or appium:appActivity
plus appium:appPackage
capability are provided then by default Sauce Labs will start the Chrome browser for Android.
You can get the current activity by using the Appium currentActivity
command. This is the Appium 1 command, but will also work with Appium 2.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:appActivity", "com.google.android.apps.youtube.app.watchwhile.WatchWhileActivity");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:otherApps
| OPTIONAL | STRING or LIST | Real Devices Only |
A dependent app that has already been uploaded to App Storage will be pre-installed on the device during the testing of the main app. You can specify the app using its storage:<fileId>
or storage:filename=<filename>
reference.
Dependent apps inherit the configuration of the main app under test for Device Language
, Device Orientation
, and Proxy
, regardless of the settings may have been applied to the app at the time of upload, because the settings are specific to the device under test. For example, if the dependent app is intended to run in landscape orientation, but the main app is set to portrait, the dependent app will run in portrait for the test, which may have unintended consequences.
Android-dependent apps will not be instrumented or modified. iOS-dependent apps will always be resigned/modified (even when resigning is disabled for the main app) because apps can't be installed on iOS devices without resigning them. If a dependent app cannot be resigned (such as a third party app), the test will not work as intended.
MutableCapabilities capabilities = new MutableCapabilities();
// Or for a single app by name
capabilities.setCapability("appium:otherApps", "storage:filename=app0.apk");
// Or for a single app by fileId
capabilities.setCapability("appium:otherApps", "storage:7435ab52-1eaa-4387-a67b-4d8e265f85");
// Or for multiple apps by name
capabilities.setCapability("appium:otherApps", ["storage:filename=app0.apk", "storage:filename=app1.apk"]);
// Or for multiple apps by fileId
capabilities.setCapability("appium:otherApps", ["storage:7435ab52-1eaa-4387-a67b-4d8e265f8509","storage:9035342-f8ea-7687-a67b-4dd4365f8588"]);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:orientation
| OPTIONAL | STRING | Virtual and Real Devices |
Specifies the orientation of the screen during the test. Valid values are PORTRAIT
and LANDSCAPE
.
This capability is an Appium capability that needs to be pre-fixed with appium:
so it becomes appium:orientation
. It can be used for virtual device mobile tests and real device tests. Theappium:orientation
capability will only flip the screen while the capability deviceOrientation
will flip the skin and the screen. See deviceOrientation
for more information.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:orientation", "LANDSCAPE");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:noReset
| OPTIONAL | BOOLEAN | Virtual and Real Devices |
If set to true
it prevents the device from resetting before the session startup. This means the application under test will not be terminated or its data cleaned. This capability behaves differently across virtual and real devices.
For Real Devices:
Set noReset
to true
to keep a device allocated to you during the device cleaning process, as described under cacheId
, allowing you to continue testing on the same device. Default value is false
. To use noReset
, you must pair it with cacheId
.
For Virtual Devices:
This capability will have no effect on Sauce Labs virtual devices, it will only work on local Android Emulators/iOS Simulators. For local executions, you will likely only have one device available, in Sauce Labs you will have a pool of devices available depending on your concurrency. Each session will start a new clean session which will make this capability redundant.
Specifics for Android Real Devices:
If noReset
is set to true
:
- The app does not stop after a test/session.
- The app data will not be cleared between tests/sessions.
- Apk will not be uninstalled after a test/session.
Specifics for iOS Real Devices:
On iOS devices, the noReset
value is permanently set to true
and cannot be overridden using noReset:false
. If you check your Appium logs, you'll see that the value is true
, even though the default setting technically is false. We've done this intentionally to ensure that your post-test iOS device cleaning process is optimal and secure.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:noReset", true);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:autoWebview
| OPTIONAL | BOOLEAN | Virtual and Real Devices |
Move directly into Webview context if available. This can come in handy when you need to automate a Hybrid app and the first screen in your app is a Hybrid screen. Default false
.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:autoWebview", true);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:includeSafariInWebviews
| OPTIONAL | BOOLEAN | Virtual and Real Devices | iOS Only |
Add Safari web contexts to the list of contexts available during a native/webview app test. This is useful if the test starts with an app and you eventually need to open Safari to be able to interact with it. Defaults to false
.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:includeSafariInWebviews", true);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:autoAcceptAlerts
| OPTIONAL | BOOLEAN | Virtual and Real Devices | iOS Only |
Accept all iOS alerts automatically if they pop up. This includes privacy access permission alerts (e.g., location, contacts, photos). Default is false
.
The Android equivalent is appium:autoGrantPermissions
.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:autoAcceptAlerts", true);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:autoDismissAlerts
| OPTIONAL | BOOLEAN | Virtual and Real Devices | iOS Only |
Dismiss all iOS alerts automatically if they pop up. This includes privacy access permission alerts (e.g., location, contacts, photos). Default is false
.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:autoDismissAlerts", true);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:autoGrantPermissions
| OPTIONAL | BOOLEAN | Virtual and Real Devices | Android Only |
Whether to grant all the requested application permissions automatically when a test starts.
The default value is true
.
The iOS equivalent is appium:autoAcceptAlerts
.
MutableCapabilities capabilities = new MutableCapabilities();
// Handle all requested application permissions "yourself"
capabilities.setCapability("appium:autoGrantPermissions", false);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:timeZone
| OPTIONAL | BOOLEAN | Virtual and Real Devices | Android Only |
Overrides the current device's time zone. This change is done on per-device basis and is
preserved for the whole duration of the test session. The time zone identifier must be a
valid name from the list of available time zone identifiers,
for example Europe/Paris
.
The iOS equivalent is appium:appTimeZone
.
This capability is only supported since UiAutomator2 driver version 3.1.0.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:timeZone", "Europe/Paris");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:appTimeZone
| OPTIONAL | BOOLEAN | Virtual and Real Devices | iOS Only |
Defines the custom time zone override for the application under test.
You can use UTC
, PST
, EST
, as well as place-based timezone names such as America/Los_Angeles
.
See the list of available time zone identifiers f
or more details. The same behavior could be achieved by providing a custom
value to the TZ
environment variable via the appium:processArguments
capability.
The Android equivalent is appium:timeZone
.
This capability is only supported since XCUITest driver version 7.10.0.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:appTimeZone", "America/Los_Angeles");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
Mobile Appium Timeout Capabilities
As with Selenium Tests, Appium also supports different types of timeouts like:
- Implicit Wait Timeout: Set the amount of time the driver should wait when searching for elements
- Script Timeouts: Sets the amount of time, in milliseconds, that asynchronous scripts executed by execute async are permitted to run before they are cancelled (Web context only)
These timeouts can be controlled by the driver during the test session. There are timeouts that can be set as a capability for when you start the driver and can be driver specific.
appium:newCommandTimeout
| OPTIONAL | DURATION | INTEGER | Virtual and Real Devices | Android and iOS |
Specifies the amount of time in seconds, in which the driver waits for a new command from the client before assuming the client has stopped sending requests. If there is no response during this time, the next executed command on the Virtual/Real Device will time out. The default value is 60 seconds while the maximum allowed value is not limited for Virtual Devices and is limited to 90 seconds for Real Devices.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:newCommandTimeout", 90);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:autoWebviewTimeout
| OPTIONAL | DURATION | INTEGER | Virtual and Real Devices | Android only |
Set the maximum number of milliseconds to wait until a web view is available if autoWebview capability is set to true. 2000 ms by default
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:autoWebviewTimeout", 30000);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:webkitResponseTimeout
| OPTIONAL | DURATION | INTEGER | Real Devices Only | iOS only |
Set the time, in milliseconds, to wait for a response from WebKit
in a Safari session. Defaults to 5000
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:webkitResponseTimeout", 10000);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:webviewConnectTimeout
| OPTIONAL | DURATION | INTEGER | Virtual and Real Devices | iOS only |
The time to wait, in milliseconds, for the initial presence of webviews in MobileSafari or hybrid apps. Defaults to 0
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:webviewConnectTimeout", 50000);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
Mobile Appium iOS WebDriverAgent
Timeout Capabilities
WebDriverAgent
is a WebDriver server implementation for iOS that is used to remote control iOS devices. It is developed for end-to-end testing and is adopted via the XCUITest driver. The WebDriverAgent
has it's own timeout capabilities that can be controlled by the driver during the test session. The most important ones are explained below.
It might be helpful to understand how the WebDriverAgent
works before reading the following capabilities. You can check this video Appium: Under the Hood of WebDriverAgent by Mykola Mokhnach for a quick introduction. The reason for adjusting the timeouts, which are explained below, are explained in this video from here.
appium:wdaLaunchTimeout
| OPTIONAL | DURATION | INTEGER | Virtual and Real Devices | iOS only |
Time, in ms, to wait for WebDriverAgent
to be pingable. Defaults to 60000ms.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:wdaLaunchTimeout", 30000);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:wdaConnectionTimeout
| OPTIONAL | DURATION | INTEGER | Virtual and Real Devices | iOS only |
Timeout, in ms, for waiting for a response from WebDriverAgent
. Defaults to 240000ms.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:wdaConnectionTimeout", 30000);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:waitForIdleTimeout
| OPTIONAL | DURATION | FLOAT | Virtual and Real Devices | iOS only |
The amount of time in float seconds to wait until the application under test is idling. XCTest requires the app's main thread to be idling in order to execute any action on it, so the WebDriverAgent
might not even start/freeze if the app under test is constantly hogging the main thread. The default value is 10
(seconds). Setting it to zero disables idling checks completely (not recommended) and has the same effect as setting waitForQuiescence
to false. Available since Appium 1.20.0
.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:waitForIdleTimeout", 60);
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
appium:commandTimeouts
| OPTIONAL | DURATION | STRING | Virtual and Real Devices | iOS only |
Custom timeout(s) in milliseconds for WebDriverAgent
backend commands execution. This might be useful if the WebDriverAgent
backend freezes unexpectedly or requires too much time to fail and blocks automated test execution. The value is expected to be of type string and can either contain max milliseconds to wait for each WebDriverAgent
command to be executed before terminating the session forcefully.
Don't confuse appium:commandTimeouts
with appium:newCommandTimeout
which is the timeout for the next command to be executed.
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("appium:commandTimeouts", "120000");
Using Appium 2? Prevent appium:
-prefix repetitiveness and start using appium:options
for Real Devices instead.
More Appium specific capabilities
Not all specific Appium Driver capabilities are explained here in preventing duplications. There are more capabilities which are specific for each Appium Driver. They can be found here
Android
iOS
appium:options
| OPTIONAL | OBJECT | Real Devices | Appium 2 Only |
If you use a lot of appium:
capabilities in your tests, it can get a little repetitive. You can combine all capabilities as an object value of a single appium:options
capability instead, in which case you don't need to use prefixes on the capabilities inside the object. For example:
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("platformName", "iOS");
capabilities.setCapability("browserName", "Safari");
MutableCapabilities appiumOptions = new MutableCapabilities();
appiumOptions.setCapability("automationName", "XCUITest");
appiumOptions.setCapability("deviceName", "iPhone iPhone 11");
appiumOptions.setCapability("platformVersion", "16");
capabilities.setCapability("appium:options", appiumOptions);
// `appium:options` will only work with Appium 2 or later
// This can be set in the `sauce:options` block
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("appiumVersion", "2.0.0");
sauceOptions.setCapability("build", "<your build id>");
sauceOptions.setCapability("name", "<your test name>");
capabilities.setCapability("sauce:options", sauceOptions);
appium:options
support for Virtual Devices is coming soon.
If you include the same capabilities both inside and outside of appium:options
, the values inside of appium:options
take precedence.
Mobile App Appium Capabilities: Sauce-Specific – Optional
Optional, Sauce-specific capabilities that you can use in your Appium tests. They can be added to the sauce:options
block of your session creation code.
appiumVersion
| OPTIONAL | STRING | Virtual and Real Devices |
Specifies the Appium driver version you want to use. For most use cases, setting the appiumVersion
is unnecessary because Sauce Labs defaults to the version that supports the broadest number of device combinations. Sauce Labs advises against setting this property unless you need to test a particular Appium feature or patch.
If you want to use Appium 2.0, see the Migration Guide.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("appiumVersion", "1.22.0");
capabilities.setCapability("sauce:options", sauceOptions);
Check on which Appium version your test ran:
- Log into Sauce Labs.
- Go to Test Details.
- Find and select the test that you ran using Appium.
- Click the Metadata tab.
- Look for the Logs row and select Appium Log. The first line indicates the Appium version. For example,
2019-05-05T17:45:07.541Z - info: Welcome to Appium v1.21.0
.
deviceOrientation
| OPTIONAL | STRING| Virtual Devices Only |
Specifies the orientation of the virtual skin and screen during the test. Valid values are PORTRAIT
and LANDSCAPE
.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("deviceOrientation", "PORTRAIT");
capabilities.setCapability("sauce:options", sauceOptions);
customLogFiles
| OPTIONAL | LIST | Virtual Devices Only |
If your app creates an extra log then you can use the customLogFiles
to store those additional logs in the "Logs" tab of the executed automated session. It is created in the form of a list of search filters that enumerate after an app test to locate text files to upload as logs. Files are uploaded with the .log
extension appended. The search paths are rooted at the application under test:
- Android (path on the emulated device):
/data/data/*PACKAGE_ID*/...
- iOS:
*SIMULATED_DEVICE_PATH*/data/Containers/Data/Application/*APPLICATION_ID*/...
. On a macOS filesystem, an example of SIMULATED_DEVICE_PATH would be~/Library/Developer/CoreSimulator/Devices/*DEVICE_ID*
To view and download the extra log files, go to the executed session in the Sauce Labs dashboard, and switch to the "Logs" tab:
- "Automated > Test Results"
- Search for your session and click on it
- Go to the "Logs" tab above the video
The following examples outline how this is handled for the different device types.
Supplying the list ["files/*_log", "*crash*"]
to an Android app test of the package com.saucelabs.exampleapp
will upload all the files found after the test, that match either of the glob expressions:
/data/data/com.saucelabs.exampleapp/files/*.log
/data/data/com.saucelabs.exampleapp/*crash*
Supplying the list ["files/*_log", "*crash*"]
to an iOS app test will upload all the files found after the test, that match either of the glob expressions (SIMULATED_DEVICE_PATH and APPLICATION_ID filled in with example values):
~/Library/Developer/CoreSimulator/Devices/8BF8C5E3-E992-424F-A491-5C673761737C/data/Containers/Data/Application/DBF4A728-9414-4431-9A56-41EC1CBFFA0B/files/*.log
~/Library/Developer/CoreSimulator/Devices/8BF8C5E3-E992-424F-A491-5C673761737C/data/Containers/Data/Application/DBF4A728-9414-4431-9A56-41EC1CBFFA0B/*crash*
In both sets of examples, it is worth noting that an asterisk can match directory elements as well as characters, so files/*log
will match both files/debug.log
and files/subdir/other.log
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("customLogFiles", ["Library/Caches/Logs/*_log", "files/*crash.log"]);
capabilities.setCapability("sauce:options", sauceOptions);
android.gpu.mode
| OPTIONAL | STRING | Android Virtual Devices Only |
By default, our emulator uses software
rendering to handle graphics for maximum compatibility. This involves the CPU calculating how everything looks on your app's screen. However, this could lead to an emulator crash when testing apps with intricate or heavy graphical elements. To mitigate this, use the hardware rendering option by specifying "android.gpu.mode"="hardware"
in your test capabilities.
Valid values are hardware
and software
(default).
Our advice is to leave it as software
unless you are experiencing specific issues, like emulator (not app) crashes. Using hardware
could solve your specific issue, but beware you might run into other issues which you didn't have before. If you do run into issues, please contact support.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("android.gpu.mode", "hardware");
capabilities.setCapability("sauce:options", sauceOptions);
disableImmersiveModePopUp
| OPTIONAL | BOOLEAN | Android Virtual Devices Only |
Android allows apps to use the full screen, hiding the status bar and navigation bar. This is called "immersive mode". When you run an Android test, the device will show a popup asking if you want to allow the app to use immersive mode. This popup can interfere with your test, and by default we disable it. If you want to enable it, set disableImmersiveModePopUp
to false
.
Under the hood, this capability is running this command before the app is started:
adb shell settings put secure immersive_mode_confirmations confirmed
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("disableImmersiveModePopUp", false);
capabilities.setCapability("sauce:options", sauceOptions);
setupDeviceLock
| OPTIONAL | BOOLEAN | Real Devices Only |
Sets up the device pin code for the automated test session. Valid values are true
and false
.
This capability sets your device in the state required for your application to launch successfully.
The setupDeviceLock
capability helps to bypass the Security requirements from your applications, like pincode requirements for launching and app or invoking certain activities/features in your app. For an example, see https://developer.android.com/reference/android/app/KeyguardManager.
It must be paired with one of the capabilities listed below.
appium:app
appium:bundleId
(iOS)appium:appPackage
(Android)appium:appActivity
(Android)
MutableCapabilities capabilities = new MutableCapabilities();
//.. .
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("setupDeviceLock", true);
capabilities.setCapability("sauce:options", sauceOptions);
tabletOnly
| OPTIONAL | BOOLEAN | Real Devices Only |
Use this capability to select only tablet devices for testing by setting it to "true"
. For Dynamic Allocation.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("tabletOnly", true);
capabilities.setCapability("sauce:options", sauceOptions);
phoneOnly
| OPTIONAL | BOOLEAN | Real Devices Only |
Use this capability to select only phone devices by setting it to "true"
. For Dynamic Allocation.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("phoneOnly", true);
capabilities.setCapability("sauce:options", sauceOptions);
privateDevicesOnly
| OPTIONAL | BOOLEAN | Real Devices Only |
If your pricing plan includes both private and public devices, use this capability to request allocation of private devices only by setting it to "true"
. For Dynamic Allocation.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("privateDevicesOnly", true);
capabilities.setCapability("sauce:options", sauceOptions);
publicDevicesOnly
| OPTIONAL | BOOLEAN | Real Devices Only |
If your pricing plan includes both private and public devices, use this capability to request allocation of public devices only by setting it to "true"
. For Dynamic Allocation.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("publicDevicesOnly", true);
capabilities.setCapability("sauce:options", sauceOptions);
carrierConnectivityOnly
| OPTIONAL | BOOLEAN | Real Devices Only | Private Devices Only |
Use this capability to allocate only devices connected to a carrier network by setting it to "true"
. For Dynamic Allocation.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("carrierConnectivityOnly", true);
capabilities.setCapability("sauce:options", sauceOptions);
cacheId
| OPTIONAL | STRING | Real Devices Only |
Keeps the device allocated to you between test sessions and bypasses the device cleaning process and session exit that occurs by default after each test completes. Normally, you'd need to start over and reopen another device. You'll need to launch your next test within 10 seconds of your previous test ending to ensure that the same device will be allocated for the test (not cleaned or reset).
If you are running multiple test suites in parallel, the values for cacheId
should be unique for each suite (to avoid mixing up the devices), and the value for cacheId
must be the same for all test methods that you want to run on the cached device. The value itself can be any (random) string. In addition, the app and project ID used for the tests must remain the same, along with the values for these capabilities:
platformName
appium:deviceName
appium:platformVersion
appium:autoGrantPermissions
and specific sauce:options
like:
tabletOnly
phoneOnly
privateDevicesOnly
appiumVersion
Suitable for test setups that require the app's state to be reset between tests. Can be used for both static allocation and dynamic allocation.
We recommend reviewing Device Management for Real Devices to learn more about how Sauce Labs manages device allocation, device caching, and device cleanup.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("cacheId", "Wou0L9usPI9v");
capabilities.setCapability("sauce:options", sauceOptions);
resigningEnabled
| OPTIONAL | BOOLEAN | Real Devices Only |
Controls Sauce Labs default resigning (iOS) or instrumentation (Android) of mobile apps installed on our devices. By default, this property is always true
.
iOS
When set to true
, Sauce Labs will resign the app under test with its own signature. This is required for iOS apps to be installed on our devices, but also to support features like:
And many more. This value can be set to false
to allow testing of specific behaviors that are not permitted under the Sauce Labs provisioning. See Resigning Enablements for more information. This capability can only be set to false
for iOS private devices.
Android
When set to true
, Sauce Labs will instrument the app under test with its own signature. This is required for Android apps if you want to use features like:
and many more. This value can be set to false
and can be used for private and public devices.
To install an *.apk app that is extracted from an *.aab file, Sauce Labs must sign the *.apk using its own signature. In such cases, Sauce Labs signs both the app
and testApp
to ensure matching signatures, even if this capability is set to false
. Otherwise, the app installation will fail.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("resigningEnabled", true);
capabilities.setCapability("sauce:options", sauceOptions);
sauceLabsImageInjectionEnabled
| OPTIONAL | BOOLEAN | Real Devices Only |
Enables the camera image injection feature. resigningEnabled
needs to be enabled if this is set to true
.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("sauceLabsImageInjectionEnabled", true);
capabilities.setCapability("sauce:options", sauceOptions);
sauceLabsBypassScreenshotRestriction
| OPTIONAL | BOOLEAN | Real Devices Only | Android Only |
Bypasses the restriction on taking screenshots for secure screens (i.e., secure text entry). resigningEnabled
needs to be enabled if this is set to true
.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("sauceLabsBypassScreenshotRestriction", true);
capabilities.setCapability("sauce:options", sauceOptions);
allowTouchIdEnroll
| OPTIONAL | BOOLEAN | Real Devices Only |
Enables the interception of biometric input, allowing the test to simulate Touch ID interactions (not a Sauce Labs-specific capability). resigningEnabled
needs to be enabled if this is set to true
.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("allowTouchIdEnroll", true);
capabilities.setCapability("sauce:options", sauceOptions);
audioCapture
| OPTIONAL | BOOLEAN |
Enables audio recording in your automated tests. This feature is supported for Windows and macOS desktop tests as well as mobile Real Devices. The audio will be part of the Test Results page video file, which you can play back and download in our built-in media player. The default value is false
.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("audioCapture", true);
capabilities.setCapability("sauce:options", sauceOptions);
networkCapture
| OPTIONAL | BOOLEAN | Real Devices Only |
Enables mobile app instrumentation (Android or iOS) and recording of HTTP/HTTPS network traffic for debugging purposes. API calls are collected into a HAR file, which you can view and download from your Test Results > Network tab console. The default value is false
.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("networkCapture", true);
capabilities.setCapability("sauce:options", sauceOptions);
groupFolderRedirectEnabled
| OPTIONAL | BOOLEAN | Real Devices Only | iOS Only |
Enables the use of the app's private app container directory instead of the shared app group container directory. For testing on the Real Device Cloud, the app gets resigned, which is why the shared directory is not accessible.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("groupFolderRedirectEnabled", true);
capabilities.setCapability("sauce:options", sauceOptions);
enableAnimations
| OPTIONAL | BOOLEAN | Real Devices Only | Android Only |
Use this capability to enable animations for Android real devices by setting it to true
. By default, animations are disabled.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("enableAnimations", true);
capabilities.setCapability("sauce:options", sauceOptions);
systemAlertsDelayEnabled
| OPTIONAL | BOOLEAN | Real Devices Only | iOS Only |
Delays system alerts, such as alerts asking for permission to access the camera, to prevent app crashes at startup. resigningEnabled
needs to be enabled if this is set to true
.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("systemAlertsDelayEnabled", true);
capabilities.setCapability("sauce:options", sauceOptions);
sessionCreationTimeout
| OPTIONAL | INTEGER | Real Devices Only |
Specify the amount of time (in milliseconds) that the test should be allowed to find and assign an available device before the test will fail. The default value is 900000 milliseconds (15 minutes) and the max is 1800000 milliseconds (30 minutes).
If you assign a value to this parameter that is lower than 1 minute (60000 milliseconds), you might encounter an Unable to find available device within {sessionCreationTimeout}ms
error. This happens because the device may not be prepared in time for the test to begin.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
// Set it to 5 minutes (5*60*1000=300000)
sauceOptions.setCapability("sessionCreationTimeout", 300000);
capabilities.setCapability("sauce:options", sauceOptions);
sessionCreationRetry
| OPTIONAL | INTEGER | Real Devices Only |
Specify the amount of automatic retries that Sauce Labs will execute to find and assign an available device before the test will fail. The default value is 1 and the max is 3.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
// Set it to 5 minutes (5*60*1000=300000)
sauceOptions.setCapability("sessionCreationRetry", 2);
capabilities.setCapability("sauce:options", sauceOptions);
networkProfile
| OPTIONAL | STRING | Real Devices Only | BETA |
Set a network profile with predefined network conditions at the beginning of the session. Please refer to the list of network profiles for more information about each profile's network conditions.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("networkProfile", "2G");
capabilities.setCapability("sauce:options", sauceOptions);
networkConditions
| OPTIONAL | OBJECT | Real Devices Only | BETA |
Set custom network conditions for downloadSpeed
, uploadSpeed
, latency
or loss
at the beginning of the session.
Not all parameters need to be specified and only the ones specified will have conditioning applied.
Please refer to the supported network conditions for more information.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("networkConditions", ImmutableMap.of(
"downloadSpeed", 5000,
"uploadSpeed", 3000,
"latency", 200,
"loss", 2,
));
capabilities.setCapability("sauce:options", sauceOptions);
Each network condition has a supported value range:
downloadSpeed
: 0 - 50000 kbpsuploadSpeed
: 0 - 50000 kbpslatency
: 0 - 3000 msloss
: 0 - 100 %
sauce: network-profile
| OPTIONAL | STRING | Real Devices Only |
Set a network profile with predefined network conditions dynamically during your session. Please refer to the list of network profiles for more information about each profile's network conditions.
driver.executeScript("sauce: network-profile", "2G");
sauce: network-conditions
| OPTIONAL | OBJECT | Real Devices Only |
Set custom network conditions for downloadSpeed
, uploadSpeed
, latency
or loss
dynamically during your session.
Not all parameters need to be specified and only the ones specified will have conditioning applied.
Please refer to Network Throttling - executeScript for more information.
driver.executeScript("sauce: network-conditions", ImmutableMap.of(
"downloadSpeed", 5000,
"uploadSpeed", 3000,
"latency", 200,
"loss", 2,
));
mobile: shell
| OPTIONAL | STRING | Real Devices Only | Android Only |
Execute ADB shell commands, through Appium's mobile: shell
capability.
Sauce Labs now supports ADB commands for Appium. To use ADB and mobile: shell
commands, please sign up for our BETA through this form and indicate the desired ADB commands you would like to run. We will be supporting a limited list of ADB commands through mobile: shell
. Please refer to the list of allowed commands or contact support for assistance.
driver.executeScript("mobile: shell", ImmutableMap.of(
"command", "input",
"args", ImmutableList.of("keyevent", "3")
));
Desktop and Mobile Capabilities: Sauce-Specific – Optional
Optional Sauce Labs-specific capabilities that you can use for any Sauce Labs test. They must be added to the sauce:options
block of your session creation code.
name
| OPTIONAL | STRING |
Records test names for jobs and make it easier to find individual tests.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("name", "You test name");
capabilities.setCapability("sauce:options", sauceOptions);
build
| OPTIONAL | STRING |
Associates multiple jobs with a build number or app version, which will then be displayed on both the Test Results dashboard and Archive view.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("build", "build-1234");
capabilities.setCapability("sauce:options", sauceOptions);
tags
| OPTIONAL | LIST | Virtual and Real Devices |
User-defined tags for grouping and filtering jobs on the Test Results dashboard and Archive view. Tags can facilitate team collaboration.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("tags", ["tag1","tag2","tag3"]);
capabilities.setCapability("sauce:options", sauceOptions);
username
| OPTIONAL | STRING |
Sets your Sauce Labs username for a test.
You can either set "username"
in capabilities or specify it in the Sauce URL as Basic Authentication. For Visual Tests), this must be set in capabilities.
You can find your username
value under Account > User Settings.
Good security practices include never putting credentials in plain text in your code. We highly encourage you to reference this value from an Environment Variable and Set Environment Variables for Authentication on every machine that executes your code. The example below is in JavaScript.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("username", System.getenv("SAUCE_USERNAME"));
capabilities.setCapability("sauce:options", sauceOptions);
accessKey
| OPTIONAL | STRING |
Sets your Sauce Labs access key for the test.
You can either set "accessKey"
in capabilities or specify it in the Sauce URL as Basic Authentication. For Visual Tests, this must be set in capabilities.
You can find your accessKey
value under Account > User Settings.
Good security practices include never putting credentials in plain text in your code. We highly encourage you to reference this value from an Environment Variable and Set Environment Variables for Authentication on every machine that executes your code. The example below is in JavaScript.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("accessKey", System.getenv("SAUCE_ACCESS_KEY"));
capabilities.setCapability("sauce:options", sauceOptions);
custom-data
| OPTIONAL | OBJECT | Desktop and Virtual Devices Only |
User-defined custom data that will accept any valid JSON object, limited to 64KB in size.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("custom-data", "{'release': '1.0','commit': '0k392a9dkjr','staging': true,'execution_number': 5,'server': ‘test.customer.com'}");
capabilities.setCapability("sauce:options", sauceOptions);
public
| OPTIONAL | STRING | Desktop and Virtual Devices Only |
We support several test/job result visibility levels, which control who can view the test details. The visibility level for a test can be set manually from the test results page, but also programmatically when starting a test or with our REST API. For more information about sharing test results, see the topics under Sharing the Results of Sauce Labs Tests.
Available visibility modes are:
- public:
- Accessible to everyone.
- May be listed on public web pages and indexed by search engines.
- public restricted:
- Share your job's results page and video, but keeps the logs only for you.
- Hides the fancy job log.
- Prohibits access to the raw Selenium log so that anonymous users with the link will be able to watch the video and screenshots, but won't be able to see what's being typed and done to get there.
- share:
- Only accessible to people with a valid link.
- Not listed on publicly available pages on Sauce Labs.
- Not indexed by search engines.
- team:
- Best option if you want to share your jobs with other team members that were created as a sub-accounts of one parent account.
- Only accessible to people under the same root account as you.
- private:
- Best option if you don't want to share your test results page and video with anyone.
- Only you (the owner) will be able to view assets and test results page.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("public", "team");
capabilities.setCapability("sauce:options", sauceOptions);
tunnelName
| OPTIONAL | STRING |
Specify a Sauce Connect tunnel to establish connectivity with Sauce Labs for your test. Tunnels allow you to test an app that is behind a firewall or on your local machine by providing a secure connection to the Sauce Labs platform.
See Basic Sauce Connect Proxy Setup for more information.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("tunnelName", "MyTunnel01");
capabilities.setCapability("sauce:options", sauceOptions);
tunnelIdentifier
| OPTIONAL | STRING | DEPRECATED |
Specify a Sauce Connect tunnel name to establish connectivity with a Sauce Labs test platform. This is an alias for tunnelName.
tunnelIdentifier
is being deprecated in favor of tunnelName
.
The value expected here is the value shown under the Tunnel Name column on the Sauce Labs Tunnels page, not the Tunnel ID numerical value.
See Using Tunnel Names for more information.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("tunnelIdentifier", "MyTunnel01");
capabilities.setCapability("sauce:options", sauceOptions);
Appium tests for the Real Device Cloud using the W3C protocol MUST use tunnelName
instead of tunnelIdentifier
.
tunnelOwner
| OPTIONAL | STRING |
If the tunnelName you've specified to establish connectivity with a Sauce Labs test platform is a shared tunnel, and you are not the user who created the tunnel, you must identify the Sauce Labs user who did create the tunnel in order to use it for your test.
The value expected here is the value shown under the Tunnel Name column on the Sauce Labs Tunnels page, not the Tunnel ID numerical value.
See Using Tunnel Names for more information.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("tunnelName", "MyTunnel01");
sauceOptions.setCapability("tunnelOwner", "<username of tunnel originator>");
capabilities.setCapability("sauce:options", sauceOptions);
parentTunnel
| OPTIONAL | STRING | DEPRECATED |
If the tunnelName (or tunnelIdentifier) you've specified to establish connectivity with a Sauce Labs test platform is a shared tunnel, and you are not the user who created the tunnel, you must identify the Sauce Labs user who did create the tunnel in order to use it for your test. This is an alias for tunnelOwner.
parentTunnel
is being deprecated in favor of tunnelOwner
.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("tunnelIdentifier", "MyTunnel01");
sauceOptions.setCapability("parentTunnel", "<username of tunnel originator>");
capabilities.setCapability("sauce:options", sauceOptions);
Appium tests for the Real Device Cloud using the W3C protocol MUST use tunnelName
instead of tunnelIdentifier
and tunnelOwner
instead of parentTunnel
.
recordVideo
| OPTIONAL | BOOLEAN |
Use this to disable video recording. By default, Sauce Labs records a video of every test you run. Disabling video recording can be useful for debugging failing tests as well as having a visual confirmation that a certain feature works (or still works). However, there is an added wait time for screen recording during a test run.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("recordVideo", false);
capabilities.setCapability("sauce:options", sauceOptions);
videoUploadOnPass
| OPTIONAL | BOOLEAN |
Disables video upload for passing tests. videoUploadOnPass
is an alternative to recordVideo
; it lets you discard videos for tests you've marked as passing. It disables video post-processing and uploading that may otherwise consume some extra time after your test is complete.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("videoUploadOnPass", false);
capabilities.setCapability("sauce:options", sauceOptions);
recordScreenshots
| OPTIONAL | BOOLEAN |
Disables step-by-step screenshots. In addition to capturing video, Sauce Labs captures step-by-step screenshots of every test you run. Most users find it very useful to get a quick overview of what happened without having to watch the complete video. However, this feature may add some extra time to your tests.
The maximum number of screenshots is 150. Once the limit is reached, further screenshots will no longer be taken.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("recordScreenshots", false);
capabilities.setCapability("sauce:options", sauceOptions);
captureHtml
| OPTIONAL | BOOLEAN |
In the same way Sauce Labs captures step-by-step screenshots, you can capture the HTML source at each step of a test. This feature is disabled by default, but when it is enabled you can view the HTML source captures on the Test Results page.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("captureHtml", true);
capabilities.setCapability("sauce:options", sauceOptions);
recordLogs
| OPTIONAL | BOOLEAN |
Disables log recording. By default, Sauce creates a log of all the actions that you execute to create a report for the test run that lets you troubleshoot test failures more easily. This option disables only the recording of the log.json file; the selenium-server.log will still be recorded.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("recordLogs", false);
capabilities.setCapability("sauce:options", sauceOptions);
Desktop and Virtual Device Capabilities: Sauce-Specific – Optional
The following are Sauce Labs-specific options that apply only to virtual devices (desktop sessions, emulators and simulators). These options can be added to the sauce:options
block of your session creation code.
maxDuration
| OPTIONAL | INTEGER | Desktop and Virtual Devices Only |
Sets maximum test duration in seconds. As a safety measure to prevent tests from running indefinitely, the default is 1,800 seconds (30 minutes) and the maximum is 10,800 seconds (three hours).
A test should never need to run more than 30 minutes. Our data shows that tests that run in under two minutes are twice as likely to pass as tests that take longer than seven minutes.
We have a three-hour maximum in place to ease the transition of new users migrating long-running tests to Sauce Labs.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("maxDuration", 1800);
capabilities.setCapability("sauce:options", sauceOptions);
priority
| OPTIONAL | INTEGER | Desktop and Virtual Devices Only |
Setting to prioritize jobs. If you have multiple new jobs waiting to start (i.e., across a collection of sub-accounts), jobs with a lower priority number take precedence over jobs with a higher number.
So, for example, if you have multiple jobs simultaneously waiting to start, we'll first attempt to find resources to start all the jobs with priority 0
, then all the jobs with priority 1
, etc.
When we run out of available virtual machines, or when you hit your concurrency limit, any jobs not yet started will wait. Within each priority level, jobs that have been waiting the longest take precedence.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("priority", 0);
capabilities.setCapability("sauce:options", sauceOptions);
timeZone
| OPTIONAL | STRING | Desktop and Virtual Devices Only |
Allows you to set a custom time zone for your test based on a city name. Most major cities are supported.
- For Desktop VMs: can be configured with custom time zones. This feature should work on all operating systems, however, time zones on Windows VMs are approximate. The time zone defaults to UTC. Look for the "principal cities" examples on this list of UTC time offsets.
- For iOS Virtual Devices: You can use this capability to change the time on the Mac OS X VM, which will be picked up by the iOS simulator.
- For Android Virtual Devices: This capability is not supported for virtual Android devices. Consider using appium:timeZone instead.
Most web apps serve localization content based on the computer's IP Address, not the time zone set in the operating system. If you need to simulate the computer being in a different location, you may need to set up a proxy.
MutableCapabilities capabilities = new MutableCapabilities();
//...
MutableCapabilities sauceOptions = new MutableCapabilities();
sauceOptions.setCapability("timeZone", "Los_Angeles");
capabilities.setCapability("sauce:options", sauceOptions);
| OPTIONAL | STRING | All Devices Since appium2-20240501 |
Both UiAutomator2 and XCUITest drivers allow to change the time zone using corresponding test session capabilities.
Android Devices
Provide a valid time zone identifier to appium:timeZone
capability.
The time zone identifier must be a valid name from the list of
available time zone identifiers,
for example America/New_York
.
The time zone is changed instantly on the per-device basis and is preserved until the next change.
iOS Devices
Provide a valid time zone identifier to appium:appTimeZone
capability.
The time zone identifier must be a valid name from the list of
available time zone identifiers, for example America/New_York
.
The time zone is changed on the per-application basis and is only valid for the application under test.
The same behavior could be achieved by providing a custom value to the
TZ environment variable via the appium:processArguments
capability.
Pre-Run Executables
| OPTIONAL | Desktop and Virtual Devices Only |
Pre-run executables have a primary key (prerun
) and four secondary keys:
Read the descriptions of each key below the example.
"prerun": {
"executable": "http://url.to/your/executable.exe",
prerun
(primary key)
status Use this to define pre-run executables. You can provide a URL to an executable file, which will be downloaded and executed to configure the VM before the test starts. For faster performance, you may want to upload the executable to your Sauce Apps Storage space. This capability takes a JSON object with four main keys. See Using Pre-Run Executables to Configure Browsers and VMs for more information.
- Running AutoIt Scripts: If you want to run an AutoIt script during your test, compile it as an .exe, send it using this capability, and set background to true to allow AutoIt to continue running throughout the full duration of your test.
- Using Multiple Pre-Run Executables: If you need to send multiple pre-run executables, the best way is to bundle them into a single executable file, such as a self-extracting zip file.
- Sending a Single String Instead of JSON: If a single string is sent as the pre-run capability rather than a JSON object, this string is considered to be the URL to the executable, and the executable launches with background set to
false
.
executable
(secondary key)
| STRING |
Provide the URL to the executable you want to run before your browser session starts.
args
(secondary key)
| LIST |
Lists the command line parameters that you want the executable to receive. Valid arguments are:
--silent
or/S
: Installs the script silently without raising any dialogs.-a
: Add switches to the command line of the underlying setup.exe process.-q
: Like--silent
, installs the script without raising any dialogs.
background
(secondary key)
| BOOLEAN |
Defines whether Sauce should wait for this executable to finish before your browser session starts. This setting overrides the values set by timeout
.
timeout
(secondary key)
| INTEGER |
Defines the number of seconds Sauce Labs will wait for your executable to finish before your browser session starts. The default value is 90 seconds. Maximum is 360 seconds.
Additional Resources
Example Test Scripts
See Sauce Labs Training on GitHub.
Visual Testing
While Visual Testing runs on Sauce Labs servers, the URL gets sent to "https://hub.screener.io"
. This means that the username
and accessKey
values are required.
See Visual Testing with WebDriver and Visual Commands and Options.
When running a test on a Virtual Device, be aware that each capability value has a 100 characters limitation. If the value exceeds this limit, it will be truncated, which can lead to further side effects or prevent a job from starting.