Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Robo scripts reference guide

Stay organized with collections Save and categorize content based on your preferences.

This document provides reference information about Robo scripts including structure, capabilities, usage, recording, and actions. Robo scripts are tests that automate manual quality assurance (QA) tasks for mobile apps, and enable continuous integration (CI) and pre-launch testing strategies. A Robo script is a JSON file that describes a sequence of user interface (UI) and other actions.

You can create a Robo script in the following ways:

  • Use the Robo script recording feature.
  • Create the Robo script manually.
  • Record the Robo script and then edit it manually.

To learn more about using Robo scripts, see Run a Robo script.

Robo script is provided to Robo test alongside other inputs like the app-under-test Android Application Package (APK).

The following is an example of a Robo script that signs a user into an app:

[
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "user123",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/username"
      }
    ]
  },
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "12345",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/password"
      }
    ]
  },
  {
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/login"
      }
    ]
  }
]

Structure

Each action in a Robo script is represented as a bundle of one or more attribute-value pairs, which are described in the following table:

Attribute Description
eventType Specifies the type of the action, for example, click, text edit, etc. Required for every action.
elementDescriptors Descriptors that identify a UI widget. Required for all actions that have a target UI widget, like clicking a particular button.
optional If set to true, this action is skipped when it cannot be performed. For example, this action is skipped when it can't find its target UI widget on a screen– without failing the containing Robo script. By default, the value is false.
replacementText The text to input into the target UI widget. Required for text editing actions.
swipeDirection Specifies the direction of the swipe. Required for swipe actions.
delayTime Specifies how long to wait, in milliseconds. Required for wait actions.
pointTapXCoordinate and pointTapYCoordinate The pixel X and Y coordinates of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent. Required for point tap actions.
pointTapXPercent and pointTapYPercent The percentage X and Y coordinates of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate. Required for point tap actions.

The following is an example of a Robo script with two actions without target UI widgets, which means that these actions don't operate on a specific UI widget:

[
  {
    "eventType": "DELAYED_MESSAGE_POSTED",
    "delayTime": 3000
  },
  {
    "eventType": "PRESSED_BACK"
  }
]

Element descriptors

An element descriptor identifies a UI widget using one or more of the following identifying attributes:

Attribute Description
className
ancestorClassName Class name of the element's UI hierarchy ancestor. An ancestor is any of the parent nodes in the element's UI hierarchy, including the element itself.
resourceId
resourceIdRegex Java regular expression to match resourceId.
contentDescription
contentDescriptionRegex Java regular expression to match contentDescription.
text (that appears on the screen)
textRegex Java regular expression to match text.
groupViewChildPosition, recyclerViewChildPosition, or adapterViewChildPosition Represents a UI widget’s child position depending on the kind of its parent widget.

Frequently, these attributes are undefined, for example, a button might not have text and content description. Even if some attribute values are present, they might not be unique on a given app screen (including resourceId).

For example, differentiating between items of a list is commonly possible only by using their different child positions within their parent widget. This means that using just one element descriptor to identify a UI widget is usually insufficient. Therefore, an action’s elementDescriptors attribute contains a sequence of element descriptors that are ordered such that the first one corresponds to the target UI widget, the second one corresponds to the target UI widget’s parent widget, and so on. An action’s target UI widget is matched when all of its element descriptors match the corresponding UI widget sub-hierarchy.

The following is an example of a Robo script with a text change and click actions, both of which require you to identify the target UI widget using the provided element descriptors:

[
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "John",
    "elementDescriptors": [
      {
        "className": "android.support.v7.widget.AppCompatEditText",
        "groupViewChildPosition": 0,
        "resourceId": "com.google.samples.apps.topeka:id/first_name"
      },
      {
        "className": "android.widget.FrameLayout",
        "groupViewChildPosition": 0
      },
      {
        "className": "android.support.design.widget.TextInputLayout",
        "groupViewChildPosition": 1
      }
    ]
  },
  {
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "className": "android.support.design.widget.FloatingActionButton",
        "groupViewChildPosition": 1,
        "resourceId": "com.google.samples.apps.topeka:id/done"
      },
      {
        "className": "android.widget.FrameLayout",
        "groupViewChildPosition": 1,
        "resourceId": "com.google.samples.apps.topeka:id/content"
      },
      {
        "className": "android.widget.FrameLayout",
        "groupViewChildPosition": 0,
        "resourceId": "com.google.samples.apps.topeka:id/sign_in_content"
      }
    ]
  }
]

Execution options

You can optionally prefix the list of actions in a Robo script with a JSON object that specifies the execution options for that Robo script. This configuration header starts with the roboscript keyword followed by a JSON representation of the desired execution options.

Robo scripts support the following execution options:

  • executionMode - execution options applied when a Robo script is running:
  • postscript - execution options applied after a Robo script is completed:
    • terminate - if set to true, Robo test stops crawling after the Robo script is completed.

The following is an example of a Robo script executed in strict mode that sleeps for three seconds, after which the crawl stops:

"roboscript": {
  "executionMode": {
    "strict": true
  },
  "postscript": {
    "terminate": true
  }
}
[
  {
    "eventType": "DELAYED_MESSAGE_POSTED",
    "delayTime": 3000
  }
]

Template parameters

A template parameter is a placeholder in a Robo script that is replaced with the actual value when Robo test loads that Robo script for execution. Template parameters are prefixed with a double underscore followed by a percent sign, and are postfixed with a percent sign followed by a double underscore.

Robo scripts support the following template parameter:

  • __%APP_PACKAGE_NAME%__ - the package name of the app-under-test.

The following is an example of a Robo script that stops the app-under-test process:

[
  {
    "eventType": "ADB_SHELL_COMMAND",
    "command": "am force-stop __%APP_PACKAGE_NAME%__"
  }
]

Comments

A Robo script can contain comment lines, which are lines that start with # or //.

The following is an example of a Robo script with a couple of comments:

# Confirm a user account.
[
  {
    // Click the DONE button.
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "resourceId": "com.google.samples.apps.topeka:id/done"
      }
    ]
  }
]

Capabilities

By default, until all actions of a Robo script are completed (or at least attempted), the Robo script remains active. Robo test keeps trying to match a Robo script action whenever it is picking an action to perform. Robo script employs the following techniques to increase robustness:

Technique Description
Partial matching If the current Robo script action cannot be fully matched, the matching criteria are relaxed and the matching is retried. The partial matching doesn't consider the outermost element descriptor while matching the target UI widget of a Robo script action.

If the partial matching succeeds, the corresponding Robo script action is performed as usual. This technique supports scenarios in which the app structure changes, for example, between app versions, when screen elements are rearranged.

Skip current action If the current Robo script action cannot be fully or partially matched, Robo tries to match the subsequent Robo script action. If the subsequent action fully or partially matches, Robo test skips (and never returns to) the current Robo script action and performs the subsequent one.

This technique supports scenarios when app behavior changes between versions or is flaky, for example, when an intermittent dialog might appear at different screens during recording versus replaying of a Robo script.

Suspend If neither current nor subsequent Robo script actions can be fully or partially matched, Robo script is temporarily suspended and Robo test picks an action to perform using its other strategies. After this action is completed, Robo test resumes executing the Robo script.

As long as current or subsequent Robo script actions cannot be matched, Robo script remains suspended for any number of actions. Thus, Robo scripts do not necessarily need to be a prologue for a Robo test, and you can intersperse Robo script actions with standard Robo test actions. This technique supports scenarios when app behavior is flaky, or when changes between app versions are large enough that Robo test needs to "fill in the gaps" with its standard actions.

RecyclerView and AdapterView support

Children of RecyclerView and AdapterView widgets are loaded dynamically and might be displayed many swipes away from the current screen. Since the size of a screen, and the number of swipes required to get to this child, is different for different device form factors, it is much more robust to rely on the child’s data position, which is absolute. It is a less robust approach to rely on the number of swipes that are required to bring this child to the screen and then use its screen position.

Therefore, Robo script captures the absolute data positions of RecyclerView children that are targets of Robo script actions as recyclerViewChildPosition. Robo script also captures the absolute data positions of AdapterView children that are targets of Robo script actions as adapterViewChildPosition.

Actions on RecyclerView and AdapterView children are performed in the following steps:

  1. Robo test ensures that the corresponding child is displayed on the screen through a positioning action on its containing RecyclerView or AdapterView.

  2. Robo test performs the recorded action directly on the child element, since it is already displayed on the screen.

The following is an example of a click action on an AdapterView (android.widget.GridView) child:

{
  "eventType": "VIEW_CLICKED",
  "elementDescriptors": [
    {
      "className": "com.google.samples.apps.topeka.widget.AvatarView",
      "adapterViewChildPosition": 5,
      "resourceId": "com.google.samples.apps.topeka:id/avatar",
      "contentDescription": "Avatar 6"
    },
    {
      "className": "android.widget.GridView",
      "groupViewChildPosition": 1,
      "resourceId": "com.google.samples.apps.topeka:id/avatars"
    },
    {
      "className": "android.widget.LinearLayout",
      "groupViewChildPosition": 1
    },
    {
      "className": "android.widget.LinearLayout",
      "groupViewChildPosition": 0
    }
  ]
}

The following is an example of a click action on a RecyclerView (android.support.v7.widget.RecyclerView) child:

{
  "eventType": "VIEW_CLICKED",
  "elementDescriptors": [
    {
      "className": "android.support.v7.widget.AppCompatTextView",
      "groupViewChildPosition": 1,
      "resourceId": "com.google.samples.apps.topeka:id/category_title"
    },
    {
      "className": "android.widget.FrameLayout",
      "recyclerViewChildPosition": 8,
      "resourceId": "com.google.samples.apps.topeka:id/category_item"
    },
    {
      "className": "android.support.v7.widget.RecyclerView",
      "groupViewChildPosition": 1,
      "resourceId": "com.google.samples.apps.topeka:id/categories"
    },
    {
      "className": "android.widget.FrameLayout",
      "groupViewChildPosition": 1,
      "resourceId": "com.google.samples.apps.topeka:id/category_container"
    },
    {
      "className": "android.widget.LinearLayout",
      "groupViewChildPosition": 0
    }
  ]
}

Record a Robo script in Android Studio and run it in Test Lab

You can create a Robo script in Android Studio, which saves the script as a JSON file. You can then upload the JSON file to Firebase Test Lab with the application and run the test accordingly.

When you run a Robo test with a script attached, Robo test first steps through your pre-scripted actions and then explores the app as usual.

To create a Robo script JSON file in Android Studio, follow the steps in Record a Robo script using Test Lab in Android Studio.

Robo script actions

The following common optional attribute applies to all actions:

  • description - helps track execution of this Robo script action in Robo test outputs.

Assertion

If the asserted condition is true, the Robo script continues to the next action, which could be another assertion. Otherwise, the Robo script execution is halted due to a failed assertion, and the test outcome is FAILED.

The following table lists required attributes:

Attribute Description
"eventType": "ASSERTION" --
contextDescriptor Describes the asserted context or condition.

Context descriptor

A context descriptor defines the context/condition using one or a combination of the following attributes:

Attribute Description
"condition": "element_present" Checks that a UI widget that matches elementDescriptors or text specified by visionText is present on the screen.
"condition": "app_under_test_shown" Checks that the app-under-test is running in the foreground.
"condition": "default_launcher_shown" Checks that a device’s home screen is shown, which means that no apps are running in the foreground.
"condition": "non_roboscript_action_performed" Checks that the last action performed by Robo test is not a Robo script action.
negateCondition If set to true, negates the condition. For example, you can use this attribute to check if a UI widget is NOT present on the screen, or that the app-under-test is NOT running in the foreground.
elementDescriptors One or more element descriptors that identify a UI widget on the screen. It is used in combination with the element_present condition. Mutually exclusive with visionText. For more information, see Element descriptors.
visionText Text on the screen is detected using the Optical Character Recognition (OCR) API. visionText is used in combination with the element_present condition. Mutually exclusive with elementDescriptors.

The following is an example of a Robo script assertion that checks that the app-under-test is in the foreground:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  }
}

The following is an example of a Robo script assertion that checks that a UI widget with the resource ID "com.google.samples.apps.topeka:id/done" is present on a screen:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "com.google.samples.apps.topeka:id/done"
      }
    ]
  }
}

The following is an example of a Robo script assertion that checks that "Settings" is NOT detected on a screen using OCR:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "element_present",
    "negateCondition": true,
    "elementDescriptors": [
      {
        "visionText": "Settings"
      }
    ]
  }
}

Click

The following table lists required attributes:

Attribute Description
eventType Specifies the type of the Robo script action.
"eventType": "VIEW_CLICKED" Clicks the target element of the app-under-test.
"eventType": "SOFT_KEYBOARD_CLICK" Clicks the target element of the soft keyboard.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Clicks random elements of the soft keyboard up to maxNumberOfRuns times.
"eventType": "LIST_ITEM_CLICKED" Used by the Robo script recorder in Android Studio for clicking list items.
elementDescriptors Identifies the clicked UI widget using the Android UI hierarchy. Mutually exclusive with visionText.
visionText Identifies the clicked element using OCR. Mutually exclusive with elementDescriptors.
maxNumberOfRuns Specifies how many times to click a random element of the soft keyboard, when eventType is SOFT_KEYBOARD_RANDOM_CLICK. The default value is 1.

The following is an example of a Robo script action that clicks a button with the resource ID "com.google.samples.apps.topeka:id/done":

{
  "eventType": "VIEW_CLICKED",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/done"
    }
  ]
}

The following is an example of a Robo script action that clicks on "Privacy Policy" detected on a screen using OCR:

{
  "eventType": "VIEW_CLICKED",
  "elementDescriptors": [
    {
      "visionText": "Privacy Policy"
    }
  ]
}

The following is an example of a Robo script action that clicks a soft keyboard element with a content description "Emoji button":

{
  "eventType": "SOFT_KEYBOARD_CLICK",
  "elementDescriptors": [
    {
      "contentDescription": "Emoji button"
    }
  ]
}

The following is an example of a Robo script action that clicks random soft keyboard elements up to five times:

{
  "eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
  "maxNumberOfRuns": 5
}

Disable soft keyboard

The following table lists required attributes:

Attribute Description
"eventType": "DISABLE_KEYBOARD" --

The following is an example of a Robo script action that disables the soft keyboard:

{
  "eventType": "DISABLE_KEYBOARD"
}

Execute adb shell command

The following table lists required attributes:

Attribute Description
"eventType": "ADB_SHELL_COMMAND" --
command The Android Debug Bridge (adb) shell command to execute.

The following is an example of a Robo script action that clears the app-under-test user data:

{
  "eventType": "ADB_SHELL_COMMAND",
  "command": "pm clear __%APP_PACKAGE_NAME%__"
}

Grant permissions

This action is recorded by the Robo script recorder in Android Studio for backward compatibility with Espresso Test Recorder. Robo test grants all permissions to the app-under-test at the beginning of every crawl, and thus, this action is a no-op. Do NOT use this action in your Robo scripts.

The following table lists required attributes:

Attribute Description
"eventType": "PERMISSIONS_REQUEST" --

Input text

The following table lists required attributes:

Attribute Description
eventType Specifies the type of the Robo script action.
"eventType": "VIEW_TEXT_CHANGED" Inputs the given text into the target UI widget.
"eventType": "ENTER_TEXT" inputs the given text into the target UI widget and then sends a KEYCODE_ENTER event to this UI widget.
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.
replacementText The text to input into the target UI widget.

The following is an example of a Robo script action that inputs "John" into a UI widget with the resource ID "com.google.samples.apps.topeka:id/first_name":

{
  "eventType": "VIEW_TEXT_CHANGED",
  "replacementText": "John",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/first_name"
    }
  ]
}

Long click

The following table lists required attributes:

Attribute Description
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.

The following attribute is optional:

  • delayTime - specifies how long the press down of a long click should last, in milliseconds.

The following is an example of a Robo script action that performs a five seconds-long click on a UI widget with content description "Avatar 8":

{
  "eventType": "VIEW_LONG_CLICKED",
  "elementDescriptors": [
    {
      "contentDescription": "Avatar 8"
    }
  ],
  "delayTime": 5000
}

Perform a one-point gesture

The following table lists required attributes:

Attribute Description
"eventType": "ONE_POINT_GESTURE" --
coordinates Two coordinates for a one-point gesture, formatted as "(x1,y1)->(x2,y2)" as percentages or pixels.

The following attribute is optional:

  • dragAndDrop - if set to true, the one-point gesture performs a drag-and-drop action. By default, it is false.

The following is an example of a Robo script one-point gesture action that performs a swipe down:

{
  "eventType": "ONE_POINT_GESTURE",
  "coordinates": "(50%,25%)->(50%,75%)"
}

Perform a two-point gesture

The following table lists required attributes:

Attribute Description
"eventType": "TWO_POINT_GESTURE" --
coordinates Four coordinates for a two-point gesture, formatted as "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" as percentages or pixels.

The following is an example of a Robo script action that performs a pinch out gesture:

{
  "eventType": "TWO_POINT_GESTURE",
  "coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}

Perform an IME action

This action presses the current action button, for example, next, done, and search, on the Input Method Editor (IME) for the specified target UI widget.

The following table lists required attributes:

Attribute Description
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.

The following is an example of a Robo script action that performs an IME action on a UI widget with the resource ID "com.google.samples.apps.topeka:id/first_name":

{
  "eventType": "PRESSED_EDITOR_ACTION",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/first_name"
    }
  ]
}

Press back

The following table lists required attributes:

Attribute Description
eventType Specifies the type of the Robo script action.
"eventType": "PRESSED_BACK" Sends a KEYCODE_BACK event to the device.
"eventType": "PRESSED_BACK_EMULATOR_28" Used by the Robo script recorder in Android Studio for pressing back on emulators API 28.

The following is an example of a Robo script action that presses back:

{
  "eventType": "PRESSED_BACK"
}

Press home

This action sends a KEYCODE_HOME event to the device.

The following table lists required attributes:

Attribute Description
"eventType": "GO_HOME" --

The following is an example of a Robo script action that presses home:

{
  "eventType": "GO_HOME"
}

Scroll an element into view

This action makes Robo test scroll forward the UI widget that matches the specified elementDescriptors until the UI widget that matches the specified childElementDescriptors is present on the screen, or the scrolled widget can no longer be scrolled, or the max number of 50 scrolls is reached.

The following table lists required attributes:

Attribute Description
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Identifies the scrolled UI widget using the Android UI hierarchy.
childElementDescriptors Identifies the UI widget to scroll to using the Android UI hierarchy.

The following is an example of a Robo script action that scrolls the UI widget with the resource ID "my.app.package:id/scrollable_card_container" until the UI widget with text "Orange" is present on the screen (or no more scrolls can be performed, or the max number of 50 scrolls is reached):

{
  "eventType": "ELEMENT_SCROLL_INTO_VIEW",
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/scrollable_card_container"
    }
  ],
  "childElementDescriptors": [
    {
      "text": "Orange"
    }
  ]
}

Swipe

The following table lists required attributes:

Attribute Description
"eventType": "VIEW_SWIPED" --
swipeDirection Specifies the direction of the swipe:
  • Left
  • Right
  • Up
  • Down
  • Forward - either Down or Right depending on vertical or horizontal scrollability of the target UI widget.
  • Backward - either Up or Left depending on vertical or horizontal scrollability of the target UI widget.
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.

The following is an example of a Robo script action that swipes up a UI widget with the resource ID "my.app.package:id/custom_content":

{
  "eventType": "VIEW_SWIPED",
  "swipeDirection": "Up",
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/custom_content"
    }
  ]
}

Take screenshot

The following table lists required attributes:

Attribute Description
"eventType": "TAKE_SCREENSHOT" --
screenshotName Specifies the screenshot file name.

The following is an example of a Robo script action that takes a screenshot:

{
  "eventType": "TAKE_SCREENSHOT",
  "screenshotName": "my_screenshot"
}

Tap a point on the screen

The following table lists required attributes:

Attribute Description
"eventType": "POINT_TAP" --
pointTapXCoordinate The pixel X coordinate of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent.
pointTapYCoordinate The pixel Y coordinate of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent.
pointTapXPercent The percentage X coordinate of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate.
pointTapYPercent The percentage Y coordinate of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate.

The following is an example of a Robo script action that taps in the middle of a screen:

{
  "eventType": "POINT_TAP",
  "pointTapXPercent": 50,
  "pointTapYPercent": 50
}

Tap a point within an element

The following table lists required attributes:

Attribute Description
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent The percentage X coordinate within the target element.
pointTapYPercent The percentage Y coordinate within the target element.
elementDescriptors Identifies the target UI widget using Android UI hierarchy.

The following is an example of a Robo script action that moves a seekbar’s slider to the right:

{
  "eventType": "POINT_TAP_ELEMENT",
  "pointTapXPercent": 80,
  "pointTapYPercent": 50,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/my_seekbar"
    }
  ]
}

Terminate crawl

This action stops the Robo test.

The following table lists required attributes:

Attribute Description
"eventType": "TERMINATE_CRAWL" --

The following is an example of a Robo script action that stops a Robo test:

{
  "eventType": "TERMINATE_CRAWL"
}

Wait

The following table lists required attributes:

Attribute Description
"eventType": "DELAYED_MESSAGE_POSTED" --
delayTime Specifies how long to wait, in milliseconds.

The following is an example of a Robo script action that waits for three seconds:

{
  "eventType": "DELAYED_MESSAGE_POSTED",
  "delayTime": 3000
}

Wait for an element

This action makes Robo test wait for an element to appear on the screen up to the specified timeout.

The following table lists required attributes:

Attribute Description
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Specifies the waiting timeout, in milliseconds.
elementDescriptors Identifies the waited-for UI widget using the Android UI hierarchy.

The following is an example of a Robo script action that waits for up to 30 seconds for a UI widget with the resource ID "my.app.package:id/confirmation_button" to appear on the screen:

{
  "eventType": "WAIT_FOR_ELEMENT",
  "delayTime": 30000,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/confirmation_button"
    }
  ]
}

Next steps