欢迎参加我们将于 2022 年 10 月 18 日举办的 Firebase 峰会(线上线下同时进行),了解 Firebase 如何帮助您加快应用开发速度、满怀信心地发布应用并在之后需要时轻松地扩大应用规模。立即报名

Robo 脚本参考指南

本文档提供有关 Robo 脚本的参考信息,包括结构、功能、用法、记录和操作。 Robo 脚本是自动执行移动应用程序的手动质量保证 (QA) 任务并启用持续集成 (CI) 和发布前测试策略的测试。 Robo 脚本是一个 JSON 文件,描述了一系列用户界面 (UI) 和其他操作。

您可以通过以下方式创建 Robo 脚本:

  • 使用 Robo 脚本录制功能。
  • 手动创建 Robo 脚本。
  • 录制 Robo 脚本,然后手动编辑。

要了解有关使用 Robo 脚本的更多信息,请参阅运行 Robo 脚本

Robo 脚本与其他输入(如被测应用 Android 应用程序包 (APK))一起提供给 Robo 测试。

以下是让用户登录应用程序的 Robo 脚本示例:

[
  {
    "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"
      }
    ]
  }
]

结构

Robo 脚本中的每个操作都表示为一个或多个属性值对的捆绑包,如下表所述:

属性描述
eventType指定操作的类型,例如单击、文本编辑等。每个操作都需要。
elementDescriptors标识 UI 小部件的描述符。对于具有目标 UI 小部件的所有操作(例如单击特定按钮)都是必需的。
optional如果设置为true ,则在无法执行时跳过此操作。例如,当它无法在屏幕上找到其目标 UI 小部件时,将跳过此操作,而不会使包含的 Robo 脚本失败。默认情况下,该值为false
replacementText要输入到目标 UI 小部件的文本。文本编辑操作所必需的。
swipeDirection指定滑动的方向。滑动操作需要。
delayTime指定等待多长时间,以毫秒为单位。等待操作是必需的。
pointTapXCoordinatepointTapYCoordinate点击点的像素 X 和 Y 坐标。与pointTapXPercentpointTapYPercent 。点敲击操作需要。
pointTapXPercentpointTapYPercent点击点的百分比 X 和 Y 坐标。与pointTapXCoordinatepointTapYCoordinate 。点敲击操作需要。

以下是一个 Robo 脚本示例,其中包含两个没有目标 UI 小部件的操作,这意味着这些操作不会对特定的 UI 小部件进行操作:

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

元素描述符

元素描述符使用以下一个或多个标识属性来标识 UI 小部件:

属性描述
className
ancestorClassName元素的 UI 层次结构祖先的类名。祖先是元素的 UI 层次结构中的任何父节点,包括元素本身。
resourceId
resourceIdRegex用于匹配resourceId的 Java 正则表达式。
contentDescription
contentDescriptionRegex用于匹配contentDescription的 Java 正则表达式。
text (出现在屏幕上)
textRegex用于匹配text的 Java 正则表达式。
groupViewChildPositionrecyclerViewChildPositionadapterViewChildPosition表示 UI 小部件的子位置,具体取决于其父小部件的类型。

通常,这些属性是未定义的,例如,按钮可能没有文本和内容描述。即使存在某些属性值,它们在给定的应用程序屏幕上也可能不是唯一的(包括resourceId )。

例如,通常只能通过在其父窗口小部件中使用它们不同的子位置来区分列表中的项目。这意味着仅使用一个元素描述符来识别 UI 小部件通常是不够的。因此,动作的elementDescriptors属性包含一系列元素描述符,这些元素描述符按顺序排列,第一个对应于目标 UI 小部件,第二个对应于目标 UI 小部件的父小部件,依此类推。当一个动作的所有元素描述符与相应的 UI 小部件子层次结构匹配时,它的目标 UI 小部件就会匹配。

以下是一个带有文本更改和单击操作的 Robo 脚本示例,这两个操作都需要您使用提供的元素描述符来识别目标 UI 小部件:

[
  {
    "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"
      }
    ]
  }
]

执行选项

您可以选择为 Robo 脚本中的操作列表添加一个 JSON 对象的前缀,该对象指定该 Robo 脚本的执行选项。此配置标头以roboscript关键字开头,后跟所需执行选项的 JSON 表示。

Robo 脚本支持以下执行选项:

  • executionMode - Robo 脚本运行时应用的执行选项:
  • postscript - Robo 脚本完成后应用的执行选项:
    • terminate - 如果设置为true ,Robo 测试将在 Robo 脚本完成后停止爬行。

以下是在strict模式下执行的 Robo 脚本的示例,该脚本会休眠 3 秒,之后爬网停止:

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

模板参数

模板参数是 Robo 脚本中的占位符,当 Robo 测试加载该 Robo 脚本以执行时,该占位符将替换为实际值。模板参数的前缀是双下划线,后跟一个百分号,后缀是一个百分号,后跟一个双下划线。

Robo 脚本支持以下模板参数:

  • __%APP_PACKAGE_NAME%__ - 被测应用的包名。

以下是停止被测应用进程的 Robo 脚本示例:

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

注释

Robo 脚本可以包含注释行,即以#//开头的行。

以下是带有一些注释的 Robo 脚本示例:

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

能力

默认情况下,在 Robo 脚本的所有操作都完成(或至少尝试过)之前,Robo 脚本保持活动状态。 Robo test keeps trying to match a Robo script action whenever it is picking an action to perform. Robo 脚本采用以下技术来提高稳健性:

技术描述
部分匹配如果当前 Robo 脚本动作不能完全匹配,则放宽匹配条件并重试匹配。部分匹配在匹配 Robo 脚本操作的目标 UI 小部件时不考虑最外层元素描述符。

如果部分匹配成功,则照常执行相应的 Robo 脚本操作。此技术支持应用程序结构发生变化的场景,例如,在应用程序版本之间,重新排列屏幕元素时。

跳过当前动作如果当前 Robo 脚本操作无法完全或部分匹配,Robo 会尝试匹配后续 Robo 脚本操作。如果后续操作完全或部分匹配,Robo 测试将跳过(并且永远不会返回)当前 Robo 脚本操作并执行后续操作。

此技术支持应用程序行为在版本之间发生变化或不稳定的情况,例如,在录制与重播 Robo 脚本期​​间,间歇性对话框可能会出现在不同的屏幕上。

暂停如果当前和后续的 Robo 脚本动作都不能完全或部分匹配,则 Robo 脚本会被暂时挂起,并且 Robo 测试会使用其他策略选择要执行的动作。此操作完成后,Robo 测试继续执行 Robo 脚本。

只要当前或后续的 Robo 脚本动作无法匹配,Robo 脚本就会对任意数量的动作保持暂停状态。因此,Robo 脚本不一定需要成为 Robo 测试的序幕,您可以将 Robo 脚本操作与标准 Robo 测试操作穿插。此技术支持应用程序行为不稳定或应用程序版本之间的变化足够大以至于 Robo 测试需要使用其标准操作“填补空白”的场景。

RecyclerView 和 AdapterView 支持

RecyclerView 和 AdapterView 小部件的子项是动态加载的,并且可能会在远离当前屏幕的多次滑动后显示。由于屏幕的大小以及到达该孩子所需的滑动次数对于不同的设备外形尺寸是不同的,因此依赖孩子的数据位置更为可靠,这是绝对的。依靠将这个孩子带到屏幕然后使用其屏幕位置所需的滑动次数是一种不太可靠的方法。

因此,Robo 脚本将作为 Robo 脚本操作目标的 RecyclerView 子项的绝对数据位置捕获为recyclerViewChildPosition 。 Robo 脚本还会将作为 Robo 脚本操作目标的 AdapterView 子项的绝对数据位置捕获为adapterViewChildPosition

对 RecyclerView 和 AdapterView 子项的操作按以下步骤执行:

  1. Robo 测试通过对其包含的 RecyclerView 或 AdapterView 进行定位操作,确保相应的子项显示在屏幕上。

  2. Robo 测试直接在子元素上执行记录的操作,因为它已经显示在屏幕上。

以下是对 AdapterView ( android.widget.GridView ) 子项的单击操作示例:

{
  "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
    }
  ]
}

以下是 RecyclerView ( android.support.v7.widget.RecyclerView ) 子级上的单击操作示例:

{
  "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
    }
  ]
}

在 Android Studio 中录制一个 Robo 脚本并在测试实验室中运行它

您可以在 Android Studio 中创建一个 Robo 脚本,将脚本保存为 JSON 文件。然后,您可以将 JSON 文件与应用程序一起上传到 Firebase 测试实验室并相应地运行测试。

当您在附加脚本的情况下运行 Robo 测试时,Robo 测试首先会执行您预先编写好的操作,然后像往常一样探索应用程序。

要在 Android Studio 中创建 Robo 脚本 JSON 文件,请按照使用 Android Studio 中的测试实验室录制 Robo 脚本中的步骤操作。

Robo 脚本操作

以下通用可选属性适用于所有操作:

  • description - 帮助在 Robo 测试输出中跟踪此 Robo 脚本操作的执行。

断言

如果断言条件为真,Robo 脚本将继续执行下一个动作,这可能是另一个断言。否则,由于断言失败,Robo 脚本执行将停止,并且测试结果为 FAILED。

下表列出了必需的属性:

属性描述
"eventType": "ASSERTION" --
contextDescriptor描述断言的上下文或条件。

上下文描述符

上下文描述符使用以下属性之一或组合定义上下文/条件:

属性描述
"condition": "element_present"检查屏幕上是否存在与elementDescriptors或由visionText指定的文本匹配的 UI 小部件。
"condition": "app_under_test_shown"检查被测应用程序是否在前台运行。
"condition": "default_launcher_shown"检查是否显示了设备的主屏幕,这意味着没有应用程序在前台运行。
"condition": "non_roboscript_action_performed"检查 Robo 测试执行的最后一个操作是否不是 Robo 脚本操作。
negateCondition如果设置为true ,则否定condition 。例如,您可以使用此属性检查屏幕上是否不存在 UI 小部件,或者被测应用程序是否未在前台运行。
elementDescriptors一个或多个元素描述符,用于标识屏幕上的 UI 小部件。它与element_present条件结合使用。与visionText 。有关详细信息,请参阅元素描述符
visionText使用光学字符识别 (OCR) API 检测屏幕上的文本。 visionTextelement_present条件结合使用。与elementDescriptors互斥。

以下是检查被测应用程序是否在前台的 Robo 脚本断言示例:

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

下面是一个 Robo 脚本断言示例,它检查屏幕上是否存在资源 ID 为"com.google.samples.apps.topeka:id/done"的 UI 小部件:

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

以下是一个 Robo 脚本断言示例,它使用 OCR 检查是否在屏幕上未检测到"Settings"

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

点击

下表列出了必需的属性:

属性描述
eventType指定 Robo 脚本操作的类型。
"eventType": "VIEW_CLICKED"单击被测应用的目标元素。
"eventType": "SOFT_KEYBOARD_CLICK"单击软键盘的目标元素。
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK"单击软键盘的随机元素最多maxNumberOfRuns次。
"eventType": "LIST_ITEM_CLICKED"由 Android Studio 中的 Robo 脚本记录器用于单击列表项。
elementDescriptors使用 Android UI 层次结构标识单击的 UI 小部件。与visionText
visionText使用 OCR 标识单击的元素。与elementDescriptors互斥。
maxNumberOfRunseventTypeSOFT_KEYBOARD_RANDOM_CLICK时,指定单击软键盘的随机元素的次数。默认值为1

以下是一个 Robo 脚本操作示例,该操作单击资源 ID 为"com.google.samples.apps.topeka:id/done"的按钮:

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

以下是使用 OCR 在屏幕上检测到的单击"Privacy Policy"的 Robo 脚本操作示例:

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

以下是一个 Robo 脚本操作示例,该操作单击内容描述为"Emoji button"的软键盘元素:

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

以下是一个 Robo 脚本操作示例,该操作最多单击随机软键盘元素五次:

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

禁用软键盘

下表列出了必需的属性:

属性描述
"eventType": "DISABLE_KEYBOARD" --

以下是禁用软键盘的 Robo 脚本操作示例:

{
  "eventType": "DISABLE_KEYBOARD"
}

执行 adb shell 命令

下表列出了必需的属性:

属性描述
"eventType": "ADB_SHELL_COMMAND" --
command要执行的 Android Debug Bridge (adb) shell 命令。

以下是清除被测应用用户数据的 Robo 脚本操作示例:

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

授予权限

此操作由 Android Studio 中的 Robo 脚本记录器记录,以向后兼容Espresso 测试记录器。 Robo 测试在每次爬网开始时授予被测应用的所有权限,因此,此操作是无操作的。不要在您的 Robo 脚本中使用此操作。

下表列出了必需的属性:

属性描述
"eventType": "PERMISSIONS_REQUEST" --

输入文本

下表列出了必需的属性:

属性描述
eventType指定 Robo 脚本操作的类型。
"eventType": "VIEW_TEXT_CHANGED"将给定文本输入到目标 UI 小部件中。
"eventType": "ENTER_TEXT"将给定的文本输入到目标 UI 小部件中,然后将KEYCODE_ENTER事件发送到此 UI 小部件。
elementDescriptors使用 Android UI 层次结构标识目标 UI 小部件。
replacementText要输入到目标 UI 小部件的文本。

以下是一个 Robo 脚本操作示例,该操作将"John"输入到资源 ID 为"com.google.samples.apps.topeka:id/first_name"的 UI 小部件中:

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

长按

下表列出了必需的属性:

属性描述
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors使用 Android UI 层次结构标识目标 UI 小部件。

以下属性是可选的:

  • delayTime - 指定长按的按下应该持续多长时间,以毫秒为单位。

以下是一个 Robo 脚本操作示例,该操作在内容描述为"Avatar 8"的 UI 小部件上执行 5 秒长的点击:

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

执行单点手势

下表列出了必需的属性:

属性描述
"eventType": "ONE_POINT_GESTURE" --
coordinates单点手势的两个坐标,格式为“(x1,y1)->(x2,y2)”,表示为百分比或像素。

以下属性是可选的:

  • dragAndDrop - 如果设置为true ,则单点手势执行拖放操作。默认情况下,它是false

以下是执行向下滑动的 Robo 脚本单点手势动作示例:

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

执行两点手势

下表列出了必需的属性:

属性描述
"eventType": "TWO_POINT_GESTURE" --
coordinates两点手势的四个坐标,格式为“(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)”,表示为百分比或像素。

以下是执行捏合手势的 Robo 脚本操作示例:

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

执行 IME 操作

此操作在指定目标 UI 小部件的输入法编辑器 (IME) 上按下当前操作按钮,例如下一步、完成和搜索。

下表列出了必需的属性:

属性描述
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors使用 Android UI 层次结构标识目标 UI 小部件。

以下是 Robo 脚本操作示例,该操作对资源 ID 为"com.google.samples.apps.topeka:id/first_name"的 UI 小部件执行 IME 操作:

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

按回

下表列出了必需的属性:

属性描述
eventType指定 Robo 脚本操作的类型。
"eventType": "PRESSED_BACK"向设备发送KEYCODE_BACK事件。
"eventType": "PRESSED_BACK_EMULATOR_28"由 Android Studio 中的 Robo 脚本记录器用于按下模拟器 API 28。

以下是按下回的 Robo 脚本操作示例:

{
  "eventType": "PRESSED_BACK"
}

新闻主页

此操作向设备发送KEYCODE_HOME事件。

下表列出了必需的属性:

属性描述
"eventType": "GO_HOME" --

以下是按下 home 键的 Robo 脚本操作示例:

{
  "eventType": "GO_HOME"
}

将元素滚动到视图中

此操作使 Robo 测试向前滚动匹配指定elementDescriptors的 UI 小部件,直到屏幕上出现与指定childElementDescriptors匹配的 UI 小部件,或者滚动的小部件无法再滚动,或者达到最大滚动次数 50。

下表列出了必需的属性:

属性描述
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors使用 Android UI 层次结构标识滚动的 UI 小部件。
childElementDescriptors使用 Android UI 层次结构标识要滚动到的 UI 小部件。

下面是一个 Robo 脚本操作示例,它滚动资源 ID 为"my.app.package:id/scrollable_card_container"的 UI 小部件,直到屏幕上出现带有文本"Orange"的 UI 小部件(或者不再可以滚动执行,或达到最大卷轴数 50):

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

滑动

下表列出了必需的属性:

属性描述
"eventType": "VIEW_SWIPED" --
swipeDirection指定滑动的方向:
  • Left
  • Right
  • Up
  • Down
  • Forward - DownRight取决于目标 UI 小部件的垂直或水平可滚动性。
  • Backward - UpLeft取决于目标 UI 小部件的垂直或水平可滚动性。
elementDescriptors使用 Android UI 层次结构标识目标 UI 小部件。

下面是一个 Robo 脚本操作示例,它向上滑动资源 ID 为"my.app.package:id/custom_content"的 UI 小部件:

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

截屏

下表列出了必需的属性:

属性描述
"eventType": "TAKE_SCREENSHOT" --
screenshotName指定屏幕截图文件名。

以下是截取屏幕截图的 Robo 脚本操作示例:

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

点击屏幕上的一个点

下表列出了必需的属性:

属性描述
"eventType": "POINT_TAP" --
pointTapXCoordinate点击点的像素 X 坐标。与pointTapXPercentpointTapYPercent
pointTapYCoordinate点击点的像素 Y 坐标。与pointTapXPercentpointTapYPercent
pointTapXPercent点击点的百分比 X 坐标。与pointTapXCoordinatepointTapYCoordinate
pointTapYPercent点击点的百分比 Y 坐标。与pointTapXCoordinatepointTapYCoordinate

以下是在屏幕中间点击的 Robo 脚本操作示例:

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

点击元素内的一个点

下表列出了必需的属性:

属性描述
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent目标元素内 X 坐标的百分比。
pointTapYPercent目标元素内的 Y 坐标百分比。
elementDescriptors使用 Android UI 层次结构标识目标 UI 小部件。

以下是将搜索栏的滑块向右移动的 Robo 脚本操作示例:

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

终止抓取

此操作会停止 Robo 测试。

下表列出了必需的属性:

属性描述
"eventType": "TERMINATE_CRAWL" --

以下是停止 Robo 测试的 Robo 脚本操作示例:

{
  "eventType": "TERMINATE_CRAWL"
}

等待

下表列出了必需的属性:

属性描述
"eventType": "DELAYED_MESSAGE_POSTED" --
delayTime指定等待多长时间,以毫秒为单位。

以下是等待三秒钟的 Robo 脚本操作示例:

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

等待一个元素

此操作使 Robo 测试等待元素出现在屏幕上,直到指定的超时。

下表列出了必需的属性:

属性描述
"eventType": "WAIT_FOR_ELEMENT" --
delayTime指定等待超时,以毫秒为单位。
elementDescriptors使用 Android UI 层次结构标识等待的 UI 小部件。

以下是 Robo 脚本操作的示例,该操作最多等待 30 秒以使资源 ID 为"my.app.package:id/confirmation_button"的 UI 小部件出现在屏幕上:

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

下一步