Skip to content

Execute Methods

In addition to standard W3C APIs, the driver provides many custom command extensions for executing platform-specific scenarios. Use the following examples in order to invoke them from your client code:

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
));
const result = await driver.executeScript('mobile: <methodName>', [{
    arg1: "value1",
    arg2: "value2",
}]);
result = driver.execute_script('mobile: <methodName>', {
    'arg1': 'value1',
    'arg2': 'value2',
})
result = @driver.execute_script 'mobile: <methodName>', {
    arg1: 'value1',
    arg2: 'value2',
}
object result = driver.ExecuteScript("mobile: <methodName>", new Dictionary<string, object>() {
    {"arg1", "value1"},
    {"arg2", "value2"}
}));

mobile: selectPickerWheelValue

Performs selection of the next or previous picker wheel value. This might be useful if these values are populated dynamically, so you don't know which one to select or value selection suing sendKeys API does not work because of an XCTest bug. The method throws an exception if it fails to change the current picker value.

Arguments

Name Type Required Description Example
elementId (element before version 1.22) string yes PickerWheel's internal element id (as hexadecimal hash string) to perform value selection on. The element must be of type XCUIElementTypePickerWheel abcdef12-1111-2222-3333-444444
order string yes Either next to select the value next to the current one from the target picker wheel or previous to select the previous one. next
offset number no The value in range [0.01, 0.5]. It defines how far from picker wheel's center the click should happen. The actual distance is calculated by multiplying this value to the actual picker wheel height. Too small offset value may not change the picker wheel value and too high value may cause the wheel to switch two or more values at once. Usually the optimal value is located in range [0.15, 0.3]. 0.2 by default 0.15
value string no If provided WDA will try to automatically scroll in the given direction until the actual picker value reaches the expected one or the amount of scrolling attempts is exceeded. myvalue
maxAttempts number no The maximum number of scrolling attempts to reach value before an error will be thrown. Only makes sense in combination with value. 25 by default 50

mobile: sendMemoryWarning

Simulates sending of Low Memory warning to the target application. It might be useful to verify the didReceiveMemoryWarning API in the application under test. This feature only works on real devices running iOS 17+ with Xcode 15+ SDK. The target application must be running while this API is called.

Arguments

Name Type Required Description Example
bundleId string yes Bundle identifier of the app to simulate the warning for com.great.app

mobile: alert

Tries to apply the given action to the currently visible alert.

Arguments

Name Type Required Description Example
action string yes The actual action to apply. Could be either: accept, dismiss or getButtons accept
buttonLabel string no The name of the button used to perform the chosen alert action. Only makes sense if the action is accept or dismiss Accept

Returned Result

The list of alert button names if the selected action is getButtons

mobile: setPasteboard

Sets the Simulator's pasteboard content to the given value. Does not work for real devices.

Arguments

Name Type Required Description Example
content string yes The content to set hello
encoding string no The content's encoding. utf8 by default ascii

mobile: getPasteboard

Gets the Simulator's pasteboard content. Does not work for real devices.

Arguments

Name Type Required Description Example
encoding string no The expected encoding of the returned string. utf8 by default ascii

Returned Result

The pasteboard content string.

mobile: source

Allows to retrieve the source tree of the current page in different representation formats.

Arguments

Name Type Required Description Example
format string yes One of possible page tree source representation formats: xml (the default value), description and json. The xml format generates the output similar to what getPageSource standard API returns. description representation is how XCTest "sees" the page internally and is the same string as debugDescription API would return for the root application element. This source representation format is useful for debugging purposes and is the fastest one to fetch. json representation is similar to xml, but the tree hierarchy there is represented as JSON elements tree rather than as XML nodes. description
excludedAttributes string no One or more comma-separated attribute names to be excluded from the XML output, thus only makes sense if format is set to xml. It might be sometimes helpful to exclude, for example, the visible attribute, to significantly speed-up page source retrieval. visible,accessible

Returned Result

The page source tree formatted according to the given format argument.

mobile: getContexts

Retrieves the list of available contexts including the extended context information, like urls and page names. This is different from the standard getContexts API, because the latter only has web view names without any additional information. In situation where multiple web views are available at once the client code would have to connect to each of them in order to detect the one, which needs to be interacted with. Although, this extra effort is not needed with the information provided by this extension.

Arguments

Name Type Required Description Example
waitForWebviewMs number no Tells Appium for how long (in milliseconds) to wait for web view(s) to appear. 5000ms by default 10000

Returned Result

The list of available context objects along with their properties:

  • id: The identifier of the context. The native context will be 'NATIVE_APP' and the webviews will be 'WEBVIEW_xxx'
  • title: The title associated with the webview content. Could be null
  • url: The url associated with the webview content. Could be null

mobile: installApp

Installs the given application to the device under test. Make sure the application is built for a correct architecture and is signed with a proper developer signature (for real devices) prior to install it.

Arguments

Name Type Required Description Example
app string yes See the description of the appium:app capability /path/to/my.app
timeoutMs number no The maximum time to wait until app install is finished in milliseconds on real devices. If not provided then the value of appium:appPushTimeout capability is used. If the capability is not provided then equals to 240000ms 500000
Deprecated Not Used since v7.15.0 strategy string no One of possible app installation strategies on real devices. This argument is ignored on simulators. If not provided then the value of appium:appInstallStrategy is used. If the latter is also not provided then serial is used. See the description of appium:appInstallStrategy capability for more details on available values. parallel
checkVersion bool no If set to true, it will make xcuitest driver to verify whether the app version currently installed on the device under test is older than the one, which is provided as app value. No app install is going to happen if the candidate app has the same or older version number than the already installed copy of it. The version number used for comparison must be provided as CFBundleVersion Semantic Versioning-compatible value in the application's Info.plist. No validation is performed and the app is installed if checkVersion was not provided or false, which is default behavior. true

mobile: isAppInstalled

Checks whether the given application is installed on the device under test. Offloaded applications are handled as not installed.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the application to be checked com.mycompany.myapp

Returned Result

Either true or false

mobile: removeApp

Removes the given application from the device under test. Offloaded application can also be removed.

For real devices, please also check how to explicitly clear the application local data.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the application to be removed com.mycompany.myapp

Returned Result

Either true if the application was successfully uninstalled, otherwise false

mobile: launchApp

Executes the given application on the device under test. If the application is already running then it would be activated. If the application is not installed or cannot be launched then an exception is thrown.

It accepts arguments and environment to start an application with them.

As an usage example, arguments allow you to enforce language and locale for the application to start with. XCTest lets you to start an application process by specifying Language and Locale IDs via process arguments with -AppleLanguages and -AppleLocale. Check the Testing Specific Languages and Regions part of the Testing Your Internationalized App for more details. Make sure to terminate the application before launching it with arguments if it is already running.

driver.executeScript("mobile:launchApp", Map.of(
    "bundleId", "com.apple.Preferences",
    "arguments", Arrays.asList("-AppleLanguages", "(ja)", "-AppleLocale", "ja_JP")
));
await driver.executeScript('mobile:launchApp', [{
  bundleId: 'com.apple.Preferences',
  arguments: ['-AppleLanguages', '(ja)', '-AppleLocale', 'ja_JP']
}]);
driver.execute_script("mobile:launchApp", {
  "bundleId": "com.apple.Preferences",
  "arguments": ["-AppleLanguages", "(ja)", "-AppleLocale", "ja_JP"]
})
driver.execute_script "mobile:launchApp", {
  "bundleId": "com.apple.Preferences",
  "arguments": ["-AppleLanguages", "(ja)", "-AppleLocale", "ja_JP"]
}
driver.ExecuteScript("mobile:launchApp", new Dictionary<string, object>() {
    {"bundleId", "com.apple.Preferences"},
    {"arguments", new List<string>() { "-AppleLanguages", "(ja)", "-AppleLocale", "ja_JP" }}
});

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the application to be launched com.mycompany.myapp
arguments string|array no One or more command line arguments for the app. If the app is already running then this argument is ignored. ['-s', '-m']
environment dict no Environment variables mapping for the app. If the app is already running then this argument is ignored. {'var': 'value'}

mobile: terminateApp

Terminates the given app on the device under test via XCTest's terminate API. If the app is not installed an exception is thrown. If the app is not running then nothing is done.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the application to be terminated com.mycompany.myapp

Returned Result

Either true if the app was successfully terminated, otherwise false

mobile: killApp

Kill the given app on the real device under test by instruments service. If the app is not running or failed to kill, then nothing is done.

XCUITest driver 4.4 and higher does not require py-ios-device. XCUITest driver 4.3 requires py-ios-device.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the application to be terminated com.mycompany.myapp

Returned Result

Either true if the app was successfully killed, otherwise false

mobile: queryAppState

Queries the state of an installed application from the device under test. An exception will be thrown if the app with given identifier is not installed.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the application to be queried com.mycompany.myapp

Returned Result

An integer number is returned, which encodes the application state. Possible values are described in XCUIApplicationState XCTest documentation topic.

mobile: activateApp

Puts the given application to foreground if it is running in the background. An error is thrown if the app is not installed or is not running. Nothing is done if the app is already running in the foreground.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the application to be activated com.mycompany.myapp

mobile: listApps

List applications installed on the real device under test. This extension throws an error if called for a Simulator device. Offload applications will not be in the result.

Arguments

Name Type Required Description Example
applicationType string no The type of applications to list. Either System or User (the default one) System

Returned Result

A list of apps, where each item is a map where keys are bundle identifiers and values are maps of platform-specific app properties. Having UIFileSharingEnabled set to true in the app properties map means this app supports files upload and download into its documents container. Read the File Transfer guide for more details.

mobile: clearApp

Deletes data files from the data container of an installed app, so it could start from the clean state next time it is launched. The destination app will be terminated if it is running when this API is invoked. Sometimes it might also be necessary to invoke the following APIs to fully reset the state of an installed app (make sure the app is not running while calling them): - mobile: clearKeychains - mobile: resetPermission

This API might not be 100% reliable for some apps. The only reliable method to fully reset an existing app that Apple supports is to uninstall it and then perform a fresh install of the same app.

This API only works on simulators. An exception is thrown if executed with real devices.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the application to be cleared com.mycompany.myapp

Returned Result

true if at least one item has been successfully deleted from the app data container.

mobile: startPerfRecord

Starts performance profiling for the device under test. Relaxing security is mandatory for simulators. It can always work for real devices. Since XCode 12 the method tries to use xctrace tool to record performance stats. The instruments developer utility is used as a fallback for this purpose if xctrace is not available. It is possible to record multiple profiles at the same time. Read Instruments User Guide for more details. If the recording for the given profile is already running then nothing is done.

Arguments

Name Type Required Description Example
timeout number no The maximum count of milliseconds to record the profiling information. It is recommended to always limit the maximum duration of perf record operation, since the resulting logs are pretty huge and may easily exceed the free space on th local storage volume. 300000ms by default (5 minutes) 600000
profileName string no The name of existing performance profile to apply. Can also contain the full path to the chosen template on the server file system. Note, that not all profiles are supported on mobile devices. Activity Monitor by default. Time Profile
pid string or number no The ID of the process to measure the performance for. Set it to current in order to measure the performance of the process, which belongs to the currently active application. All processes running on the device are measured if pid is unset (the default setting). current

mobile: stopPerfRecord

Stops the performance recording operation previosuly started by mobile: startPerfRecord call. If the previous call has already been completed due to the timeout then its result is returned immediately. An error is thrown if the performance recording has failed to start and recorded no data.

Arguments

Name Type Required Description Example
profileName string no The name of existing performance profile to stop the recording for. Multiple recorders for different profile names could be executed at the same time. Activity Monitor by default. Time Profile
remotePath string no The path to the remote location, where the resulting zipped .trace file should be uploaded. The following protocols are supported: http/https, ftp Null or empty string value (the default setting) means the content of resulting file should be zipped, encoded as Base64 and passed as the endpoint response value. An exception will be thrown if the generated file is too big to fit into the available process memory. https://myserver/upload
user string no The name of the user for the remote authentication. Only works if remotePath is provided. myuser
pass string no The password for the remote authentication. Only works if remotePath is provided. mypassword
method string no The http multipart upload method name. Only works if remotePath is provided. PUT by default POST
headers dict no Additional headers mapping for multipart http(s) uploads {'User-Agent': 'Myserver 1.0'}
fileFieldName string no The name of the form field, where the file content BLOB should be stored for http(s) uploads. file by default payload
formFields dict or array no Additional form fields for multipart http(s) uploads {'field2': 'value2'}

Returned Result

The resulting file in .trace format can be either returned directly as base64-encoded zip archive or uploaded to a remote location (such files could be pretty large), depending on the remotePath argument value. Afterwards it is possible to unarchive and open such file with Xcode Developer Tools.

mobile: installCertificate

Installs a custom certificate onto the device. Since Xcode SDK 11.4 Apple has added a dedicated simctl subcommand to quickly handle certificates on Simulator over CLI. On real devices the certificate could be installed via CLI if py-ios-device tool is available on the server machine. On simulators before Xcode 11.4 SDK Apple provides no official way to do it via the command line. In such case (and also as a fallback if CLI setup fails) this method tries to wrap the certificate into .mobileconfig format and then deploys the wrapped file to the internal HTTP server, so one can open it via mobile Safari. Then the algorithm goes through the profile installation procedure by clicking the necessary buttons using WebDriverAgent.

Arguments

Name Type Required Description Example
content string yes Base64-encoded content of the public certificate in PEM format a23234...
commonName string no Common name of the certificate. If this is not set then the script will try to parse it from the given certificate content. com.myorg
isRoot boolean no This option defines where the certificate should be installed to: either Trusted Root Store (true, the default option) or the Keychain (false). On environments other than Xcode 11.4+ Simulator this option is ignored. false

Returned Result

The content of the generated .mobileconfig file as base64-encoded string. This config might be useful for debugging purposes. If the certificate has been successfully set via CLI then nothing is returned.

mobile: removeCertificate

Removes installed certificate for real devices only if py-ios-device tool is available on the server machine since driver version 4.19.2.

Arguments

Name Type Required Description Example
name string yes Name of the profile com.orgname.profile.mdmprofile

Returned Result

Returns status acknowledgment {'Status': 'Acknowledged'} if successfully removed certificate or None if unable to remove certificate.

mobile: listCertificates

Lists installed certificates for real devices only if py-ios-device tool is available on the server machine since driver version 4.10.0.

Returned Result

Returns map of certificates installed on the real device. The response looks like:

{
    'OrderedIdentifiers': ['com.orgname.profile.mdmprofile'],
    'ProfileManifest': {
        'com.orgname.profile.mdmprofile': {
            'Description': 'MDM Profile',
            'IsActive': True
        }
    },
    'ProfileMetadata': {
        'com.orgname.profile.mdmprofile': {
            'PayloadDescription': 'MDM Profile for testing,
            'PayloadDisplayName': 'MDM Profile',
            'PayloadOrganization': 'My Org, Inc.',
            'PayloadRemovalDisallowed': False,
            'PayloadUUID': '9ab3fa27-cc45-4c23-a94a-714686397a86',
            'PayloadVersion': 1
        }
    },
    'Status': 'Acknowledged'
}

mobile: startLogsBroadcast

Starts iOS system logs broadcast websocket on the same host and port where Appium server is running at /ws/session/:sessionId:/appium/syslog endpoint. The method will return immediately if the web socket is already listening. Each connected webcoket listener will receive syslog lines as soon as they are visible to Appium. Read Using Mobile Execution Commands to Continuously Stream Device Logs with Appium Appium Pro article for more details on this feature.

mobile: stopLogsBroadcast

Stops the syslog broadcasting wesocket server previously started by mobile: startLogsBroadcast. This method will return immediately if no server is running.

mobile: batteryInfo

Reads the battery information from the device under test. This endpoint only returns reliable result on real devices.

Returned Result

The actual battery info map, which consists of the following entries:

  • level: Battery level in range [0.0, 1.0], where 1.0 means 100% charge.
  • state: Battery state as an integer number. The following values are possible:
  • UIDeviceBatteryStateUnknown = 0
  • UIDeviceBatteryStateUnplugged = 1 // on battery, discharging
  • UIDeviceBatteryStateCharging = 2 // plugged in, less than 100%
  • UIDeviceBatteryStateFull = 3 // plugged in, at 100%

mobile: deviceInfo

Returns the miscellaneous information about the device under test. It includes device information via lockdown in a real device since XCUITest driver 4.2.0.

Returned Result

The returned device information map contains the following entries:

Name Type Description Example
currentLocale string Device locale name. See autoupdatingCurrentLocale for more details. ja_EN, zh-Hant_US
timeZone string Device time zone name. See NSTimeZone documentation for more details. America/New_York
name string Device name, synonym for model. Prior to iOS 16, user-assigned device name. See UIDevice.name documentation for more details. iPhone
model string The model of the device. See UIDevice.model documentation for more details. iPod touch
uuid string Device identifier for vendor. Could be equal to unknown if cannot be retrieved. 12345abcd
userInterfaceIdiom number The style of the interface on the current device. Could help to determine the device type (e.g. iPhone vs iPad). See UIDevice.userInterfaceIdiom for more details. 0 (UIUserInterfaceIdiomUnspecified), 1 (UIUserInterfaceIdiomPhone), 2 (UIUserInterfaceIdiomPad), 3 (UIUserInterfaceIdiomTV)
userInterfaceStyle string The device's UI appearance style. Possible values are: automatic, light, dark, unknown. dark
isSimulator number Whether the device is a simulator (1) or a real device (0) 1
thermalState number Thermal state of the device. See NSProcessInfoThermalState documentation on possible values. 0 (NSProcessInfoThermalStateNominal), 1 (NSProcessInfoThermalStateFair), 2 (NSProcessInfoThermalStateSerious), 3 (NSProcessInfoThermalStateCritical)

mobile: getDeviceTime

Returns the actual device time.

Arguments

Name Type Required Description Example
format string no The format specifier string. Read MomentJS documentation 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-DD HH:mm:ss

Returned Result

The retrieved datetime string formatted according to the given format specfier.

mobile: activeAppInfo

Returns information about the active application.

Returned Result

The API returns a map with the following entries

Name Type Description Example
pid number The process identifier of the active application 1234
bundleId string The bundle identifier of the active application com.yolo.myapp
name string The name of the active application, if present Safari
processArguments map The map containing actual process arguments. Check the description of the appium:processArguments capability for more details on its format. Might be empty if no process arguments have been provided on the app startup. {"args": ["--help"], "env": {"PATH": "/"}}

mobile: pressButton

Emulates press action on the given physical device button. iOS is pressButton:, tvOS is pressButton: or pressButton:forDuration:. mobile: performIoHidEvent calls a more universal API to perform press with duration on any supported device.

Arguments

Name Type Required Description Example
name string yes The name of the button to be pressed. Supported button names for iOS-based devices are (case-insensitive): home, volumeup, volumedown. For tvOS-based devices (case-insensitive): home, up, down, left, right, menu, playpause, select home
durationSeconds number no Duration in float seconds for tvOS-based devices since Appium 1.22.0 10

mobile: pushNotification

Simulates push notification delivery to Simulator. Only application remote push notifications are supported. VoIP, Complication, File Provider, and other types are not supported. Check the output of xcrun simctl help push command for more details.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the target application com.apple.Preferences
payload map yes Valid Apple Push Notification values. Read the Create the JSON Payload topic of the official Apple documentation for more details on the payload creation. {"aps": {"alert": {"title": "This is a simulated notification!"}, "badge": 3, "sound": "default"} }

mobile: expectNotification

Blocks until the expected notification is delivered. It is a thin wrapper over XCTNSNotificationExpectation and XCTDarwinNotificationExpectation entities. The extension call throws TimeoutError if the expected notification has not been delivered within the given timeout.

Arguments

Name Type Required Description Example
name string yes The name of the notification to expect com.example.fooAllDone
type string no Which notification type to expect. Either plain (the default value) to wait for a notification from the default notification center or darwin to wait for a system notification. darwin
timeoutSeconds number no For how long to wait until the notification is delivered in float seconds. 60 seconds by default 5.5

mobile: performIoHidEvent

Emulates triggering of the given low-level IO HID device event. Constants for possible events are defined in HID Usage Tables. For example, in order to emulate single press on Home button the extension should be called with the following arguments: - page: 0x0C (kHIDPage_Consumer, select the Customer page) - usage: 0x40 (kHIDUsage_Csmr_Menu, the Csmr prefix here means this usage is dedicated to the Customer page) - durationSeconds: 0.005 (The event duration should be 5 milliseconds to be recognized as a single press by iOS)

Some popular constants:

Name Value Description
kHIDPage_Consumer 0x0C The page containing all usages prefixed with kHIDUsage_Csmr_
kHIDUsage_Csmr_VolumeIncrement 0xE9 Volume Up
kHIDUsage_Csmr_VolumeDecrement 0xEA Volume Down
kHIDUsage_Csmr_Menu 0x40 Home
kHIDUsage_Csmr_Power 0x30 Power/Lock
kHIDUsage_Csmr_Snapshot 0x65 Power + Home

Arguments

Name Type Required Description Example
page int yes The event page identifier. Look for constants perfixed with kHIDPage_ in the table above 0x0C
usage int yes The event usage identifier (usages are defined per-page). Look for constants prefixed with kHIDUsage_ in the table above 0x40
durationSeconds number yes The event duration in float seconds. XCTest uses 0.005 for a single press event duration 2.5

mobile: enrollBiometric

Enrolls biometric authentication on Simulator.

Arguments

Name Type Required Description Example
isEnabled boolean no Whether to enable/disable biometric enrollment. true by default. true

mobile: sendBiometricMatch

Emulates biometric match/non-match event on Simulator. The biometric feature is expected to be already enrolled before executing that.

Arguments

Name Type Required Description Example
type string no The biometric feature name. Either touchId or faceId. touchId by default. faceId
match boolean no Whether to simulate biometric match (true, the default value) or non-match (false). true

mobile: isBiometricEnrolled

Checks whether biometric is currently enrolled or not on a Simulator device.

Returned Result

Either true or false

mobile: clearKeychains

Clears keychains on Simulator. An exception is thrown for real devices.

mobile: getPermission

Gets application permission state on Simulator. This method requires WIX applesimutils to be installed on the host where Appium server is running.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the destination app. com.mycompany.myapp
service string yes One of available service names. The following services are supported: calendar, camera, contacts, homekit, microphone, photos, reminders, medialibrary, motion, health, siri, speech. true

Returned Result

Either 'yes', 'no', 'unset' or 'limited'

mobile: setPermission

Set application permission state on Simulator.

location and location-always services are by xcrun simctl privacy command since XCUITest driver version 5.11.0. The command will kill the bundleId application process if it is running.

Other services such as contacts are processed by WIX applesimutils, which will not kill the bundleId application process. WIX applesimutils needs to be installed on the host where Appium server is running.

Arguments

Name Type Required Description Example
bundleId string yes The bundle identifier of the destination app. com.mycompany.myapp
access map yes One or more access rules to set. The following keys are supported: all (Apply the action to all services), calendar (Allow access to calendar), contacts-limited (Allow access to basic contact info), contacts (Allow access to full contact details), location (Allow access to location services when app is in use), location-always (Allow access to location services at all times), photos-add (Allow adding photos to the photo library), photos (Allow full access to the photo library), media-library (Allow access to the media library), microphone (Allow access to audio input), motion (Allow access to motion and fitness data), reminders (Allow access to reminders), siri (Allow use of the app with Siri.). The following values are supported: yes (To grant the permission), no (To revoke the permission), unset (To reset the permission) {'all': 'yes'}

mobile: resetPermission

Resets the given permission for the active application under test. Works for both Simulator and real devices using Xcode SDK 11.4+

Arguments

Name Type Required Description Example
service string or int yes One of available service names. The supported service names are: calendar, camera, contacts, health, homekit, keyboardnet, location, medialibrary, microphone, photos, reminders, systemroot, userdesktop, userdocuments, userdownloads, bluetooth. This could also be an integer protected resource identifier taken from XCUIProtectedResource photos

mobile: getAppearance

Get the device's UI appearance style.

Returned Result

An object, with the following entries: - style: The device's UI appearance value. This could be one of: light, dark, unknown, unsupported

mobile: setAppearance

Set the device's UI appearance style.

Arguments

Name Type Required Description Example
style string yes Either light or dark dark

mobile: getClipboard

Gets the content of the primary clipboard on the device under test.

Arguments

Name Type Required Description Example
contentType string no plaintext (default), image or url image

Returned Result

The actual clipboard content encoded into base64 string. An empty string is returned if the clipboard contains no data.

mobile: setClipboard

Sets the primary clipboard's content on the device under test.

Arguments

Name Type Required Description Example
content string yes The content to be set as base64-encoded string. QXBwaXVt
contentType string no plaintext (default), image or url image

mobile: siriCommand

Presents the Siri UI, if it is not currently active, and accepts a string which is then processed as if it were recognized speech. Check the documentation on activateWithVoiceRecognitionText XCTest method for more details.

Arguments

Name Type Required Description Example
text string yes The actual command that will be passed to Siri service Hello Siri

mobile: pullFile

Pulls a remote file from the device.

Arguments

Name Type Required Description Example
remotePath string yes The path to an existing remote file on the device. See the File Transfer guide for accepted formats. If the file with the given name does not exist an exception will be thrown. @com.mycompany.myapp:documents/myfile.txt

Returned Result

Base64-encoded string, which represents the content of the remote file.

mobile: pushFile

Pushes a local file to the device.

Arguments

Name Type Required Description Example
remotePath string yes The path on the device to where the payload should be written. The value format is similar to the one used in pullFile extension. If the file with the same name already exists then it will be silently overridden. @com.mycompany.myapp:documents/myfile.txt
payload string yes Base64-encoded content of the file to be pushed. QXBwaXVt

mobile: pullFolder

Pulls a remote folder from the device.

Arguments

Name Type Required Description Example
remotePath string yes Same as for pullFile extension, but should be pointing to a remote folder @com.mycompany.myapp:documents/myfolder/

Returned Result

Base64-encoded string, which represents the zipped content of the remote folder.

mobile: deleteFile

Deletes the given file from the device under test.

Arguments

Name Type Required Description Example
remotePath string yes Same as for pullFile extension @com.mycompany.myapp:documents/myfile.txt

mobile: deleteFolder

Deletes the given folder from the device under test.

Arguments

Name Type Required Description Example
remotePath string yes Same value as for mobile: deleteFile except of the fact it should be pointing to a folder and should end with a single slash / @com.mycompany.myapp:documents/myfolder/

mobile: configureLocalization

Change localization settings on the currently booted Simulator. The changed settings are only applied for the newly started applications/activities. Currently running applications will stay unchanged. This means, for example, that the keyboard should be hidden and shown again in order to observe the changed layout, and corresponding apps must be restarted in order to observe their interface using the newly set locale/language. Also this method might leave some system UI alerts untranslated. Be careful while setting the actual arguments since their actual values are not strictly checked. This could lead to an unexpected behavior if an incorrect/unsupported language or locale abbreviation is provided.

Arguments

Name Type Required Description Example
keyboard map no On-screen keyboard properties. The name key is required and should be set to a valid locale abbreviation. The layout key is also required. The hardware key is optional and could be omitted or set to Automated. You could switch the keyboard layout in system preferences of your booted simulator, run xcrun simctl spawn booted defaults read .GlobalPreferences.plist, and inspect the value of AppleKeyboards to see possible combinations. {"name": "de_CH", "layout": "QWERTZ", "hardware": "Automated"}
language map no System language properties. The name key is required and should be set to a valid language abbreviation. You could switch the system language in preferences of your booted simulator, run xcrun simctl spawn booted defaults read .GlobalPreferences.plist, and inspect the value of AppleLanguages to see possible combinations. {"name": "zh-Hant-CN"}
locale map no System locale properties. The name key is required and should be set to a valid language abbreviation. The calendarkey is optonal and could be set to a valid calendar format name. You could switch the system locale/calendar format in preferences of your booted simulator, run xcrun simctl spawn booted defaults read .GlobalPreferences.plist, and inspect the value of AppleLocale to see possible combinations. {"name": "uk_UA", "calendar": "gregorian"}

Returned Result

true if any of settings has been successfully changed.

mobile: startAudioRecording

Records the given hardware audio input into an .mp4 file. You must allow the audio_record security feature in order to use this extension. Also it is required that FFMpeg is installed on the machibe where Appium server is running.

Arguments

Name Type Required Description Example
audioInput string or int yes The name of the corresponding audio input device to use for the capture. The full list of capture devices could be shown using ffmpeg -f avfoundation -list_devices true -i "" Terminal command. 1
audioCodec string no The name of the audio codec. The Advanced Audio Codec (aac) is used by default. aac
audioBitrate string no The bitrate of the resulting audio stream. 128k by default. 256k
audioChannels string or int no The count of audio channels in the resulting stream. Setting it to 1 will create a single channel (mono) audio stream. 2 By default 1
audioRate string or int no The sampling rate of the resulting audio stream. 44100 by default 22050
timeLimit string or int no The maximum recording time, in seconds. The default value is 180, the maximum value is 43200 (12 hours). 60
forceRestart boolean no Whether to restart audio capture process forcefully when startRecordingAudio is called (true) or ignore the call until the current audio recording is completed (false, the default value). true

mobile: stopAudioRecording

Stops recording of the audio input. If no audio recording process is running then the endpoint will try to get the recently recorded file. If no previously recorded file is found and no active audio recording processes are running then the method returns an empty string.

Returned Result

Base64-encoded content of the recorded media file or an empty string if no audio recording has been started before.

mobile: startPcap

Start mobile device network traffic capture. This extension only works if py-ios-device utility is installed on the server machine and only supports real iOS devices.

Arguments

Name Type Required Description Example
timeLimitSec string or int no The maximum recording time, in seconds. The default value is 180, the maximum value is 43200 (12 hours). 60
forceRestart boolean no Whether to restart traffic capture process forcefully when startPcap is called (true) or ignore the call until the current traffic capture is completed (false, the default value). true

mobile: stopPcap

Stops network traffic capture. If no traffic capture process is running then the endpoint will try to get the recently recorded file. If no previously recorded file is found and no active traffic capture processes are running then the method returns an empty string.

Returned Result

Base64-encoded content of the traffic capture file (.pcap) or an empty string if no traffic capture has been started before. Netowrk capture files could be opened in Wireshark application.

mobile: runXCTest

Run a native XCTest script. Launches a subprocess that runs the XC Test and blocks until it is completed. Parses the stdout of the process and returns its result as an array. Facebook's IDB tool is required to run such tests.

Arguments

Name Type Required Description Example
testRunnerBundleId string yes Test app bundle io.appium.XCTesterAppUITests.xctrunner
appUnderTestBundleId string yes App-under-test bundle com.mycompany.myapp
xcTestBundleID string yes xctest bundle id io.appium.XCTesterAppUITests
testType string no Test type. Either ui (the default one), app or logic app
env map no Environment variables mapping to be passed to the test {'myvar': 'myvalue'}
args array no Launch arguments to start the test with (see https://developer.apple.com/documentation/xctest/xcuiapplication/1500477-launcharguments for reference) ['-arg1', '--arg2']
timeout string or int no Timeout if session doesn't complete after given time (in milliseconds). 360000ms by default 120000

Returned Result

The API calls returns a map with the following entries:

  • results: The array of test results. Each item in this array conists of the following entries:
  • testName: Name of the test (e.g.: 'XCTesterAppUITests - XCTesterAppUITests.XCTesterAppUITests/testExample')
  • passed: Did the tests pass?
  • crashed: Did the tests crash?
  • status: Test result status (e.g.: 'passed', 'failed', 'crashed')
  • duration: How long did the tests take (in seconds)
  • failureMessage: Failure message (if applicable)
  • location The geolocation of the test (if applicable)
  • code: The exit code of the process. 0 value marks a successful execution.
  • signal: The signal that terminated the process. Could be null (e.g.: SIGTERM)

mobile: installXCTestBundle

Installs an XCTest bundle to the device under test. Facebook's IDB tool is required to for this API to work.

Arguments

Name Type Required Description Example
xctestBundle string yes Path to your xctest .app bundle. Could be an URL /path/to/my/bundle.app

mobile: listXCTestBundles

List XCTest bundles that are installed on device. Facebook's IDB tool is required to for this API to work.

Returned Result

Array of XCTest bundles (e.g.: ["XCTesterAppUITests.XCTesterAppUITests/testLaunchPerformance"])

mobile: listXCTestsInTestBundle

List XCTests in a test bundle. Facebook's IDB tool is required to for this API to work.

Arguments

Name Type Required Description Example
bundle string yes Bundle ID of the XCTest 'com.bundle.myapp'

Returned Result

Array of xctests in the test bundle (e.g.: [ 'XCTesterAppUITests.XCTesterAppUITests/testExample', 'XCTesterAppUITests.XCTesterAppUITests/testLaunchPerformance' ])

mobile: viewportRect

Retrieves the viewport dimensions. The viewport is the device's screen size with status bar size subtracted if the latter is present/visible.

Returned Result

The response looks like {"value":{"left":0,"top":96,"width":828,"height":1696}}.

left and top are distance from the left of the screen and the top of the screen. iOS Drawing Concepts could help about the relationship of coordinate.

width and height are the screen's width and height.

mobile: viewportScreenshot

Takes a screenshot of the device viewport (see mobile: viewportRect)

Unreliable

This method is unreliable. We recommend using getScreenshot instead

Returned Result

Base64-encoded string, which represents the viewport screenshot.

mobile: deviceScreenInfo

Get information about screen.

Returned Result

The response looks like {"value":{"statusBarSize":{"width":414,"height":48},"scale":2}}

statusBarSize contains status bar dimensions. It is the result of status bar. scale is screen scale.

mobile: swipe

This gesture performs a simple "swipe" gesture on the particular screen element or on the application element, which is usually the whole screen. This method does not accept coordinates and simply emulates single swipe with one finger. It might be useful for such cases like album pagination, switching views, etc. More advanced cases may require to call mobile: dragFromToForDuration, where one can supply coordinates and duration.

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no The internal element identifier (as hexadecimal hash string) to swipe on. Application element will be used instead if this argument is not provided fe50b60b-916d-420b-8728-ee2072ec53eb
direction Either 'up', 'down', 'left' or 'right' yes The direction in which to swipe up
velocity number no This argument is optional and is only supported since Appium server version 1.19 and Xcode SDK version 11.4+. The value is measured in pixels per second and same values could behave differently on different devices depending on their display density. Higher values make swipe gesture faster (which usually scrolls larger areas if we apply it to a list) and lower values slow it down. Only values greater than zero have effect. 250

Examples

RemoteWebElement e = driver.findElement(AppiumBy.accessibilityId("target element"));
driver.executeScript("mobile: swipe", ImmutableMap.of(
    "velocity": 2500,
    "direction": "down",
    "elementId", e.getId()
));

```js const e = await $('~target element'); await driver.executeScript("mobile: swipe", [{ velocity: 2500, direction: "down", elementId: e.elementId }]);

e = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='target element')
driver.execute_script("mobile: swipe", {
  "velocity": 2500,
  "direction": "down",
  "elementId": e.id
})
e = driver.find_element :accessibility_id, 'target element'
driver.execute_script 'mobile: swipe', {
  velocity: 2500,
  direction: 'down',
  elementId: e.ref
}
var e = driver.FindElement(By.AccessibilityId("target element"))
driver.ExecuteScript("mobile: swipe", new Dictionary<string, object>() {
    {"elementId", element.Id},
    {"direction", "down" },
    {"velocity", 2500 }
});

References

mobile: scroll

Scrolls the element or the whole screen. Different scrolling strategies are supported. Arguments define the choosen strategy: either 'name', 'direction', 'predicateString' or 'toVisible' in that order. All strategies are exclusive and only one strategy can be applied at a single moment of time. Use "mobile: scroll" to emulate precise scrolling in tables or collection views, where it is already known to which element the scrolling should be performed. Although, there is one known limitation there: in case it is necessary to perform too many scroll gestures on parent container to reach the necessary child element (tens of them) then the method call may fail. Important: The implemntation of this extension relies on several undocumented XCTest features, which might not always be reliable. Thus it might not always work as expected.

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no The internal element identifier (as hexadecimal hash string) to scroll on (e.g. the container). The active application element will be used instead if this parameter is not provided. fe50b60b-916d-420b-8728-ee2072ec53eb
name string no The accessibility id of the child element, to which scrolling is performed. The same result can be achieved by setting predicateString argument to 'name == accessibilityId'. Has no effect if elementId is not a container cell12
direction Either 'up', 'down', 'left' or 'right' yes The main difference from swipe call with the same argument is that scroll will try to move the current viewport exactly to the next/previous page (the term "page" means the content, which fits into a single device screen) down
predicateString string no The NSPredicate locator of the child element, to which the scrolling should be performed. Has no effect if elementId is not a container label == "foo"
toVisible boolean no If set to true then asks to scroll to the first visible elementId in the parent container. Has no effect if elementId is not set true

Examples

driver.executeScript("mobile: scroll", ImmutableMap.of(
    "direction", "down"
));

```js await driver.executeScript('mobile: scroll', [{ direction: 'down' }]);

driver.execute_script("mobile: scroll", {
  "direction": "down"
})
driver.execute_script 'mobile: scroll', {
  direction: 'down'
}
driver.ExecuteScript("mobile: scroll", new Dictionary<string, object>() {
    {"direction", "down"}
});

mobile: pinch

Performs pinch gesture on the given element or on the application element.

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no The internal element identifier (as hexadecimal hash string) to pinch on. The active application element will be used instead if this parameter is not provided. fe50b60b-916d-420b-8728-ee2072ec53eb
scale number yes Pinch scale of type float. Use a scale between 0 and 1 to "pinch close" or zoom out and a scale greater than 1 to "pinch open" or zoom in. 0.5
velocity number yes The velocity of the pinch in scale factor per second (float value) 2.2

Examples

RemoteWebElement e = driver.findElement(AppiumBy.accessibilityId("target element"));
driver.executeScript("mobile: pinch", ImmutableMap.of(
    "scale", 0.5,
    "velocity", 1.1,
    "elementId", e.getId()
));

```js const e = await $('~target element'); await driver.executeScript('mobile: pinch', [{ scale: 0.5, velocity: 1.1, elementId: e.elementId }]);

e = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='target element')
driver.execute_script("mobile: pinch", {
  "scale": 0.5,
  "velocity": 1.1,
  "elementId": e.id
})
e = driver.find_element :accessibility_id, 'target element'
driver.execute_script 'mobile: pinch', {
  scale: 0.5,
  velocity: 1.1,
  elementId: e.ref
}
var e = driver.FindElement(By.AccessibilityId("target element"))
driver.ExecuteScript("mobile: pinch", new Dictionary<string, object>() {
    {"elementId", element.Id},
    {"scale", 0.5 },
    {"velocity", 1.1 },
});

Reference

pinchWithScale:velocity:

mobile: doubleTap

Performs double tap gesture on the given element or on the screen.

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no The internal element identifier (as hexadecimal hash string) to double tap on. The active application element will be used instead if this parameter is not provided. fe50b60b-916d-420b-8728-ee2072ec53eb
x number no Horizontal coordinate offset. 100
y number no Vertical coordinate offset. 100

Examples

RemoteWebElement e = driver.findElement(AppiumBy.accessibilityId("target element"));
driver.executeScript("mobile: doubleTap", ImmutableMap.of(
    "elementId", e.getId()
));

```js const e = await $('~target element'); await driver.executeScript('mobile: doubleTap', [{ elementId: e.elementId }]);

e = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='target element')
driver.execute_script("mobile: doubleTap", {
  "elementId": e.id
})
e = driver.find_element :accessibility_id, 'target element'
driver.execute_script 'mobile: doubleTap', {
  elementId: e.ref
}
var e = driver.FindElement(By.AccessibilityId("target element"))
driver.ExecuteScript("mobile: doubleTap", new Dictionary<string, object>() {
    {"elementId", element.Id}
});

mobile: touchAndHold

Performs long press gesture on the given element or on the screen.

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no The internal element identifier (as hexadecimal hash string) to long tap on. The active application element will be used instead if this parameter is not provided. fe50b60b-916d-420b-8728-ee2072ec53eb
duration number yes The float duration of press action in seconds 1.5
x number no Horizontal coordinate offset. 100
y number no Vertical coordinate offset. 100

Examples

RemoteWebElement e = driver.findElement(AppiumBy.accessibilityId("target element"));
driver.executeScript("mobile: touchAndHold", ImmutableMap.of(
    "elementId", e.getId(),
    "duration", 2.0
));

```js const e = await $('~target element'); await driver.executeScript('mobile: touchAndHold', [{ elementId: e.elementId, duration: 2.0 }]);

e = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='target element')
driver.execute_script("mobile: touchAndHold", {
  "elementId": e.id,
  "duration": 2.0
})
e = driver.find_element :accessibility_id, 'target element'
driver.execute_script 'mobile: touchAndHold', {
  elementId: e.ref,
  duration: 2.0
}
var e = driver.FindElement(By.AccessibilityId("target element"))
driver.ExecuteScript("mobile: touchAndHold", new Dictionary<string, object>() {
    {"elementId", element.Id},
    {"duration", 2.0}
});

Reference

pressForDuration:

mobile: twoFingerTap

Performs two finger tap gesture on the given element or on the application element.

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no The internal element identifier (as hexadecimal hash string) to tap on. The active application element will be used instead if this parameter is not provided. fe50b60b-916d-420b-8728-ee2072ec53eb

Examples

RemoteWebElement e = driver.findElement(AppiumBy.accessibilityId("target element"));
driver.executeScript("mobile: twoFingerTap", ImmutableMap.of(
    "elementId", e.getId()
));

```js const e = await $('~target element'); await driver.executeScript('mobile: twoFingerTap', [{ elementId: e.elementId }]);

e = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='target element')
driver.execute_script("mobile: twoFingerTap", {
  "elementId": e.id
})
e = driver.find_element :accessibility_id, 'target element'
driver.execute_script 'mobile: twoFingerTap', {
  elementId: e.ref
}
var e = driver.FindElement(By.AccessibilityId("target element"))
driver.ExecuteScript("mobile: twoFingerTap", new Dictionary<string, object>() {
    {"elementId", element.Id}
});

Reference

twoFingerTap

mobile: tap

Performs tap gesture by coordinates on the given element or on the screen.

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no The internal element identifier (as hexadecimal hash string) to tap on. x and y tap coordinates will be calculated relatively to the current element position on the screen if this argument is provided. Otherwise they should be calculated relatively to the active application element. fe50b60b-916d-420b-8728-ee2072ec53eb
x number yes Horizontal coordinate offset. 100
y number yes Vertical coordinate offset. 100

mobile: dragFromToForDuration

Performs drag and drop gesture by coordinates. This can be done either on an element or on the screen

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no The internal element identifier (as hexadecimal hash string) to perform drag on. All the coordinates will be calculated relatively this this element position on the screen. Absolute screen coordinates are expected if this argument is not set fe50b60b-916d-420b-8728-ee2072ec53eb
duration number yes Float number of seconds in range [0.5, 60]. How long the tap gesture at starting drag point should be before to start dragging 5.3
fromX number yes The x coordinate of starting drag point 100
fromY number yes The y coordinate of starting drag point 100
toX number yes The x coordinate of ending drag point 200
toY number yes The y coordinate of ending drag point 200

Examples

RemoteWebElement e = driver.findElement(AppiumBy.accessibilityId("target element"));
driver.executeScript("mobile: dragFromToForDuration", ImmutableMap.of(
    "elementId", e.getId(),
    "duration", 1.0,
    "fromX", 100,
    "fromY", 100,
    "toX", 200,
    "toY", 200
));

```js const e = await $('~target element'); await driver.executeScript('mobile: dragFromToForDuration', [{ elementId: e.elementId, duration: 1.0, fromX: 100, fromY: 100, toX: 200, toY: 200 }]);

e = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='target element')
driver.execute_script("mobile: dragFromToForDuration", {
  "elementId": e.id,
  "duration": 1.0,
  "fromX": 100,
  "fromY": 100,
  "toX": 200,
  "toY": 200
})
e = driver.find_element :accessibility_id, 'target element'
driver.execute_script 'mobile: dragFromToForDuration', {
  elementId: e.ref,
  duration: 1.0,
  fromX: 100,
  fromY: 100,
  toX: 200,
  toY: 200
}
var e = driver.FindElement(By.AccessibilityId("target element"))
driver.ExecuteScript("mobile: dragFromToForDuration", new Dictionary<string, object>() {
    {"elementId", element.Id},
    {"duration", 1.0,}
    {"fromX", 100},
    {"fromY", 100},
    {"toX", 200},
    {"toY", 200}
});

Reference

clickForDuration:thenDragToElement:

mobile: dragFromToWithVelocity

Initiates a press-and-hold gesture, drags to another coordinate or an element with a velocity you specify, and holds for a duration you specify.

Arguments

Name Type Required Description Example
fromElementId string no The internal element identifier (as hexadecimal hash string) to start the drag gesture from. Absolute screen coordinates are expected if this argument is not set fe50b60b-916d-420b-8728-ee2072ec53eb
toElementId string no The internal element identifier (as hexadecimal hash string) to end the drag gesture on. This parameter is mandatory if fromElementId is provided fe50b60b-916d-420b-8728-ee2072ec53eb
pressDuration number yes Float number of seconds in range [0, 60]. How long the tap gesture at starting drag point should be before to start dragging 0.5
holdDuration number yes Float number of seconds in range [0, 60]. The duration for which to hold over the other coordinate or the given element after dragging 0.1
velocity number yes The speed at which to move from the initial press position to the other element or coordinate, expressed in pixels per second 400
fromX number no The x coordinate of starting drag point. Must be provided if fromElementId is not defined 100
fromY number no The y coordinate of starting drag point. Must be provided if fromElementId is not defined 100
toX number no The x coordinate of ending drag point. Must be provided if fromElementId is not defined 200
toY number no The y coordinate of ending drag point. Must be provided if fromElementId is not defined 200

References

pressForDuration:thenDragToElement:withVelocity:thenHoldForDuration: pressForDuration:thenDragToCoordinate:withVelocity:thenHoldForDuration:

mobile: rotateElement

Performs rotate gesture on the given element.

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no Internal element id (as hexadecimal hash string) to perform rotation on. The active application element will be used instead if this parameter is not provided. fe50b60b-916d-420b-8728-ee2072ec53eb
rotation number yes The rotation of the gesture in radians Math.PI
velocity number yes The velocity of the rotation gesture in radians per second Math.PI / 4

Examples

RemoteWebElement e = driver.findElement(AppiumBy.accessibilityId("target element"));
driver.executeScript("mobile: rotateElement", ImmutableMap.of(
    // rotate clockwise, 90 degrees
    "rotation", -Math.PI / 2,
    // in approximately two seconds
    "velocity", Math.PI / 4,
    "elementId", e.getId()
));
const e = await $('~target element');
await driver.executeScript('mobile: rotateElement', [{
  rotation: -Math.PI / 2,
  velocity: Math.PI / 4,
  elementId: e.elementId
}]);
e = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='target element')
driver.execute_script("mobile: rotateElement", {
  "rotation": -math.pi / 2,
  "velocity": math.pi / 4,
  "elementId": e.id
})
e = driver.find_element :accessibility_id, 'target element'
driver.execute_script 'mobile: rotateElement', {
  elementId: e.ref,
  rotation: PI / 2,
  velocity: PI / 4
}
var e = driver.FindElement(By.AccessibilityId("target element"))
driver.ExecuteScript("mobile: rotateElement", new Dictionary<string, object>() {
    {"elementId", element.Id},
    {"rotation", -Math.PI / 2 },
    {"velocity", Math.PI / 4 },
});

Reference

rotate:withVelocity:

mobile: tapWithNumberOfTaps

Sends one or more taps with one or more touch points since Appium 1.17.1.

Arguments

Name Type Required Description Example
elementId ("element" prior to Appium v 1.22) string no The internal element identifier (as hexadecimal hash string) to perform one or more taps. The active application element will be used instead if this parameter is not provided. fe50b60b-916d-420b-8728-ee2072ec53eb
numberOfTaps number no The number of taps. 1 by default 2
numberOfTouches number no The number of touch points. 1 by default 2

Examples

RemoteWebElement e = driver.findElement(AppiumBy.accessibilityId("target element"));
var result = driver.executeScript("mobile: tapWithNumberOfTaps", Map.of(
    "elementId", e.getId(),
    "numberOfTaps", 2,
    "numberOfTouches", 1,
));
const e = await $('~target element');
await driver.executeScript('mobile: tapWithNumberOfTaps', [{
  elementId: e.elementId,
  numberOfTaps: 2,
  numberOfTouches: 1
}]);
e = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='target element')
driver.execute_script("mobile: tapWithNumberOfTaps", {
  "elementId": e.id,
  "numberOfTaps": 2,
  "numberOfTouches": 1
})
e = driver.find_element :accessibility_id, 'target element'
driver.execute_script 'mobile: tapWithNumberOfTaps', {
  elementId: e.ref,
  numberOfTaps: 2,
  numberOfTouches: 1
}
var e = driver.FindElement(By.AccessibilityId("target element"))
driver.ExecuteScript("mobile: touchAndHold", new Dictionary<string, object>() {
    {"elementId", element.Id},
    {"numberOfTaps", 2 },
    {"numberOfTouches", 1 },
});
  • numberOfTaps=1, numberOfTouches=1 -> "vanilla" single tap
  • numberOfTaps=2, numberOfTouches=1 -> double tap
  • numberOfTaps=3, numberOfTouches=1 -> tripple tap
  • numberOfTaps=2, numberOfTouches=2 -> double tap with two fingers

Reference

tapWithNumberOfTaps:numberOfTouches:

mobile: forcePress

Emulates force press on the given element/coordinates. An error is thrown if the target device does not support force press gesture.

Arguments

Name Type Required Description Example
elementId string no The internal element identifier (as hexadecimal hash string) to perform one or more taps. It is expected that both x and y are provided if this argument is ommitted. If the element identifier is provided without coordinates then the actual element's touch point will be calculated automatically by WebDriverAgent. fe50b60b-916d-420b-8728-ee2072ec53eb
x number no x coordinate of the gesture. It is calculated relatively to the given element (if provided). Otherwise the gesture destination point is calculated relatively to the active application. 100
y number no y coordinate of the gesture. It is calculated relatively to the given element (if provided). Otherwise the gesture destination point is calculated relatively to the active application 100
duration number no The float number of seconds the force press action would take. If duration is provided then it is also expected that a custom pressure value is provided as well. 0.5 by default. 2.5
pressure number no The float number defining how much pressure to apply. If pressure is provided then it is also expected that a custom duration value is provided as well. 1.0 by default 1.5

mobile: scrollToElement

Scrolls the current viewport to the given element. It is expected the destination element is inside a scrollable container and is hittable. The scroll direction is detected automatically. This API uses native XCTest calls, so it performs scrolling pretty fast. The same native call is implicitly performed by a vanilla click API if the destination element is out of the current viewport. An exception is thrown if the scrolling action cannot be performed. This extension is available since the driver version 4.7.0.

Arguments

Name Type Required Description Example
elementId string yes The internal element identifier (as hexadecimal hash string) to scroll to. The destination element must be located in a scrollable container and must be hittable. If the element is already present in the current viewport then no action is performed. fe50b60b-916d-420b-8728-ee2072ec53eb

mobile: resetLocationService

Reset the location service on real device since Appium 1.22.0. It could delay a few seconds to reflect the location by the system. It raises an error if the device is simulator or an error occurred during the reset.

mobile: enableConditionInducer

Important: Device conditions are available for real devices running iOS 13.0 and later.

This API is going to throw an error if it is called while another condition inducer has been already enabled and is not explicitly disabled.

mobile: enableConditionInducer
mobile: disableConditionInducer
mobile: listConditionInducers

The above three extensions are available since the driver version 4.9.0.

You can create a condition on a connected device to test your app under adverse conditions, such as poor network connectivity or thermal constraints.

When you start a device condition, the operating system on the device behaves as if its environment has changed. The device condition remains active until you stop the device condition or disconnect the device. For example, you can start a device condition, run your app, monitor your app’s energy usage, and then stop the condition.

Reference: Test under adverse device conditions (iOS)

Name Type Required Description Example
conditionID string yes Get the conditionID parameter through the command mobile: availableConditionInducer SlowNetworkCondition
profileID string yes Get the profileID parameter through the command mobile: availableConditionInducer SlowNetwork100PctLoss

Returned Result

Either true or false, where true means enabling of the condition inducer has been successful

mobile: listConditionInducers

Get all condition inducer configuration profiles

Returned Result

The response looks like

[{
    "profiles": [
        {
            "name": "100% packet loss",
            "identifier": "SlowNetwork100PctLoss",   // enableConditionInducer profileID
            "description": "Name: 100% Loss Scenario
                            Downlink Bandwidth: 0 Mbps
                            Downlink Latency: 0 ms
                            Downlink Packet Loss Ratio: 100%
                            Uplink Bandwidth: 0 Mbps
                            Uplink Latency: 0 ms
                            Uplink Packet Loss Ratio: 100%"
        },
    ],
    "profilesSorted": true,
    "identifier": "SlowNetworkCondition",   // enableConditionInducer conditionID
    "isDestructive": false,
    "isInternal": false,
    "activeProfile": "",
    "name": "Network Link",
    "isActive": false
}]

mobile: disableConditionInducer

Disable device condition inducer.

Usually a persistent connection is maintained after enable the condition inducer, and this method is only valid for this connection.

If the connection is disconnected, condition inducer will be automatically disabled

Returned Result

Either true or false, where true means disabling of the condition inducer has been successful

mobile: calibrateWebToRealCoordinatesTranslation

Calibrates web to real coordinates translation. This API can only be called from Safari web context. It must load a custom page to the browser, and then restore the original one, so don't call it if you can potentially lose the current web app state. The outcome of this API is then used if nativeWebTap capability/setting is enabled. The returned value could also be used to manually transform web coordinates to real device ones in client scripts.

It is adviced to call this API at least once before changing the device orientation or device screen layout as the recetly received value is cached for the session lifetime and may become obsolete.

It is advised to enable nativeWebTapStrict capability/setting to speed up dynamic coordinates transformation if you use this extension.

Returned Result

An object with three properties used to properly shift Safari web element coordinates into native context: - offsetX: Webview X offset in real coordinates - offsetY: Webview Y offset in real coordinates - pixelRatioX: Webview X pixel ratio - pixelRatioY: Webview Y pixel ratio

The following formulas are used for coordinates translation: RealX = offsetX + webviewX * pixelRatioX RealY = offsetY + webviewY * pixelRatioY

mobile: updateSafariPreferences

Updates preferences of Mobile Safari on Simulator

Arguments

Name Type Required Description Example
preferences map yes An object containing Mobile Safari preferences to be updated. The list of available setting names and their values could be retrieved by changing the corresponding Safari settings under Preferences->Safari and then inspecting Library/Preferences/com.apple.mobilesafari.plist file inside of com.apple.mobilesafari app container. The full path to the Mobile Safari's container could be retrieved from xcrun simctl get_app_container <sim_udid> com.apple.mobilesafari data command output. Use the xcrun simctl spawn <sim_udid> defaults read <path_to_plist> command to print the actual .plist content to the Terminal. { ShowTabBar: 0, WarnAboutFraudulentWebsites: 0 }

Opens the given URL with the default or the given application. This functionality is only available since xcuitest driver version 4.17. Xcode must be at version 14.3+ and iOS must be at version 16.4+.

Arguments

Name Type Required Description Example
url string yes The URL to be opened. This parameter is manadatory. https://apple.com, myscheme:yolo
bundleId string no The bundle identifier of an application to open the given url with. If not provided then the default application for the given url scheme is going to be used. com.myapp.yolo

mobile: getSimulatedLocation

Retrieves simulated geolocation value. This functionality is only available since xcuitest driver version 4.18. Xcode must be at version 14.3+ and iOS must be at version 16.4+.

Returned Result

This API returns a map with the following entries:

Name Type Description Example
latitude number Measurement of distance north or south of the Equator. null if mobile: setSimulatedLocation has not been called before or the simulated geolocation has been reset by mobile: resetSimulatedLocation. 50.08546
longitude number Measurement of distance east or west of the prime meridian. null if mobile: setSimulatedLocation has not been called before or the simulated geolocation has been reset by mobile: resetSimulatedLocation. -20.12345

mobile: setSimulatedLocation

Sets simulated geolocation value. This functionality is only available since xcuitest driver version 4.18. Xcode must be at version 14.3+ and iOS must be at version 16.4+.

It is recommended for iOS 17+ real devices to simulate the device location.

Arguments

Name Type Required Description Example
latitude number yes Measurement of distance north or south of the Equator. 50.08546
longitude number yes Measurement of distance east or west of the prime meridian. -20.12345

mobile: resetSimulatedLocation

Resets the previously set simulated geolocation value. This functionality is only available since xcuitest driver version 4.18. Xcode must be at version 14.3+ and iOS must be at version 16.4+.

Warning Do not forget to reset the simulated geolocation value after your automated test is finished. If the value is not reset explicitly then the simulated one will remain until the next device restart.

mobile: getAppStrings

Retrieves string resources for the given app language. An error is thrown if strings cannot be fetched or no strings exist for the given language abbreviation

Arguments

Name Type Required Description Example
language string no The language abbreviation to fetch app strings mapping for. If no language is provided then strings for the 'en language would be returned fr
stringFile string no Relative path to the corresponding .strings file starting from the corresponding .lproj folder base/main.strings

Returned Result

App strings map, where keys are resource identifiers.

mobile: hideKeyboard

Tries to hide the on-screen keyboard. Throws an exception if the keyboard cannot be hidden. On non-tablet devices the keyboard might not have an explicit button to hide it. In such case this API won't work and the only way to close the keyboard would be to simulate the same action an app user would do to close it. For example, swipe from top to bottom or tap the screen somewhere at the area not covered by the keyboard.

Arguments

Name Type Required Description Example
keys string[] no One or more keyboard key names used to close/hide it. On tablet's such button is usually called 'done'.

mobile: isKeyboardShown

Checks if the system on-screen keyboard is visible.

Returned Result

true if the keyboard is visible

mobile: keys

Send keys to the given element or to the application under test. This API is only supported since Xcode 15/iOS 17. It is not supported on tvOS. The API only works on iPad. On iOS calling it has no effect.

Arguments

Name Type Required Description Example
elementId string no Unique identifier of the element to send the keys to. If unset then keys are sent to the current application under test. 21045BC8-013C-43BD-9B1E-4C6DC7AB0744
keys array yes Array of keys to type. Each item could either be a string, that represents a key itself (see the official documentation on XCUIElement's typeKey:modifierFlags: method and on XCUIKeyboardKey constants) or a dictionary with key and modifierFlags entries, if the key should also be entered with modifiers. ['h', 'i'] or [{key: 'h', modifierFlags: 1 << 1}, {key: 'i', modifierFlags: 1 << 2}] or ['XCUIKeyboardKeyEscape']

Note

The modifierFlags argument is of unsigned long type and defines the bitmask with depressed modifier keys for the given key. XCTest defines the following possible bitmasks for modifier keys:

typedef NS_OPTIONS(NSUInteger, XCUIKeyModifierFlags) {
   XCUIKeyModifierNone       = 0,
   XCUIKeyModifierCapsLock   = (1UL << 0),
   XCUIKeyModifierShift      = (1UL << 1),
   XCUIKeyModifierControl    = (1UL << 2),
   XCUIKeyModifierOption     = (1UL << 3),
   XCUIKeyModifierCommand    = (1UL << 4),
   XCUIKeyModifierFunction   = (1UL << 5),
   // These values align with UIKeyModifierFlags and CGEventFlags.
   XCUIKeyModifierAlphaShift = XCUIKeyModifierCapsLock,
   XCUIKeyModifierAlternate  = XCUIKeyModifierOption,
};

So, for example, if you want Ctrl and Shift to be depressed while entering your key then modifierFlags should be set to (1 << 1) | (1 << 2), where the first constant defines XCUIKeyModifierShift and the seconds one - XCUIKeyModifierControl. We apply the bitwise or (|) operator between them to raise both bitflags in the resulting value. The left bitshift (<<) operator defines the binary bitmask for the given modifier key. You may combine more keys using the same approach.

mobile: lock

Lock the device (and optionally unlock it after a certain amount of time). Only simple (e.g. without a password) locks are supported.

Arguments

Name Type Required Description Example
seconds number string no The number of seconds after which to unlock the device. Set to 0 or leave it empty to require manual unlock (e.g. do not block and automatically unlock afterwards).

mobile: unlock

Unlocks the previously locked device. Only simple (e.g. without a password) locks are supported.

mobile: isLocked

Determine whether the device is locked.

Returned Result

Either true or false

mobile: shake

Shakes the device. This functionality is only supported on simulators.

mobile: backgroundApp

Puts the app to the background and waits the given number of seconds. Then restores the app if necessary. The call is blocking.

Arguments

Name Type Required Description Example
seconds number no The amount of seconds to wait between putting the app to background and restoring it. Any negative value means to not restore the app after putting it to background (the default behavior). 5

mobile: performAccessibilityAudit

Performs accessbility audit of the current application according to the given type or multiple types. Wraps the XCTest's performAccessibilityAuditWithAuditTypes API. Only available since Xcode 15/iOS 17.

Arguments

Name Type Required Description Example
auditTypes string[] no One or more type names to perform the audit for. The full list of available names could be found in the official XCTest API documentation. If no type if provided explicitly then XCUIAccessibilityAuditTypeAll is assumed. ['XCUIAccessibilityAuditTypeContrast', 'XCUIAccessibilityAuditTypeElementDetection']

Returned Result

List of found issues or an empty list. Each list item is a map consisting of the following items:

Name Type Description Example
detailedDescription string The detailed description of the found accessbility issue. Some longer issue description
compactDescription string The compact description of the found accessbility issue. Some compact issue description
auditType string or number The name of the audit type this issue belongs to. Could be a number if the type name is unknown. 'XCUIAccessibilityAuditTypeContrast'
element string The description of the element this issue was found for. 'Yes' button
elementDescription string The debug description of the element this issue was found for. Availble since driver version A long string describing the element itself and its position in the page tree hierarchy
elementAttributes dict JSON object containing various attributes of the element. See the example below
"elementAttributes":{
    "isEnabled":"1",
    "isVisible":"1",
    "isAccessible":"0",
    "frame":"{{129, 65}, {135, 18}}",
    "isFocused":"0",
    "rect":{
        "y":65,
        "x":129,
        "width":135,
        "height":18
    },
    "value":"Some Button",
    "label":"Some Button",
    "type":"StaticText",
    "name":"Some Button",
    "rawIdentifier":null
}

mobile: startXCTestScreenRecording

Start a new screen recording via XCTest.

Since this feature is based on the native implementation provided by Apple it provides the best quality for the least perfomance penalty in comparison to alternative implementations.

Even though the feature is available for real devices there is no possibility to delete video files stored on the device yet, which may lead to internal storage overload. That is why it was put under the xctest_screen_record security feature flag if executed from a real device test.

If the screen recording is already running this API is a noop.

The feature is only available since Xcode 15/iOS 17.

Arguments

Name Type Required Description Example
fps number no The Frames Per Second value for the resulting video. Providing higher values will create video files that are greater in size, but with smoother transitions. It is highly recommeneded to keep this value is range 1-60. 24 by default 60

Returned Result

The API response consists of the following entries:

Name Type Description Example
uuid string Unique identifier of the video being recorded 1D988774-C7E2-4817-829D-3B835DDAA7DF
fps numner FPS value 24
codec number The magic for the used codec. Value of zero means h264 video codec is being used 0
startedAt number The timestamp when the screen recording has started in float seconds since Unix epoch 1709826124.123

mobile: getXCTestScreenRecordingInfo

Retrieves information about the current running screen recording. If no screen recording is running then null is returned.

Returned Result

Same as for mobile: startXCTestScreenRecording

mobile: stopXCTestScreenRecording

Stops the current XCTest screen recording previously started by the mobile: startXctestScreenRecording API.

An error is thrown if no screen recording is running.

The resulting movie is returned as base-64 string or is uploaded to a remote location if corresponding options have been provided.

The resulting movie is automatically deleted from the local file system FOR SIMULATORS ONLY. In order to clean it up from a real device it is necessary to properly shut down XCTest by calling POST /wda/shutdown API or by doing device factory reset.

Arguments

Name Type Required Description Example
remotePath string no The path to the remote location, where the resulting .mov file should be uploaded. The following protocols are supported: http/https, ftp Null or empty string value (the default setting) means the content of resulting file should be encoded as Base64 and passed to the endpoint response value. An exception will be thrown if the generated file is too big to fit into the available process memory. https://myserver/upload
user string no The name of the user for the remote authentication. Only works if remotePath is provided. myuser
pass string no The password for the remote authentication. Only works if remotePath is provided. mypassword
method string no The http multipart upload method name. Only works if remotePath is provided. PUT by default POST
headers dict no Additional headers mapping for multipart http(s) uploads {'User-Agent': 'Myserver 1.0'}
fileFieldName string no The name of the form field, where the file content BLOB should be stored for http(s) uploads. file by default payload
formFields dict or array no Additional form fields for multipart http(s) uploads {'field2': 'value2'}

Returned Result

Same as for mobile: startXCTestScreenRecording plus the below entry:

Name Type Description Example
payload string Base64-encoded content of the recorded media file if remotePath parameter is empty/null or an empty string otherwise. The resulting media is expected to a be a valid QuickTime movie (.mov). YXBwaXVt....

mobile: simctl

Runs the given command as a subcommand of xcrun simctl against the device under test. Does not work for real devices.

Arguments

Name Type Required Description Example
command string yes a subcommand for the simctl. Available commands are boot, get_app_container, getenv, icloud_sync, install, install_app_data, io, keychain, launch, location, logverbose, openurl, pbcopy, pbpaste, privacy, push, shutdown, spawn, status_bar, terminate, ui, and uninstall. Please check each usage details with xcrun simctl help. 'getenv'
args array no array of string as arguments for the command after <device>. For example getenv subcommand accept simctl getenv <device> <variable name>. The <device> will be filled out automatically. This args should be the <variable name> part only. ['HOME']
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 600000 ms. 10000

Returned Result

Name Type Description Example
stdout string The standard output of the command. '/Users/user/Library/Developer/CoreSimulator/Devices/60EB8FDB-92E0-4895-B466-0153C6DE7BAE/data\n'
stderr string The standard error of the command. '' (an empty string)
code string The status code of the command. 0