获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Robo 脚本参考指南

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

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

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

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

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

以下是将用户登录到应用程序的 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 脚本示例,该脚本会休眠三秒钟,然后停止抓取:

"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 测试选择要执行的操作时,它都会不断尝试匹配 Robo 脚本操作。 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 脚本并在 Test Lab 中运行

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

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

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

机器人脚本操作

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

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

断言

如果断言条件为真,Robo 脚本将继续执行下一个操作,这可能是另一个断言。否则,Robo 脚本的执行会因断言失败而停止,测试结果为 FAILED。

下表列出了必需的属性:

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

上下文描述符

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

属性描述
"condition": "element_present"检查屏幕上是否存在与elementDescriptorsvisionText指定的文本匹配的 UI 小部件。
"condition": "element_disabled"检查与elementDescriptors匹配的 UI 小部件是否出现在屏幕上并且无法与之交互。
"condition": "element_checked"检查与elementDescriptors匹配的 UI 小部件是否出现在屏幕上并被选中。
"condition": "app_under_test_shown"检查被测应用程序是否在前台运行。
"condition": "default_launcher_shown"检查是否显示设备的主屏幕,这意味着没有应用程序在前台运行。
"condition": "non_roboscript_action_performed"检查 Robo 测试执行的最后一个动作是否不是 Robo 脚本动作。
negateCondition如果设置为true ,则否定condition 。例如,您可以使用此属性来检查屏幕上是否不存在 UI 小部件,或者被测应用程序是否未在前台运行。
elementDescriptors一个或多个元素描述符,用于标识屏幕上的 UI 小部件。它与element_presentelement_disabledelement_checked条件结合使用。与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,
    "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

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

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

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

{
  "eventType": "VIEW_CLICKED",
  "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 调试桥 (adb) shell 命令。

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

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

授予权限

此操作由 Android Studio 中的 Robo 脚本记录器记录,以便与Espresso Test Recorder向后兼容。 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 小部件中的文本。

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

{
  "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 小部件上执行五秒长的单击:

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

以下是按主页的 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 小部件。

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

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

下一步