appium-uiautomator2-driver
v3.8.1
Published
UiAutomator2 integration for Appium
Downloads
916,915
Readme
Appium UiAutomator2 Driver
Appium UiAutomator2 Driver is a test automation framework for Android devices. Appium UiAutomator2 Driver automates native, hybrid and mobile web apps, tested on emulators and real devices. Appium UiAutomator2 Driver is part of the Appium mobile test automation tool. The driver operates in scope of W3C WebDriver protocol with several custom extensions to cover operating-system specific scenarios.
UiAutomator2 Driver proxies most of the commands to UiAutomator2 server, which uses Google's UiAutomator framework under the hood. Some commands are proxied directly to appium-adb and other helpers built on top of Android platform tools.
Note
Since version 2.0.0 UiAutomator2 driver has dropped the support of Appium 1, and is only compatible to Appium 2. Use the
appium driver install uiautomator2
command to add it to your Appium 2 dist.
Requirements
On top of standard Appium requirements UiAutomator2 driver also expects the following prerequisites:
- Windows, Linux and macOS are supported as hosts
- Android SDK Platform tools must be installed. Android Studio IDE also provides a convenient UI to install and manage the tools.
- ANDROID_HOME or ANDROID_SDK_ROOT environment variable must be set
- Java JDK must be installed and JAVA_HOME environment variable must be set. Android SDK below API 30 requires Java 8. Android SDK 30 and above requires Java 9 or newer.
- Emulator platform image must be installed if you plan to run your tests on it. Android Studio IDE also provides a convenient UI to install and manage emulators.
- Real Android devices must have USB debugging enabled and should be visible as
online
inadb devices -l
output. - The minimum version of Android API must be 5.0 (API level 21) (6.0 is recommended as version 5 has some known compatibility issues).
Doctor
Since driver version 2.39.0 you can automate the validation for the most of the above
requirements as well as various optional ones needed by driver extensions by running the
appium driver doctor uiautomator2
server command.
Capabilities
General
Capability Name | Description
--- | ---
platformName | Could be set to android
. Appium itself is not strict about this capability value if automationName
is provided, so feel free to assign it to any supported platform name if this is needed, for example, to make Selenium Grid working.
appium:automationName | Must always be set to uiautomator2
. Values of automationName
are compared case-insensitively.
appium:deviceName | The name of the device under test (actually, it is not used to select a device under test). Consider setting udid
for real devices and avd
for emulators instead
appium:platformVersion | The platform version of an emulator or a real device. This capability is used for device autodetection if udid
is not provided
appium:udid | UDID of the device to be tested. Could be retrieved from adb devices -l
output. If unset then the driver will try to use the first connected device. Always set this capability if you run parallel tests.
appium:noReset | Prevents the device to be reset before the session startup if set to true
. This means that the application under test is not going to be terminated neither its data cleaned. false
by default
appium:fullReset | Being set to true
always enforces the application under test to be fully uninstalled before starting a new session. false
by default
appium:printPageSourceOnFindFailure | Enforces the server to dump the actual XML page source into the log if any error happens. false
by default.
Driver/Server
Capability Name | Description
--- | ---
appium:systemPort | The number of the port on the host machine used for the UiAutomator2 server. By default the first free port from 8200..8299 range is selected. It is recommended to set this value if you are running parallel tests on the same machine.
appium:skipServerInstallation | Skip the UiAutomator2 Server component installation on the device under test and all the related checks if set to true
. This could help to speed up the session startup if you know for sure the correct server version is installed on the device. In case the server is not installed or an incorrect version of it is installed then you may get an unexpected error later. false
by default
appium:uiautomator2ServerLaunchTimeout | The maximum number of milliseconds to wait util UiAutomator2Server is listening on the device. 30000
ms by default
appium:uiautomator2ServerInstallTimeout | The maximum number of milliseconds to wait util UiAutomator2Server is installed on the device. 20000
ms by default
appium:uiautomator2ServerReadTimeout | The maximum number of milliseconds to wait for a HTTP response from UiAutomator2Server. Only values greater than zero are accepted. If the given value is too low then expect driver commands to fail with timeout of Xms exceeded
error. 240000
ms by default
appium:disableWindowAnimation | Whether to disable window animations when starting the instrumentation process. The animation scale will be restored automatically after the instrumentation process ends for API level 26 and higher. The animation scale could remain if the session ends unexpectedly for API level 25 and lower. false
by default
appium:skipDeviceInitialization | If set to true
then device startup checks (whether it is ready and whether Settings app is installed) will be canceled on session creation. Could speed up the session creation if you know what you are doing. false
by default
App
Capability Name | Description
--- | ---
appium:app | Full path to the application to be tested (the app must be located on the same machine where the server is running). Both .apk
and .apks
application extensions are supported. Could also be an URL to a remote location. If neither of the app
, appPackage
or browserName
capabilities are provided then the driver starts from the Dashboard and expects the test knows what to do next. Do not provide both app
and browserName
capabilities at once.
browserName | The name of the browser to run the test on. If this capability is provided then the driver will try to start the test in Web context mode (Native mode is applied by default). Read Automating hybrid apps for more details. Usually equals to chrome
.
appium:appPackage | Application package identifier to be started. If not provided then UiAutomator2 will try to detect it automatically from the package provided by the app
capability. Read How To Troubleshoot Activities Startup for more details
appium:appActivity | Main application activity identifier. If not provided then UiAutomator2 will try to detect it automatically from the package provided by the app
capability. Read How To Troubleshoot Activities Startup for more details
appium:appWaitActivity | Identifier of the first activity that the application invokes. If not provided then equals to appium:appActivity
. Read How To Troubleshoot Activities Startup for more details
appium:appWaitPackage | Identifier of the first package that is invoked first. If not provided then equals to appium:appPackage
. Read How To Troubleshoot Activities Startup for more details
appium:appWaitDuration | Maximum amount of milliseconds to wait until the application under test is started (e. g. an activity returns the control to the caller). 20000
ms by default. Read How To Troubleshoot Activities Startup for more details
appium:androidInstallTimeout | Maximum amount of milliseconds to wait until the application under test is installed. 90000
ms by default
appium:appWaitForLaunch | Whether to block until the app under test returns the control to the caller after its activity has been started by Activity Manager (true
, the default value) or to continue the test without waiting for that (false
).
appium:intentCategory | Set an optional intent category to be applied when starting the given appActivity by Activity Manager. Defaults to android.intent.category.LAUNCHER
. Please use mobile:startActivity in case you don't set an explicit value.
appium:intentAction | Set an optional intent action to be applied when starting the given appActivity by Activity Manager. Dfaults to android.intent.action.MAIN
. Please use mobile:startActivity in case you don't set an explicit value.
appium:intentFlags | Set an optional intent flags to be applied when starting the given appActivity by Activity Manager. Defaults to 0x10200000
(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED flags). Please use mobile:startActivity in case you don't set an explicit value.
appium:optionalIntentArguments | Set an optional intent arguments to be applied when starting the given appActivity by Activity Manager
appium:dontStopAppOnReset | Set it to true
if you don't want the application to be restarted if it was already running. If appium:noReset
is falsy, then the app under test is going to be restarted if either this capability is falsy (the default behavior) or appium:forceAppLaunch
is set to true
. false
by default
appium:forceAppLaunch | Set it to true
if you want the application under test to be always forcefully restarted on session startup even if appium:noReset
is true
, and the app was already running. If noReset
is falsy, then the app under test is going to be restarted if either this capability set to true
or appium:dontStopAppOnReset
is falsy (the default behavior). false
by default. Available since driver version 2.12
appium:shouldTerminateApp | Set it to true
if you want the application under test to be always terminated on session end even if appium:noReset
is true
. If noReset
is falsy, then the app under test is going to be terminated if appium:dontStopAppOnReset
is also falsy (the default behavior). false
by default
appium:autoLaunch | Whether to launch the application under test automatically (true
, the default value) after a test starts
appium:autoGrantPermissions | Whether to grant all the requested application permissions automatically when a test starts(true
). The targetSdkVersion in the application manifest must be greater or equal to 23 and the Android version on the device under test must be greater or equal to Android 6 (API level 23) to grant permissions. Applications whose targetSdkVersion is lower than or equal to 22 must be reinstalled to grant permissions, for example, by setting the appium:fullReset
capability as true
for Android 6+ devices. If your app needs some special security permissions, like access to notifications or media recording, consider using mobile: changePermissions extension with appops
target. false
by default
appium:otherApps | Allows to set one or more comma-separated paths to Android packages that are going to be installed along with the main application under test. This might be useful if the tested app has dependencies
appium:uninstallOtherPackages | Allows to set one or more comma-separated package identifiers to be uninstalled from the device before a test starts
appium:allowTestPackages | If set to true
then it would be possible to use packages built with the test flag for the automated testing (literally adds -t
flag to the adb install
command). false
by default
appium:remoteAppsCacheLimit | Sets the maximum amount of application packages to be cached on the device under test. This is needed for devices that don't support streamed installs (Android 7 and below), because ADB must push app packages to the device first in order to install them, which takes some time. Setting this capability to zero disables apps caching. 10
by default.
appium:enforceAppInstall | If set to true
then the application under test is always reinstalled even if a newer version of it already exists on the device under test. This capability has no effect if appium:noReset
is set to true
. false
by default
App Localization
Capability Name | Description
--- | ---
appium:localeScript | Canonical name of the locale to be set for the app under test, for example Hans
in zh-Hans-CN
. See https://developer.android.com/reference/java/util/Locale.html for more details.
appium:language | Name of the language to extract application strings for. Strings are extracted for the current system language by default. Also sets the language for the app under test. See https://developer.android.com/reference/java/util/Locale.html for more details. If language
is provided then locale
is also required to be set. The combination of both capability values must be a known locale and should be present in the list of available locales returned by the ICU's getAvailableULocales() method. The full list of supported locales is also dumped into the logcat output on failure. Example: en
, ja
appium:locale | Sets the locale for the app under test. See https://developer.android.com/reference/java/util/Locale.html for more details. If locale
is provided then language
is also required to be set. The combination of both capability values must be a known locale and should be present in the list of available locales returned by the ICU's getAvailableULocales() method. The full list of supported locales is also dumped into the logcat output on failure. Example: US
, JP
ADB
Capability Name | Description
--- | ---
appium:adbPort | Number of the port on the host machine where ADB is running. 5037
by default
appium:remoteAdbHost | Address of the host where ADB is running (the value of -H
ADB command line option). Unset by default
appium:adbExecTimeout | Maximum number of milliseconds to wait until single ADB command is executed. 20000
ms by default
appium:clearDeviceLogsOnStart | If set to true
then UiAutomator2 deletes all the existing logs in the device buffer before starting a new test
appium:buildToolsVersion | The version of Android build tools to use. By default UiAutomator2 driver uses the most recent version of build tools installed on the machine, but sometimes it might be necessary to give it a hint (let say if there is a known bug in the most recent tools version). Example: 28.0.3
appium:skipLogcatCapture | Being set to true
disables automatic logcat output collection during the test run. false
by default
appium:suppressKillServer | Being set to true
prevents the driver from ever killing the ADB server explicitly. Could be useful if ADB is connected wirelessly. false
by default
appium:ignoreHiddenApiPolicyError | Being set to true
ignores a failure while changing hidden API access policies to enable access to non-SDK interfaces. Could be useful on some devices, where access to these policies has been locked by its vendor. false
by default.
appium:hideKeyboard | Being set to true
hides the on-screen keyboard while the session is running. Use it instead of the legacy appium:unicodeKeyboard
one (which will be dropped in the future). This effect is achieved by assigning a custom "artificial" input method. Only use this feature for special/exploratory cases as it violates the way your application under test is normally interacted with by a human. Setting this capability explicitly to false
enforces adb shell ime reset
call on session startup, which resets the currently selected/enabled IMEs to the default ones as if the device is initially booted with the current locale. undefined
by default.
appium:mockLocationApp | Sets the package identifier of the app, which is used as a system mock location provider since Appium 1.18.0+. This capability has no effect on emulators. If the value is set to null
or an empty string, then the driver will reset the mocked location provider, e.g. the location won't be mocked anymore. Defaults to Appium Setting package identifier (io.appium.settings
). Termination of a mock location provider application resets the mocked location data.
appium:logcatFormat | The log print format, where format
is one of: brief
process
tag
thread
raw
time
threadtime
long
. threadtime
is the default value.
appium:logcatFilterSpecs | Series of tag[:priority]
where tag
is a log component tag (or * for all) and priority is: V Verbose
, D Debug
, I Info
, W Warn
, E Error
, F Fatal
, S Silent (supress all output)
. '' means ':d' and tag
by itself means tag:v
. If not specified on the commandline, filterspec is set from ANDROID_LOG_TAGS. If no filterspec is found, filter defaults to '*:I'.
appium:allowDelayAdb | Being set to false
prevents emulator to use -delay-adb
feature to detect its startup. See https://github.com/appium/appium/issues/14773 for more details.
Emulator (Android Virtual Device)
Capability Name | Description
--- | ---
appium:avd | The name of Android emulator to run the test on. The names of currently installed emulators could be listed using avdmanager list avd
command. If the emulator with the given name is not running then it is going to be launched on automated session startup.
appium:avdLaunchTimeout | Maximum number of milliseconds to wait until Android Emulator is started. 60000
ms by default
appium:avdReadyTimeout | Maximum number of milliseconds to wait until Android Emulator is fully booted and is ready for usage. 60000
ms by default
appium:avdArgs | Either a string or an array of emulator command line arguments. If arguments contain the -wipe-data
one then the emulator is going to be killed on automated session startup in order to wipe its data.
appium:avdEnv | Mapping of emulator environment variables.
appium:networkSpeed | Sets the desired network speed limit for the emulator. It is only applied if the emulator is not running before the test starts. See emulator command line arguments description for more details.
appium:gpsEnabled | Sets whether to enable (true
) or disable (false
) GPS service in the Emulator. Unset by default, which means to not change the current value
appium:isHeadless | If set to true
then emulator starts in headless mode (e.g. no UI is shown). It is only applied if the emulator is not running before the test starts. false
by default.
appium:injectedImageProperties | Allows adjusting of injected image properties, like size, position or rotation. The image itself is expected to be injected by mobile: injectEmulatorCameraImage extension. It is also mandatory to provide this capability if you are going to use the injection feature on a newly created/resetted emulator as it enforces emulator restart, so it could properly reload the modified image properties. The value itself is a map, where possible keys are size
, position
and rotation
. All of them are optional. If any of values is not provided then the following defaults are used: {size: {scaleX: 1, scaleY: 1}, position: {x: 0, y: 0, z: -1.5}, rotation: {x: 0, y: 0, z: 0}}
. The size
value contains scale multipliers for X and Y axes. The position
contains normalized coefficients for X/Y/Z axes, where 0
means it should be centered in the viewport. Values in the rotation
are measured in degrees respectively for X, Y and Z axis. The capability is available since the driver version 3.6.0.
App Signing
Capability Name | Description
--- | ---
appium:useKeystore | Whether to use a custom keystore to sign the app under test. false
by default, which means apps are always signed with the default Appium debug certificate (unless canceled by noSign
capability). This capability is used in combination with keystorePath
, keystorePassword
, keyAlias
and keyPassword
capabilities.
appium:keystorePath | The full path to the keystore file on the server filesystem. This capability is used in combination with useKeystore
, keystorePath
, keystorePassword
, keyAlias
and keyPassword
capabilities. Unset by default
appium:keystorePassword | The password to the keystore file provided in keystorePath
capability. This capability is used in combination with useKeystore
, keystorePath
, keystorePassword
, keyAlias
and keyPassword
capabilities. Unset by default
appium:keyAlias | The alias of the key in the keystore file provided in keystorePath
capability. This capability is used in combination with useKeystore
, keystorePath
, keystorePassword
, keyAlias
and keyPassword
capabilities. Unset by default
appium:keyPassword | The password of the key in the keystore file provided in keystorePath
capability. This capability is used in combination with useKeystore
, keystorePath
, keystorePassword
, keyAlias
and keyPassword
capabilities. Unset by default
appium:noSign | Set it to true
in order to skip application signing. By default all apps are always signed with the default Appium debug signature if they don't have any. This capability cancels all the signing checks and makes the driver to use the application package as is. This capability does not affect .apks
packages as these are expected to be already signed.
Device Locking
Capability Name | Description
--- | ---
appium:skipUnlock | Whether to skip the check for lock screen presence (true
). The default driver behaviour is to verify the presence of the screen lock (e.g. 'false' value of the capability) before starting the test and to unlock that (which sometimes might be unstable). Note, that this operation takes some time, so it is highly recommended to set this capability to true
and disable screen locking on device(s) under test. Read the Unlock tutorial for more details.
appium:unlockType | Set one of the possible types of Android lock screens to unlock. Read the Unlock tutorial for more details.
appium:unlockKey | Allows to set an unlock key. Read the Unlock tutorial for more details.
appium:unlockStrategy | Either 'locksettings' (default) or 'uiautomator'. Read the Unlock tutorial for more details.
appium:unlockSuccessTimeout | Maximum number of milliseconds to wait until the device is unlocked. 2000
ms by default. Read the Unlock tutorial for more details.
MJPEG
Capability Name | Description --- | --- appium:mjpegServerPort | The number of the port on the host machine that UiAutomator2 server starts the MJPEG server on. If not provided then the screenshots broadcasting service on the remote device does not get exposed to a local port (e.g. no adb port forwarding is happening) appium:mjpegScreenshotUrl | The URL of a service that provides realtime device screenshots in MJPEG format. If provided then the actual command to retrieve a screenshot will be requesting pictures from this service rather than directly from the server
Web Context
Capability Name | Description
--- | ---
appium:autoWebview | If set to true
then UiAutomator2 driver will try to switch to the web view with name WEBVIEW_ + appium:appPackage
after the session is started. For example, if appium:appPackage
capability is set to com.mypackage
then WEBVIEW_com.mypackage
will be used. false
by default.
appium:autoWebviewName | Set the name of webview context in which UiAutomator2 driver will try to switch if autoWebview
capability is set to true
(available since driver version 2.9.1). Has priority over using the appium:appPackage
value in webview name. For example, if appium:autoWebviewName
capability is set to myWebviewName
then WEBVIEW_myWebviewName
will be used. Unset by default.
appium:autoWebviewTimeout | 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.
appium:webviewDevtoolsPort | The local port number to use for devtools communication. By default the first free port from 10900..11000 range is selected. Consider setting the custom value if you are running parallel tests.
appium:ensureWebviewsHavePages | Whether to skip web views that have no pages from being shown in getContexts
output. The driver uses devtools connection to retrieve the information about existing pages. true
by default since Appium 1.19.0, false
if lower than 1.19.0.
appium:enableWebviewDetailsCollection | Whether to retrieve extended web views information using devtools protocol. Enabling this capability helps to detect the necessary chromedriver version more precisely. true
by default since Appium 1.22.0, false
if lower than 1.22.0.
appium:chromedriverPort | The port number to use for Chromedriver communication. Any free port number is selected by default if unset.
appium:chromedriverPorts | Array of possible port numbers to assign for Chromedriver communication. If none of the port in this array is free then an error is thrown.
appium:chromedriverArgs | Array of chromedriver command line arguments. Note, that not all command line arguments that are available for the desktop browser are also available for the mobile one.
appium:chromedriverExecutable | Full path to the chromedriver executable on the server file system.
appium:chromedriverExecutableDir | Full path to the folder where chromedriver executables are located. This folder is used then to store the downloaded chromedriver executables if automatic download is enabled. Read Automatic Chromedriver Discovery article for more details.
appium:chromedriverChromeMappingFile | Full path to the chromedrivers mapping file. This file is used to statically map webview/browser versions to the chromedriver versions that are capable of automating them. Read Automatic Chromedriver Discovery article for more details.
appium:chromedriverUseSystemExecutable | Set it to true
in order to enforce the usage of chromedriver, which gets downloaded by Appium automatically upon installation. This driver might not be compatible with the destination browser or a web view. false
by default.
appium:chromedriverDisableBuildCheck | Being set to true
disables the compatibility validation between the current chromedriver and the destination browser/web view. Use it with care.
appium:recreateChromeDriverSessions | If this capability is set to true
then chromedriver session is always going to be killed and then recreated instead of just suspending it on context switching. false
by default
appium:nativeWebScreenshot | Whether to use screenshoting endpoint provided by UiAutomator framework (true
) rather than the one provided by chromedriver (false
, the default value). Use it when you experience issues with the latter.
appium:extractChromeAndroidPackageFromContextName | If set to true
, tell chromedriver to attach to the android package we have associated with the context name, rather than the package of the application under test. false
by default.
appium:showChromedriverLog | If set to true
then all the output from chromedriver binary will be forwarded to the Appium server log. false
by default.
pageLoadStrategy | One of the available page load strategies. See https://www.w3.org/TR/webdriver/#capabilities
appium:chromeOptions | A mapping, that allows to customize chromedriver options. See https://chromedriver.chromium.org/capabilities for the list of available entries.
appium:chromeLoggingPrefs | Chrome logging preferences mapping. Basically the same as goog:loggingPrefs. It is set to {"browser": "ALL"}
by default.
Other
Capability Name | Description
--- | ---
appium:disableSuppressAccessibilityService | Being set to true
tells the instrumentation process to not suppress accessibility services during the automated test. This might be useful if your automated test needs these services. false
by default
appium:userProfile | Integer identifier of a user profile. By default the app under test is installed for the currently active user, but in case it is necessary to test how the app performs while being installed for a user profile, which is different from the current one, then this capability might come in handy.
appium:newCommandTimeout | How long (in seconds) the driver should wait for a new command from the client before assuming the client has stopped sending requests. After the timeout the session is going to be deleted. 60
seconds by default. Setting it to zero disables the timer.
appium:skipLogcatCapture | Skips to start capturing logs such as logcat. It might improve network performance. Log-related commands won't work if the capability is enabled. Defaults to false
.
appium:timeZone | Overrides the current device's time zone since the driver version 3.1.0. This change is preserved until the next override. The time zone identifier must be a valid name from the list of available time zone identifiers, for example Europe/Kyiv
Element Attributes
UiAutomator2 driver supports the following element attributes:
Name | Description | Example
--- | --- | ---
checkable | Whether the element is checkable or not | 'true'
checked | Whether the element is checked. Always false
if the element is not checkable | 'false'
class or className | The full name of the element's class. Could be null
for some elements | 'android.view.View'
clickable | Whether the element could be clicked | 'false'
content-desc or contentDescription | The content-description attribute of the accessible element | 'foo'
enabled | Whether the element could be clicked | 'true'
focusable | Whether the element could be focused | 'true'
focused | Whether the element could is focused. Always false
if the element is not focusable | 'false'
long-clickable or longClickable | Whether the element accepts long clicks | 'false'
package | Identifier of the package the element belongs to | 'com.mycompany'
password | Whether the element is a password input field | 'true'
resource-id or resourceId | Element's resource identifier. Could be null
| 'com.mycompany:id/resId'
scrollable | Whether the element is scrollable | 'true'
selection-start | Contains the index of the char where the selection starts. Could be null
if the element provides no range info | '5'
selection-end | Contains the index of the char where the selection ends. Could be null
if the element provides no range info | '8'
selected | Whether the element is selected | 'false'
text or name | The element's text. It never equals to null | 'my text'
hint | Element's hint text. On Android versions below Oreo it always equals to null
. | 'my hint text'
bounds | The element's visible frame ([left, top][right, bottom]
) | [0,0][100,100]
displayed | Whether the element is visible to the user | 'true'
contentSize | The dimensions of the element's content area | {"left": 0, "top":0, "width": 100, "height": 100, "scrollableOffset": 10, "touchPadding": 0}
extras | The result of getExtras. The value includes all key-value pairs as key=value
separated by a semicolon (;
). If the value is empty, then only key part ending with the equal sign will be present. | Part of extras in chrome browser: AccessibilityNodeInfo.roleDescription=;
AccessibilityNodeInfo.chromeRole=rootWebArea;
ACTION_ARGUMENT_HTML_ELEMENT_STRING_VALUES=
ARTICLE,BLOCKQUOTE,BUTTON,CHECKBOX
Element Location
UiAutomator2 driver supports the following location strategies:
Name | Description | Speed Ranking | Example
--- | --- | --- | ---
id | This strategy is mapped to the native UiAutomator's By.res
locator (exact match of element's resource name). Package identifier prefix is added automatically if unset and is equal to the identifier of the current application under test. | ⭐⭐⭐⭐⭐
| 'com.mycompany:id/resourceId'
accessibilityId | This strategy is mapped to the native UiAutomator's By.desc
locator (exact match of element's content description). In applications written using ReactNative framework this attribute reflects the value of the accessibilityLabel
property. | ⭐⭐⭐⭐⭐
| 'my description'
className | This strategy is mapped to the native UiAutomator's By.clazz
locator (exact match of element's class). | ⭐⭐⭐⭐⭐
| 'android.view.View'
-android uiautomator | This strategy is mapped to the native UiAutomator's UiSelector
locator). It is even possible to perform some advanced operations, like scrolling, with this locator type. Check Guide on UiAutomator Locator Types | ⭐⭐⭐⭐
| new UiScrollable(new UiSelector().resourceId("android:id/list")).scrollIntoView(new UiSelector().text("Radio Group"))
xpath | For elements lookup Xpath strategy the driver uses the same XML tree that is generated by page source API. Only Xpath 1.0 is supported for appium-uiatomator2-server versions below 4.25.0. All server versions starting from 4.25.0 support both Xpath 1.0 and 2.0 | ⭐⭐⭐
| By.xpath("//android.view.View[@text="Regular" and @checkable="true"]")
[!WARNING] Google is going to deprecate and remove
UiCollection
,UiObject
,UiScrollable
, andUiSelector
support from the UiAutomator framework. This will render all-android uiautomator
-based locators invalid, so please keep it in mind while using them or plan to use them in the future.
BiDi Protocol Support
UIAutomator2 driver has partial support of the BiDi Protocol since version 3.7.10. Check the Supported BiDi Commands And Events document for more details.
Parallel Tests
It is possible to execute tests in parallel using UiAutomator2 driver. Appium allows to do this on per-process (multiple server processes running on different ports managing single session) or per-request basis (single server process managing multiple sessions, more preferable, uses less resources and ensures better control over running sessions).
Note: If you are not going to run your tests in parallel then consider enabling the --session-override
Appium server argument.
It forces the server to close all pending sessions before a new one could be opened,
which allows you to avoid possible issues with such sessions silently running/expiring in the background.
Important Real Device Capabilities
udid
: The unique device id.systemPort
: Set a unique system port number for each parallel session. Otherwise you might get a port conflict such as in this issue.chromedriverPort
: The unique chromedriver port if testing web views or Chrome.mjpegServerPort
: Set a unique MJPEG server port for each parallel session if you are going to record a video.
Important Emulator Capabilities
avd
: The unique emulator name.systemPort
: Set a unique system port number for each parallel session.chromedriverPort
: The unique chromedriver port (if testing web views or Chrome).mjpegServerPort
: Set a unique MJPEG server port for each parallel session if you are going to record a video.
Settings API
UiAutomator2 driver supports Appium Settings API. Along with the common settings the following driver-specific settings are currently available:
Name | Type | Description
--- | --- | ---
actionAcknowledgmentTimeout | long | Maximum number of milliseconds to wait for an acknowledgment of generic uiautomator actions, such as clicks, text setting, and menu presses. The acknowledgment is anAccessibilityEvent corresponding to an action, that lets the framework determine if the action was successful. Generally, this timeout should not be modified. 3000
ms by default
allowInvisibleElements | boolean | Whether to include elements that are not visible to the user (e. g. whose displayed
attribute is false
) to the XML source tree. false
by default
ignoreUnimportantViews | boolean | Enables or disables layout hierarchy compression. If compression is enabled, the layout hierarchy derived from the Acessibility framework will only contain nodes that are important for uiautomator testing. Any unnecessary surrounding layout nodes that make viewing and searching the hierarchy inefficient are removed. false
by default
elementResponseAttributes | string | Comma-separated list of element attribute names to be included into findElement response. By default only element UUID is present there, but it is also possible to add the following items: name
, text
, rect
, enabled
, displayed
, selected
, attribute/<element_attribute_name>
. It is required that shouldUseCompactResponses
setting is set to false
in order for this one to apply.
enableMultiWindows | boolean | Whether to include all windows that the user can interact with (for example an on-screen keyboard) while building the XML page source (true
). By default it is false
and only the single active application window is included to the page source.
enableTopmostWindowFromActivePackage | boolean | Whether to limit the window with the highest Z-order from the active package for interactions and page source retrieval. By default it is false
and the active application window, which may not necessarily have this order, is included to the page source.
enableNotificationListener | boolean | Whether to enable (true
) toast notifications listener to listen for new toast notifications. By default this listener is enabled and UiAutomator2 server includes the text of toast messages to the generated XML page source, but not for longer than 3500
ms after the corresponding notification expires.
keyInjectionDelay | long | Delay in milliseconds between key presses when injecting text input. 0 ms by default
scrollAcknowledgmentTimeout | long | Timeout for waiting for an acknowledgement of an uiautomator scroll swipe action. The acknowledgment is an AccessibilityEvent, corresponding to the scroll action, that lets the framework determine if the scroll action was successful. Generally, this timeout should not be modified. 200
ms by default
shouldUseCompactResponses | boolean | Used in combination with elementResponseAttributes
setting. If set to false
then the findElement response is going to include the items enumerated in elementResponseAttributes
setting. true
by default
waitForIdleTimeout | long | Timeout used for waiting for the user interface to go into an idle state. By default, all core uiautomator objects except UiDevice will perform this wait before starting to search for the widget specified by the object's locator. Once the idle state is detected or the timeout elapses (whichever occurs first), the object will start to wait for the selector to find a match. Consider lowering the value of this setting if you experience long delays while interacting with accessibility elements in your test. 10000
ms by default.
waitForSelectorTimeout | long | Timeout for waiting for a widget to become visible in the user interface so that it can be matched by a selector. Because user interface content is dynamic, sometimes a widget may not be visible immediately and won't be detected by a selector. This timeout allows the uiautomator framework to wait for a match to be found, up until the timeout elapses. This timeout is only applied to android uiautomator
location strategy. 10000
ms by default
normalizeTagNames | boolean | Being set to true
applies unicode-to-ascii normalization of element class names used as tag names in the page source XML document. This is necessary if the application under test has some Unicode class names, which cannot be used as XML tag names by default due to known bugs in Android's XML DOM parser implementation. false
by default
shutdownOnPowerDisconnect | boolean | Whether to shutdown the server if the device under test is disconnected from a power source (e. g. stays on battery power). true
by default.
simpleBoundsCalculation | boolean | Whether to calculate element bounds as absolute values (true
) or check if the element is covered by other elements and thus partially hidden (false
, the default behaviour). Setting this setting to true
helps to improve the performance of XML page source generation, but decreases bounds preciseness. Use with care.
trackScrollEvents | boolean | Whether to apply scroll events tracking (true
, the default value), so the server could calculate the value of contentSize
attribute. Having this setting enabled may add delays to all scrolling actions.
wakeLockTimeout | long | The timeout in milliseconds of wake lock that UiAutomator2 server acquires by default to prevent the device under test going to sleep while an automated test is running. By default the server acquires the lock for 24 hours. Setting this value to zero forces the server to release the wake lock.
serverPort | int | The number of the port on the remote device to start UiAutomator2 server on. Do not mix this with systemPort
, which is acquired on the host machine. Must be in range 1024..65535. 6790
by default
mjpegServerPort | int | The number of the port on the remote device to start MJPEG screenshots broadcaster on. Must be in range 1024..65535. 7810
by default
mjpegServerFramerate | int | The maximum count of screenshots per second taken by the MJPEG screenshots broadcaster. Must be in range 1..60. 10
by default
mjpegScalingFactor | int | The percentage value used to apply downscaling on the screenshots generated by the MJPEG screenshots broadcaster. Must be in range 1..100. 50
is by default, which means that screenshots are downscaled to the half of their original size keeping their original proportions.
mjpegServerScreenshotQuality | int | The percentage value used to apply lossy JPEG compression on the screenshots generated by the MJPEG screenshots broadcaster. Must be in range 1..100. 50
is by default, which means that screenshots are compressed to the half of their original quality.
mjpegBilinearFiltering | boolean | Controls whether (true
) or not (false
, the default value) to apply bilinear filtering to MJPEG screenshots broadcaster resize algorithm. Enabling this flag may improve the quality of the resulting scaled bitmap, but may introduce a small performance hit.
useResourcesForOrientationDetection | boolean | Defines the strategy used by UiAutomator2 server to detect the original device orientation. By default (false
value) the server uses device rotation value for this purpose. Although, this approach may not work for some devices and a portrait orientation may erroneously be detected as the landscape one (and vice versa). In such case it makes sense to play with this setting.
enforceXPath1 | boolean | Since UiAutomator2 driver version 4.25.0
XPath2 is set as the default and the recommended interpreter for the corresponding element locators. This interpreter is based on Psychopath XPath2 implementation, which is now a part of the Eclipse foundation. In most of the cases XPath1 locators are also valid XPath2 locators, so there should be no issues while locating elements. Although, since the XPath2 standard is much more advanced in comparison to the previous version, some issues are possible for more sophisticated locators, which cannot be fixed easily, as we depend on the third-party library mentioned above. Then try to workaround such issues by enforcing XPath1 usage (whose implementation is a part of the Android platform itself) and assigning this setting to true
. Note, this setting is actually applied at the time when the element lookup by XPath is executed, so you could switch it on or off whenever needed throughout your automated testing session.
limitXPathContextScope | boolean | Due to historical reasons UiAutomator2 driver limits scopes of element context-based searches to the parent element. This means a request like findElement(By.xpath, "//root").findElement(By.xpath, "./..")
would always fail, because the driver only collects descendants of the root
element for the destination XML source. The limitXPathContextScope
setting being set to false
changes that default behavior, so the collected page source includes the whole page source XML where root
node is set as the search context. With that setting disabled the search query above should not fail anymore. Although, you must still be careful while building XPath requests for context-based searches with the limitXPathContextScope
setting set to false
. A request like findElement(By.xpath, "//root").findElement(By.xpath, "//element")
would ignore the current context and search for element
trough the whole page source. Use .
notation to correct that behavior and only find element
nodes which are descendants of the root
node: findElement(By.xpath, "//root").findElement(By.xpath, ".//element")
.
disableIdLocatorAutocompletion | boolean | According to internal Android standards it is expected that each resource identifier is prefixed with <packageName>:id/
string. This should guarantee uniqueness of each identifier. Although some application development frameworks ignore this rule and don't add such prefix automatically or, rather, let it up to the developer to decide how to represent their application identifiers. For example, testTag modifier attribute in the Jetpack Compose with testTagsAsResourceId allows developers to set an arbitrary string without the prefix rule. Interoperability with UiAutomator also explains how to set it. By default UIA2 driver adds the above prefixes automatically to all resource id locators if they are not prefixed, but in case of such "special" apps this feature might be disabled by assigning the setting to true
.
includeExtrasInPageSource | boolean | Whether to include extras
element attribute in the XML page source result. Then, XPath locator can find the element by the extras. Its value consists of combined getExtras as keys=value
pair separated by a semicolon (;
), thus you may need to find the element with partial matching like contains
e.g. driver.find_element :xpath, '//*[contains(@extras, "AccessibilityNodeInfo.roleDescription=")]'
. The value could be huge if elements in the XML page source have large extras
. It could affect the performance of XML page source generation.
snapshotMaxDepth | int | The number of maximum depth for the source tree snapshot. The default value is 70
. This number should be in range [1, 500]. A part of the elements source tree might be lost if the value is too low. Also, StackOverflowError might be caused if the value is too high (Issues 12545, 12892). The available driver version is 2.27.0
or higher.
Platform-Specific Extensions
Beside of standard W3C APIs the driver provides the below custom command extensions to execute platform specific scenarios. Use the following source code examples in order to invoke them from your client code:
// Java 11+
var result = driver.executeScript("mobile: <methodName>", Map.ofEntries(
Map.entry("arg1", "value1"),
Map.entry("arg2", "value2")
// you may add more pairs if needed or skip providing the map completely
// if all arguments are defined as optional
));
// WebdriverIO
const result = await driver.executeScript('mobile: <methodName>', [{
arg1: "value1",
arg2: "value2",
}]);
# Python
result = driver.execute_script('mobile: <methodName>', {
'arg1': 'value1',
'arg2': 'value2',
})
# Ruby
result = @driver.execute_script 'mobile: <methodName>', {
arg1: 'value1',
arg2: 'value2',
}
// Dotnet
object result = driver.ExecuteScript("mobile: <methodName>", new Dictionary<string, object>() {
{"arg1", "value1"},
{"arg2", "value2"}
});
mobile: shell
Executes the given shell command on the device under test via ADB connection. This extension exposes a potential security risk and thus is only enabled when explicitly activated by the adb_shell
server command line feature specifier.
Arguments
Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
command | string | yes | Shell command name to execute, for example echo
or rm
| echo
args | Array<string> | no | Array of command arguments | ['-f', '/sdcard/myfile.txt']
timeout | number | no | Command timeout in milliseconds. If the command blocks for longer than this timeout then an exception is going to be thrown. The default timeout is 20000
ms | 100000
includeStderr | boolean | no | Whether to include stderr stream into the returned result. false
by default | true
Returned Result
Depending on the includeStderr
value this API could either return a string, which is equal to the stdout
stream content of the given command or a dictionary whose elements are stdout
and stderr
and values are contents of the corresponding outgoing streams. If the command exits with a non-zero return code then an exception is going to be thrown. The exception message will be equal to the command stderr.
mobile: execEmuConsoleCommand
Executes a command through emulator telnet console interface and returns its output.
The emulator_console
server feature must be enabled in order to use this method.
Arguments
Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
command | string | yes | The actual command to execute. See Android Emulator Console Guide for more details on available commands | help-verbose
execTimeout | number | no | Timeout used to wait for a server reply to the given command in milliseconds. 60000
ms by default | 100000
connTimeout | boolean | no | Console connection timeout in milliseconds. 5000
ms by default | 10000
initTimeout | boolean | no | Telnet console initialization timeout in milliseconds (the time between the connection happens and the command prompt). 5000
ms by default | 10000
Returned Result
The actual command output. An error is thrown if command execution fails.
Mobile Gesture Commands
UiAutomator2 provides several extensions that allow to automate popular mobile gesture shortcuts:
- mobile: dragGesture
- mobile: flingGesture
- mobile: doubleClickGesture
- mobile: clickGesture
- mobile: longClickGesture
- mobile: pinchCloseGesture
- mobile: pinchOpenGesture
- mobile: swipeGesture
- mobile: scrollGesture
These gestures are documented in the Automating Mobile Gestures tutorial. Check W3C Actions API and Low-Level Insights on Android Input Events if you need to automate more complicated gestures.
mobile: scroll
Scrolls the given scrollable element until an element identified by strategy
and selector
becomes visible. This function returns immediately if the destination element is already visible in the view port. Otherwise it would scroll to the very beginning of the scrollable control and tries to reach the destination element by scrolling its parent to the end step by step. The scroll direction (vertical or horizontal) is detected automatically.
Arguments
Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
elementId | string | no | The identifier of the scrollable element. It is required this element is a valid scrollable container and it was located by -android uiautomator
strategy. If this property is not provided then the first currently available scrollable view is selected for the interaction. | 123456-3456-3435-3453453
strategy | string | yes | The following strategies are supported: accessibility id
(UiSelector().description), class name
(UiSelector().className), -android uiautomator
(UiSelector) | 'accessibility id'
selector | string | yes | The corresponding lookup value for the selected strategy. | 'com.mycompany:id/table'
maxSwipes | number | no | The maximum number of swipes to perform on the target scrollable view in order to reach the destination element. In case this value is unset then it would be retrieved from the scrollable element itself (vua getMaxSearchSwipes()
property). | 10
mobile: deepLink
Start URI that may take users directly to the specific content in the app. Read Reliably Opening Deep Links Across Platforms and Devices for more details.
Arguments
Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
url | string | yes | The URL to start | theapp://login/
package | string | yes | The name of the package to start the URI with | 'com.mycompany'
waitForLaunch | boolean | no | If false
then ADB won't wait for the started activity to return the control. true
by default | false
mobile: startLogsBroadcast
Starts Android logcat broadcast websocket on the same host and port where Appium server is running at /ws/session/:sessionId:/appium/logcat
endpoint. The method will return immediately if the web socket is already listening. Each connected webcoket listener will receive logcat log lines as soon as they are visible to Appium. Read Using Mobile Execution Commands to Continuously Stream Device Logs with Appium for more details.
mobile: stopLogsBroadcast
Stops the previously started logcat broadcasting websocket server. This method will return immediately if no server is running. Read Using Mobile Execution Commands to Continuously Stream Device Logs with Appium for more details.
mobile: deviceidle
This is a wrapper to 'adb shell dumpsys deviceidle' interface. Read Diving Into Android 'M' Doze for more details. This API only exists since Android 6.
Arguments
Name | Type | Required | Description | Example --- | --- | --- | --- | --- action | whitelistAdd or whitelistRemove | yes | The name of the action to perform | whitelistAdd packages | string or string[] | yes | One or more package names to perfom the above action on | 'com.mycompany'
mobile: acceptAlert
Tries to accept an Android alert. This method might not always be reliable as there is no single standard for how Android alerts should look like within the Accessibility representation.
Arguments
Name | Type | Required | Description | Example --- | --- | --- | --- | --- buttonLabel | string | no | The name/text of the alert button to click in order to accept it. If not provided then the driver will try to autodetect it | Accept
mobile: dismissAlert
Tries to dismiss an Android alert. This method might not always be reliable as there is no single standard for how Android alerts should look like within the Accessibility representation.
Arguments
Name | Type | Required | Description | Example --- | --- | --- | --- | --- buttonLabel | string | no | The name/text of the alert button to click in order to dismiss it. If not provided then the driver will try to autodetect it | Dismiss
mobile: batteryInfo
Retrieves the battery information from the device under test.
Returned Result
The extension returns a dictionary whose entries are:
Name | Type | Description | Example --- | --- | --- | --- level | number | Battery level in range [0.0, 1.0], where 1.0 means 100% charge. -1 is returned if the actual value cannot be retrieved from the system. | 0.5 state | number| Battery state. The following values are possible: BATTERY_STATUS_UNKNOWN = 1; BATTERY_STATUS_CHARGING = 2; BATTERY_STATUS_DISCHARGING = 3; BATTERY_STATUS_NOT_CHARGING = 4; BATTERY_STATUS_FULL = 5. -1 is returned if the actual value cannot be retrieved from the system. | 4
mobile: deviceInfo
Retrieves the information about the device under test, like the device model, serial number, network connectivity info, etc.
Returned Result
The extension returns a dictionary whose entries are the device properties. Check https://github.com/appium/appium-uiautomator2-server/blob/master/app/src/main/java/io/appium/uiautomator2/handler/GetDeviceInfo.java to get the full list of returned keys and their corresponding values.
mobile: getDeviceTime
Retrieves the current device's timestamp.
Arguments
Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
format | string | no | The set of format specifiers. Read https://momentjs.com/docs/ to get the full list of supported datetime format specifiers. The default format is YYYY-MM-DDTHH:mm:ssZ
, which complies to ISO-8601 | YYYY-MM-DDTHH:mm:ssZ
Returned Result
The device timestamp string formatted according to the given specifiers
mobile: changePermissions
Changes package permissions in runtime.
Arguments
Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
permissions | string or Array<string> | yes | The full name of the permission to be changed or a list of permissions. Consider checking the full list of standard Android permission names. If all
magic string is passed (available since driver version 2.8.0) and target
equals pm
(the default value) then the chosen action is going to be applied to all permissions requested/granted by the 'appPackage'. If target
is set to appops
(available since v2.11.0) then check AppOpsManager.java sources to get the full list of supported appops permission names for the given Android platform. The all
magic string is unsupported for the appops
target. | ['android.permission.ACCESS_FINE_LOCATION', 'android.permission.BROADCAST_SMS']
all
['READ_SMS', 'ACCESS_NOTIFICATIONS']
appPackage | string | no | The application package to set change permissions on. Defaults to the package name under test | com.mycompany.myapp
action | string | no | Either grant
(the default action) or revoke
if target
is set to pm
, otherwise one of: allow
(default), deny
, ignore
, default
. | allow
target | string | no | Either pm
(default) or appops
(available since v2.11.0). The appops
one requires adb_shell server security option to be enabled | appops
mobile: getPermissions
Gets runtime permissions list for the given application package.
Arguments
Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
type | string | no | One of possible permission types to get. Can be one of: denied
, granted
or requested
(the default value). | granted
appPackage | string | no | The application package to get permissions from. Defaults to the package name under test | com.mycompany.myapp
Returned Result
Array of strings, where each string is a permission name. the array could be empty.
mobile: performEditorAction
Performs IME action on the currently focused edit element.
Very often Android developers use onEditorAction callback with actionId
argument to implement actions handling, for example, when Search
or Done
button is pressed on the on-screen keyboard. This mobile extension is supposed to emulate the invokation of such callback on the focused element.
Arguments
Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
action | string | yes | The name or an integer code of the editor action to be executed. The following action names are supported: normal, unspecified, none, go, search, send, next, done, previous
. Read EditorInfo for more details on this topic. | search
mobile: startScreenStreaming
Starts device screen broadcast by creating MJPEG server. Multiple calls to this method have no effect unless the previous streaming session is stopped. This method only works if the adb_screen_streaming
feature is enabled on the server side. It is also required that GStreamer with gst-plugins-base
, gst-plugins-good
and gst-plugins-bad
packages are installed and available in PATH on the server machine.
Arguments
Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
width | number | no | The scaled width of the device's screen. If unset then the script will assign it to the actual screen width measured in pixels. | 768
height | number | no | The scaled height of the device's screen. If unset then the script will assign it to the actual screen height measured in pixels. | 1024
bitRate | number | no | The video bit rate for the video, in bits per second. The default value is 4000000 (4 Mb/s). You can increase the bit rate to improve video quality, but doing so results in larger movie files. | 1024000
host | string | no | The IP address/host name to start the MJPEG server on. You can set it to 0.0.0.0
to trigger the broadcast on all available network interfaces. 127.0.0.1
by default | 0.0.0.0
pathname | string | no | The HTTP request path the MJPEG server should be available on. If unset then any pathname on the given host
/port
combination will work. Note that the value should always start with a single slash: /
| /myserver
tcpPort | number | no | The port number to start the internal TCP MJPEG broadcast on. Thi