Hướng dẫn tham khảo về tập lệnh Robo

Tài liệu này cung cấp thông tin tham khảo về tập lệnh Robo, bao gồm cả cấu trúc, chức năng, cách sử dụng, bản ghi và hành động. Tập lệnh Robo là các chương trình kiểm thử tự động hoá các tác vụ đảm bảo chất lượng (QA) thủ công cho ứng dụng di động, đồng thời cho phép tích hợp liên tục (CI) và các chiến lược kiểm thử trước khi phát hành. Tập lệnh Robo là một tệp JSON mô tả trình tự giao diện người dùng (UI) và các thao tác khác.

Bạn có thể tạo tập lệnh Robo theo các cách sau:

  • Sử dụng tính năng ghi lại tập lệnh Robo. (Chỉ Android)

  • Tạo tập lệnh Robo theo cách thủ công. (Android và iOS trở lên)

  • Ghi lại tập lệnh Robo rồi chỉnh sửa theo cách thủ công. (Chỉ dành cho Android)

Để tìm hiểu thêm về cách sử dụng tập lệnh Robo, hãy xem bài viết Chạy tập lệnh Robo.

Giới thiệu

Tập lệnh Robo được cung cấp cho kiểm thử Robo cùng với các dữ liệu đầu vào khác như Gói ứng dụng Android (APK) của ứng dụng đang được kiểm thử.

Sau đây là ví dụ về tập lệnh Robo giúp người dùng đăng nhập vào một ứng dụng. Tập lệnh này được kích hoạt khi ứng dụng đang được kiểm thử khởi chạy:

[
  {
    "crawlStage": "crawl",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "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"
          }
        ]
      }
    ]
  }
]

Nếu có một tập lệnh Robo duy nhất trong một tệp và tập lệnh đó có điều kiện kích hoạt mặc định app_under_test_shown, như trong ví dụ trên, thì bạn có thể chỉ định tập lệnh Robo trong một tệp bằng cách sử dụng định dạng đơn giản hơn, giống như trình tự các hành động của tập lệnh đó:

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

Hỗ trợ iOS trở lên cho tập lệnh Robo

Robo dành cho iOS+ (Beta) hỗ trợ hạn chế cho các tập lệnh Robo. Cú pháp tập lệnh Robo cho iOS trở lên giống với cú pháp Android và các tính năng iOS trở lên được hỗ trợ hoạt động tương tự như các tính năng tương ứng trên Android.

Các thao tác sau được hỗ trợ trong iOS+:

  • Câu nhận định
  • Nhấp chuột
  • Nhấp và giữ
  • Trượt
  • Bỏ qua tất cả phần tử
  • Đợi
  • Chụp ảnh màn hình
  • Chấm dứt quá trình thu thập dữ liệu

Các thuộc tính xác định sau đây trong mã mô tả phần tử được hỗ trợ trên iOS+:

  • Tên lớp
  • Tên lớp đối tượng cấp trên
  • Mô tả nội dung (và biểu thức chính quy)
  • Văn bản (và biểu thức chính quy)

Các điều kiện kích hoạt trong chỉ số mô tả ngữ cảnh sau đây được hỗ trợ trong iOS trở lên:

  • Ứng dụng đang được kiểm thử xuất hiện
  • Phần tử hiện diện
  • Thực hiện hành động không phải của tập lệnh Robo

Cấu trúc

Tập lệnh Robo có một số thuộc tính mô tả cách Robo thực thi tập lệnh đó. Hầu hết các thuộc tính này là không bắt buộc và có giá trị mặc định được xác định trước:

Thuộc tính Nội dung mô tả
id Một số nguyên giúp theo dõi tập lệnh Robo này trong kết quả thu thập thông tin. Robo tích hợp sẵn các tập lệnh Robo với id riêng. Mặc dù cùng một id trong các tập lệnh Robo khác nhau không ảnh hưởng đến hành vi của các tập lệnh đó, nhưng việc phân biệt các hành động trong các tập lệnh Robo này trong kết quả thu thập dữ liệu có thể là một thách thức. Bạn nên chỉ định một id duy nhất là 1000 trở lên cho các tập lệnh Robo để tránh xung đột.
description Tương tự như id nhưng có tính mô tả hơn.
crawlStage Giai đoạn mà Robo thu thập dữ liệu áp dụng tập lệnh Robo này. Theo mặc định, đây là giai đoạn thu thập thông tin chính.
priority Mức độ ưu tiên của tập lệnh Robo này so với các tập lệnh Robo khác. Theo mặc định, tất cả tập lệnh Robo đều có mức độ ưu tiên là 1.
maxNumberOfRuns Chỉ định số lần trong quá trình thu thập thông tin mà Robo có thể thực thi tập lệnh Robo này. Theo mặc định, Robo có thể thực thi một tập lệnh Robo một lần.
contextDescriptor Mô tả ngữ cảnh hoặc điều kiện kích hoạt tập lệnh Robo này. Nếu bị bỏ qua, điều kiện kích hoạt của tập lệnh Robo này sẽ được coi là luôn được đáp ứng; nói cách khác, tập lệnh Robo không có điều kiện.
actions Tất cả hành động của tập lệnh Robo này.

Một tệp chứa một tập hợp gồm một hoặc nhiều tập lệnh Robo.

Sau đây là ví dụ về một tệp có hai tập lệnh Robo không có điều kiện, mỗi tập lệnh có một thao tác được thực thi một lần ở đầu quá trình thu thập dữ liệu:

[
  {
    "id": 1000,
    "description": "My first Robo script",
    "actions": [
      {
        "eventType": "DISABLE_KEYBOARD"
      }
    ]
  },
  {
    "id": 1001,
    "description": "My second Robo script",
    "actions": [
      {
        "eventType": "PRESSED_BACK"
      }
    ]
  }
]

Phần mô tả ngữ cảnh

Chỉ số mô tả ngữ cảnh xác định ngữ cảnh hoặc điều kiện kích hoạt một tập lệnh Robo bằng cách sử dụng một hoặc kết hợp nhiều thuộc tính:

Thuộc tính Nội dung mô tả
"condition": "always" Luôn kích hoạt tập lệnh Robo.
"condition": "element_present" Kiểm tra để đảm bảo rằng một tiện ích giao diện người dùng khớp với elementDescriptors hoặc văn bản do visionText chỉ định có trên màn hình.
"condition": "element_disabled" Kiểm tra để đảm bảo một tiện ích giao diện người dùng khớp với elementDescriptors xuất hiện trên màn hình và không thể tương tác.
"condition": "element_checked" Kiểm tra để đảm bảo rằng một tiện ích giao diện người dùng khớp với elementDescriptors có hiện diện trên màn hình và được kiểm tra.
"condition": "app_under_test_shown" Kiểm tra để đảm bảo ứng dụng đang được kiểm thử đang chạy trên nền trước.
"condition": "default_launcher_shown" Kiểm tra để đảm bảo màn hình chính của thiết bị hiển thị, tức là không có ứng dụng nào đang chạy ở nền trước.
"condition": "non_roboscript_action_performed" Kiểm tra để đảm bảo rằng nonRoboscriptActionCount hành động liên tiếp gần đây nhất do kiểm thử Robo thực hiện không phải là hành động tập lệnh Robo.
negateCondition Nếu được đặt thành true, sẽ phủ định condition. Ví dụ: bạn có thể sử dụng thuộc tính này để kiểm tra xem một tiện ích trên giao diện người dùng có xuất hiện trên màn hình hay không hoặc ứng dụng đang được kiểm thử có chạy ở nền trước hay không.
elementDescriptors Một hoặc nhiều mã mô tả phần tử xác định một tiện ích giao diện người dùng trên màn hình. Phương thức này được dùng kết hợp với các điều kiện element_present, element_disabledelement_checked. Loại trừ lẫn nhau với visionText. Để biết thêm thông tin, hãy xem bài viết Mã mô tả phần tử.
visionText Phát hiện văn bản trên màn hình bằng API Nhận dạng ký tự quang học (OCR). visionText được sử dụng kết hợp với điều kiện element_present. Loại trừ lẫn nhau với elementDescriptors.
nonRoboscriptActionCount Số hành động liên tiếp không phải là tập lệnh Robo đã thực hiện trước đó. Tệp này được dùng kết hợp với điều kiện non_roboscript_action_performed để kích hoạt tập lệnh Robo sau mỗi hành động Robo nonRoboscriptActionCount. Theo mặc định, giá trị này là 1.

Sau đây là ví dụ về tập lệnh Robo được kích hoạt bởi một tiện ích giao diện người dùng có mã nhận dạng tài nguyên "my.app.package:id/page_header" xuất hiện trên màn hình:

{
  "id": 1000,
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/page_header"
      }
    ]
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "elementDescriptors": [
        {
          "text": "Settings"
        }
      ]
    }
  ]
}

Sau đây là ví dụ về tập lệnh Robo được kích hoạt bằng "Privacy Policy" do công nghệ Nhận dạng ký tự quang học (OCR) phát hiện:

{
  "id": 1000,
  "description": "Vision text Robo script",
  "contextDescriptor": {
    "condition": "element_present",
    "visionText": "Privacy Policy"
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "visionText": "Privacy Policy"
    }
  ]
}

Sau đây là ví dụ về tập lệnh Robo đợi 5 giây sau mỗi hành động Robo không phải tập lệnh:

{
  "contextDescriptor": {
    "condition": "non_roboscript_action_performed"
  },
  "maxNumberOfRuns" : 1000,
  "actions" : [
    {
      "eventType" : "DELAYED_MESSAGE_POSTED",
      "delayTime" : 5000
    }]
}

Hành động

Mỗi hành động trong tập lệnh Robo được biểu thị dưới dạng một gói gồm một hoặc nhiều cặp thuộc tính-giá trị, được mô tả trong bảng sau:

Thuộc tính Nội dung mô tả
eventType Chỉ định loại hành động, ví dụ: nhấp, chỉnh sửa văn bản, v.v. Bắt buộc đối với mọi hành động.
elementDescriptors Phần mô tả xác định một tiện ích giao diện người dùng. Bắt buộc đối với tất cả các thao tác có tiện ích giao diện người dùng mục tiêu, chẳng hạn như nhấp vào một nút cụ thể.
optional Nếu bạn đặt thành true, thì thao tác này sẽ bị bỏ qua khi không thể thực hiện. Ví dụ: thao tác này bị bỏ qua khi không thể tìm thấy tiện ích giao diện người dùng mục tiêu trên màn hình – mà không làm hỏng tập lệnh Robo. Theo mặc định, giá trị này là false.
replacementText Văn bản cần nhập vào tiện ích giao diện người dùng mục tiêu. Bắt buộc đối với các thao tác chỉnh sửa văn bản.
swipeDirection Chỉ định hướng vuốt. Bắt buộc đối với thao tác vuốt.
delayTime Chỉ định thời gian chờ, tính bằng mili giây. Bắt buộc đối với các hành động chờ.
pointTapXCoordinatepointTapYCoordinate Toạ độ X và Y theo pixel của điểm nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent. Bắt buộc đối với các hành động nhấn vào điểm.
pointTapXPercentpointTapYPercent Toạ độ X và Y theo tỷ lệ phần trăm của điểm nhấn. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate. Bắt buộc đối với các hành động nhấn vào điểm.

Sau đây là ví dụ về tập lệnh Robo có 2 thao tác không có tiện ích giao diện người dùng mục tiêu, có nghĩa là các thao tác này không hoạt động trên một tiện ích giao diện người dùng cụ thể:

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

Phần mô tả phần tử

Trình mô tả phần tử xác định một tiện ích trên giao diện người dùng bằng một hoặc nhiều thuộc tính nhận dạng sau:

Thuộc tính Nội dung mô tả
className
ancestorClassName Tên lớp của thành phần mẹ trong hệ phân cấp giao diện người dùng của phần tử. Đối tượng cấp trên là bất kỳ nút mẹ nào trong hệ phân cấp giao diện người dùng của phần tử, bao gồm cả chính phần tử đó.
resourceId
resourceIdRegex Biểu thức chính quy Java để khớp với resourceId.
contentDescription
contentDescriptionRegex Biểu thức chính quy Java để so khớp với contentDescription.
text (xuất hiện trên màn hình)
textRegex Biểu thức chính quy Java để so khớp với text.
groupViewChildPosition, recyclerViewChildPosition hoặc adapterViewChildPosition Biểu thị vị trí con của một tiện ích giao diện người dùng tuỳ thuộc vào loại tiện ích mẹ của tiện ích đó.

Thông thường, các thuộc tính này không được xác định, ví dụ: một nút có thể không có văn bản và nội dung mô tả. Ngay cả khi có một số giá trị thuộc tính, các giá trị đó có thể không phải là duy nhất trên một màn hình ứng dụng nhất định (bao gồm cả resourceId).

Ví dụ: thông thường, bạn chỉ có thể phân biệt giữa các mục của danh sách bằng cách sử dụng các vị trí con khác nhau trong tiện ích mẹ. Điều này có nghĩa là thường thì việc chỉ sử dụng một chỉ số mô tả phần tử để xác định tiện ích giao diện người dùng là chưa đủ. Do đó, thuộc tính elementDescriptors của hành động chứa một trình tự mã mô tả phần tử được sắp xếp sao cho thuộc tính đầu tiên tương ứng với tiện ích giao diện người dùng mục tiêu, thuộc tính thứ hai tương ứng với tiện ích mẹ của tiện ích giao diện người dùng mục tiêu, v.v. Tiện ích giao diện người dùng mục tiêu của một hành động được so khớp khi tất cả các chỉ số mô tả phần tử của tiện ích đó khớp với hệ phân cấp phụ của tiện ích giao diện người dùng tương ứng.

Sau đây là ví dụ về tập lệnh Robo có thay đổi văn bản và thao tác nhấp, cả hai đều yêu cầu bạn xác định tiện ích giao diện người dùng mục tiêu bằng cách sử dụng phần mô tả phần tử được cung cấp:

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

Tuỳ chọn thực thi

Bạn có thể tuỳ ý thêm tiền tố cho danh sách các hành động trong tập lệnh Robo bằng một đối tượng JSON chỉ định các tuỳ chọn thực thi cho tập lệnh Robo đó. Tiêu đề cấu hình này bắt đầu bằng từ khoá roboscript, theo sau là thông tin mô tả dưới dạng JSON của các tuỳ chọn thực thi mong muốn.

Tập lệnh Robo hỗ trợ các lựa chọn thực thi sau đây:

  • executionMode – các tuỳ chọn thực thi được áp dụng khi tập lệnh Robo đang chạy:
    • strict – nếu được đặt thành true, tập lệnh Robo sẽ không sử dụng tính năng so khớp một phần, bỏ qua hành động hiện tại và tạm ngưng. Tức là tập lệnh Robo được thực thi dưới dạng kiểm thử đo lường thông thường và không thành công ngay khi không thể thực hiện bất kỳ hành động nào của tập lệnh. Theo mặc định, giá trị này là false.
    • dismiss_popups – nếu được đặt thành true, quy trình kiểm thử Robo sẽ loại bỏ mọi hộp thoại không mong muốn trong khi thực hiện tập lệnh Robo ngay cả ở chế độ strict. Tuỳ chọn này không có hiệu lực khi không ở chế độ strict. Theo mặc định, giá trị này là false.
    • notify – nếu bạn đặt thành false, tập lệnh Robo sẽ không hiển thị thông báo trên màn hình ở đầu và cuối quá trình thực thi. Theo mặc định, giá trị này là true.
  • postscript – các tuỳ chọn thực thi được áp dụng sau khi hoàn tất tập lệnh Robo:
    • terminate – nếu bạn đặt thành true, thì quy trình kiểm thử Robo sẽ ngừng thu thập dữ liệu sau khi tập lệnh Robo hoàn tất. Theo mặc định, giá trị này là false.

Sau đây là ví dụ về tập lệnh Robo được thực thi ở chế độ strict mà không có thông báo trên màn hình sẽ ngủ trong 3 giây, sau đó quá trình thu thập thông tin sẽ dừng:

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

Tham số mẫu

Thông số mẫu là phần giữ chỗ trong tập lệnh Robo được thay thế bằng giá trị thực tế khi kiểm thử Robo tải tập lệnh Robo đó để thực thi. Các tham số mẫu có tiền tố là dấu gạch dưới đôi, theo sau là dấu phần trăm và có hậu tố là dấu phần trăm, theo sau là dấu gạch dưới đôi.

Tập lệnh Robo hỗ trợ thông số mẫu sau:

  • __%APP_PACKAGE_NAME%__ – tên gói của ứng dụng đang được kiểm thử.

Sau đây là ví dụ về một tập lệnh Robo dừng quy trình kiểm thử ứng dụng:

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

Nhận xét

Tập lệnh Robo có thể chứa các dòng nhận xét, là các dòng bắt đầu bằng # hoặc //.

Sau đây là ví dụ về tập lệnh Robo với một số nhận xét:

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

Khả năng

Theo mặc định, cho đến khi tất cả các hành động của tập lệnh Robo hoàn tất (hoặc ít nhất là đã thử), tập lệnh Robo vẫn hoạt động. Kiểm thử Robo liên tục cố gắng so khớp một hành động trong tập lệnh Robo bất cứ khi nào chọn một hành động để thực hiện. Tập lệnh Robo sử dụng các kỹ thuật sau để tăng độ mạnh mẽ:

Kỹ thuật Nội dung mô tả
So khớp một phần Nếu không thể so khớp hoàn toàn thao tác tập lệnh Robo hiện tại, thì tiêu chí so khớp sẽ được nới lỏng và quá trình so khớp sẽ được thử lại. Tính năng so khớp một phần không xem xét chỉ số mô tả phần tử ngoài cùng trong khi so khớp tiện ích giao diện người dùng mục tiêu của một hành động trong tập lệnh Robo.

Nếu việc so khớp một phần thành công, thao tác tập lệnh Robo tương ứng sẽ được thực hiện như bình thường. Kỹ thuật này hỗ trợ các trường hợp mà cấu trúc ứng dụng thay đổi, chẳng hạn như giữa các phiên bản ứng dụng, khi các phần tử màn hình được sắp xếp lại.

Bỏ qua thao tác hiện tại Nếu không thể so khớp toàn bộ hoặc một phần hành động trong tập lệnh Robo hiện tại, thì Robo sẽ cố gắng so khớp hành động trong tập lệnh Robo tiếp theo. Nếu hành động tiếp theo khớp hoàn toàn hoặc một phần, thì quy trình kiểm thử Robo sẽ bỏ qua (và không bao giờ quay lại) hành động tập lệnh Robo hiện tại và thực hiện hành động tiếp theo.

Kỹ thuật này hỗ trợ các trường hợp khi hành vi của ứng dụng thay đổi giữa các phiên bản hoặc không ổn định, ví dụ: khi hộp thoại không liên tục có thể xuất hiện ở các màn hình khác nhau trong quá trình ghi lại so với phát lại tập lệnh Robo.

Tạm ngưng Nếu các hành động hiện tại và tiếp theo của tập lệnh Robo đều không thể khớp toàn bộ hoặc một phần, thì tập lệnh Robo sẽ tạm thời bị tạm ngưng và quy trình kiểm tra Robo sẽ chọn một hành động để thực hiện bằng các chiến lược khác của tập lệnh đó. Sau khi thao tác này hoàn tất, quy trình kiểm thử Robo sẽ tiếp tục thực thi tập lệnh Robo.

Nếu không thể so khớp các hành động hiện tại hoặc tiếp theo của tập lệnh Robo, tập lệnh Robo sẽ vẫn bị tạm ngưng đối với số lượng hành động bất kỳ. Do đó, tập lệnh Robo không nhất thiết phải là phần mở đầu cho kiểm thử Robo và bạn có thể xen kẽ các hành động trong tập lệnh Robo với các hành động kiểm thử Robo tiêu chuẩn. Kỹ thuật này hỗ trợ các trường hợp khi hành vi của ứng dụng không ổn định hoặc khi các thay đổi giữa các phiên bản ứng dụng đủ lớn để kiểm thử Robo cần "lấp đầy khoảng trống" bằng các hành động tiêu chuẩn.

Mức độ ưu tiên

Nếu một tập lệnh Robo đạt đến maxNumberOfRuns, thì tập lệnh đó sẽ không thể được kích hoạt trong một lần thu thập dữ liệu nhất định. Nếu ngữ cảnh hiện tại có thể kích hoạt nhiều tập lệnh Robo, thì mức độ ưu tiên sẽ được xác định bằng cách chọn tập lệnh Robo theo thứ tự sau:

  1. Có thuộc tính contextDescriptor.
  2. priority cao nhất (theo mặc định, tất cả tập lệnh Robo đều có cùng priority thực thi là 1).
  3. Xuất hiện sớm nhất trong danh sách tập lệnh Robo, nếu các tập lệnh Robo có cùng mức độ ưu tiên.

Sau đây là ví dụ về một tệp có 3 tập lệnh Robo thực hiện cùng một thao tác và được kích hoạt bởi cùng một điều kiện – ứng dụng đang được kiểm thử ở nền trước:

[
  {
    "id": 1000,
    "description": "Robo script 1",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "DELAYED_MESSAGE_POSTED",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1001,
    "description": "Robo script 2",
    "priority": "2",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "DELAYED_MESSAGE_POSTED",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1002,
    "description": "Robo script 3",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "DELAYED_MESSAGE_POSTED",
        "delayTime": 3000
      }
    ]
  }
]

Khi ứng dụng đang được kiểm thử ở nền trước, Robo sẽ kích hoạt các sự kiện sau theo thứ tự:

  1. "Robo script 2" vì nó có mức độ ưu tiên cao nhất.
  2. "Robo script 1" vì tập lệnh này xuất hiện sớm hơn trong số các tập lệnh Robo hiện hành còn lại có cùng mức độ ưu tiên.
  3. "Robo script 3" làm tập lệnh Robo áp dụng gần đây nhất.

Lần chạy lặp lại

Theo mặc định, Robo kích hoạt một tập lệnh Robo tối đa một lần trong quá trình thu thập dữ liệu. Bạn có thể điều chỉnh thông số này thông qua thuộc tính maxNumberOfRuns.

Sau đây là ví dụ về tập lệnh Robo đưa tính năng thử nghiệm ứng dụng vào chế độ nền tối đa 10 lần:

{
  "id": 1000,
  "maxNumberOfRuns": 10,
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  },
  "actions": [
    {
      "eventType": "GO_HOME"
    }
  ]
}

Giai đoạn thu thập dữ liệu

Bạn có thể áp dụng tập lệnh Robo ở nhiều giai đoạn của một lần thu thập dữ liệu Robo nhất định:

Giai đoạn thu thập dữ liệu Nội dung mô tả
pre_crawl Trước khi Robo khởi chạy và bắt đầu thu thập thông tin trong quá trình kiểm thử ứng dụng.
post_crawl Sau khi Robo hoàn tất việc thu thập thông tin về ứng dụng đang được kiểm thử. Thời lượng của tập lệnh Robo post_crawl không được vượt quá 15 giây, nếu không quá trình thu thập thông tin có thể bị chấm dứt do hết thời gian chờ.
crawl Giai đoạn thu thập dữ liệu chính, khi Robo thu thập thông tin trong quá trình thử nghiệm ứng dụng.
close_screen Khi Robo cố gắng quay lại (quay lại) từ một màn hình nhất định, khi tất cả các thao tác có thể thực hiện trên màn hình này được khám phá. Theo mặc định, Robo nhấn nút quay lại, điều này không mong muốn trong một số trường hợp.

Nếu thuộc tính crawlStage của tập lệnh Robo không được chỉ định, thì thuộc tính này sẽ được ngụ ý là crawl.

Sau đây là ví dụ về tập lệnh Robo xoá dữ liệu người dùng của ứng dụng đang được kiểm thử trước khi Robo bắt đầu thu thập dữ liệu đó:

{
  "id": 1000,
  "crawlStage": "pre_crawl",
  "actions": [
    {
      "eventType": "ADB_SHELL_COMMAND",
      "command": "pm clear __%APP_PACKAGE_NAME%__"
    }
  ]
}

Sau đây là ví dụ về tập lệnh Robo hướng dẫn Robo nhấp vào "Cancel" bất cứ khi nào nó cố gắng quay lại (quay lại) từ hộp thoại xác nhận:

{
  "id": 1000,
  "crawlStage": "close_screen",
  "maxNumberOfRuns": 999,
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/confirmation_dialog"
      }
    ]
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "elementDescriptors": [
        {
          "text": "Cancel"
        }
      ]
    }
  ]
}

Hành động có điều kiện

Tập lệnh Robo có thể chứa các hành động có điều kiện. Hành động có điều kiện có thêm 3 thuộc tính mô tả cách Robo thực hiện các hành động đó:

Thuộc tính Nội dung mô tả
priority Mức độ ưu tiên của hành động có điều kiện này so với các hành động có điều kiện khác trong tập lệnh Robo chứa hành động đó. Theo mặc định, tất cả các hành động có điều kiện đều có mức độ ưu tiên là 1.
maxNumberOfRuns Số lần có thể thực hiện hành động có điều kiện này trong một lần thực thi tập lệnh Robo chứa hành động đó. Theo mặc định, tất cả các hành động có điều kiện chỉ có thể được thực hiện tối đa một lần trong một lần thực thi tập lệnh Robo chứa các hành động đó.
contextDescriptor Ngữ cảnh/điều kiện kích hoạt hành động có điều kiện này. Tệp này có cùng cấu trúc và cung cấp những tính năng tương tự như ContextDescriptor của tập lệnh Robo

Khi được kích hoạt, tập lệnh Robo sẽ thực hiện lần lượt các hành động không có điều kiện theo thứ tự xuất hiện. Nếu một tập lệnh Robo chứa các hành động có điều kiện, thì các hành động đó sẽ được xem xét mỗi khi chọn một hành động không có điều kiện để thực hiện. Nếu bất kỳ hành động có điều kiện nào được kích hoạt và chọn dựa trên mức độ ưu tiên của hành động đó và số lần chạy còn lại, thì tập lệnh Robo sẽ thực hiện hành động có điều kiện này. Nếu không, tập lệnh Robo sẽ thực hiện hành động không có điều kiện sau. Để hợp lệ, tập lệnh Robo phải chứa ít nhất một hành động không có điều kiện.

Sau đây là ví dụ về một tập lệnh Robo không có điều kiện với một thao tác có điều kiện đóng các hộp thoại bật lên nếu chúng xuất hiện tại bất kỳ thời điểm nào trong quá trình thực thi tập lệnh Robo:

{
  "id": 1000,
  "actions": [
    {
      "description": "Dismiss popup",
      "maxNumberOfRuns": 100,
      "contextDescriptor": {
        "condition": "default_launcher_shown",
        "negateCondition": true
      },
      "eventType": "GO_HOME"
    },
    {
      "description": "Screen off",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 26"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "DELAYED_MESSAGE_POSTED",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "DELAYED_MESSAGE_POSTED",
      "delayTime": 10000
    }
}

Đang bỏ qua hành động

Tập lệnh Robo có thể chứa hướng dẫn để Robo bỏ qua các tiện ích giao diện người dùng cụ thể hoặc tất cả tiện ích giao diện người dùng trên một màn hình cụ thể. Các hướng dẫn này được biểu thị là bỏ qua "hành động" bằng eventType ELEMENT_IGNOREDALL_ELEMENTS_IGNORED tương ứng.

Bất cứ khi nào thuộc tính contextDescriptor của tập lệnh Robo chứa các thao tác bỏ qua khớp với một màn hình nhất định, Robo sẽ không tương tác với bất kỳ tiện ích giao diện người dùng nào được các thao tác bỏ qua nhắm đến (trừ khi một số thao tác tập lệnh Robo khác khiến Robo thực hiện một thao tác trên một trong các tiện ích giao diện người dùng bị bỏ qua).

Tập lệnh Robo có thể chứa kết hợp các hành động bỏ qua, hành động có điều kiện và không có điều kiện. Không giống như các thao tác tập lệnh Robo khác, thao tác bỏ qua được áp dụng miễn là contextDescriptor của tập lệnh Robo chứa khớp với màn hình trong quá trình thu thập dữ liệu Robo, bất kể giá trị của thuộc tính prioritymaxNumberOfRuns.

Sau đây là ví dụ về một tệp có hai tập lệnh Robo. Tập lệnh Robo đầu tiên khiến Robo bỏ qua tất cả tiện ích giao diện người dùng trên màn hình chứa một tiện ích giao diện người dùng có mã nhận dạng tài nguyên "my.app.package:id/ignored_screen". Tập lệnh Robo thứ hai khiến cho Robo bỏ qua các tiện ích giao diện người dùng có mã tài nguyên khớp với biểu thức chính quy Java ".*:id/done" trên màn hình chứa tiện ích giao diện người dùng có mã tài nguyên "my.app.package:id/main_screen":

[
  {
    "id": 1000,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/ignored_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ALL_ELEMENTS_IGNORED"
      }
    ]
  },
  {
    "id": 1001,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/main_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ELEMENT_IGNORED",
        "elementDescriptors": [
          {
            "resourceIdRegex": ".*:id/done"
          }
        ]
      }
    ]
  }
]

Hỗ trợ RecyclerView và AdapterView

Các thành phần con của tiện ích RecyclerView và AdapterView được tải động và có thể hiển thị nhiều lần vuốt ra khỏi màn hình hiện tại. Vì kích thước của màn hình và số lần vuốt cần thiết để chuyển đến thành phần con này, khác nhau đối với các kiểu dáng thiết bị khác nhau, nên việc dựa vào vị trí dữ liệu của thành phần con là tuyệt đối sẽ hiệu quả hơn nhiều. Đây là một phương pháp ít hiệu quả hơn khi dựa vào số lần vuốt cần thiết để đưa thành phần con này lên màn hình, sau đó sử dụng vị trí màn hình của thành phần con đó.

Do đó, tập lệnh Robo sẽ ghi lại các vị trí dữ liệu tuyệt đối của các thành phần con RecyclerView là mục tiêu của các hành động trong tập lệnh Robo dưới dạng recyclerViewChildPosition. Tập lệnh Robo cũng ghi lại vị trí dữ liệu tuyệt đối của các thành phần con AdapterView là mục tiêu của các thao tác tập lệnh Robo dưới dạng adapterViewChildPosition.

Các thao tác trên RecyclerView và AdapterView con được thực hiện theo các bước sau:

  1. Quá trình kiểm thử Robo đảm bảo rằng thành phần con tương ứng sẽ hiện trên màn hình thông qua một thao tác định vị trên RecyclerView hoặc AdapterView.

  2. Kiểm thử Robo thực hiện thao tác đã ghi trực tiếp trên phần tử con, vì phần tử con này đã hiển thị trên màn hình.

Sau đây là ví dụ về thao tác nhấp trên một phần tử con của 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
    }
  ]
}

Sau đây là ví dụ về thao tác nhấp trên thành phần con 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
    }
  ]
}

Ghi lại tập lệnh Robo trong Android Studio và chạy tập lệnh đó trong Test Lab

Bạn có thể tạo tập lệnh Robo trong Android Studio. Tập lệnh này sẽ được lưu dưới dạng tệp JSON. Sau đó, bạn có thể tải tệp JSON lên Firebase Test Lab bằng ứng dụng và chạy kiểm thử tương ứng.

Khi bạn chạy kiểm thử Robo bằng một tập lệnh đính kèm, trước tiên, kiểm thử Robo sẽ thực hiện các bước thông qua các hành động có trong tập lệnh trước rồi mới tiến hành kiểm thử ứng dụng như thường lệ.

Để tạo tệp JSON tập lệnh Robo trong Android Studio, hãy làm theo các bước trong phần Ghi lại tập lệnh Robo bằng Test Lab trong Android Studio.

Hành động của tập lệnh Robo

Thuộc tính không bắt buộc phổ biến sau đây áp dụng cho tất cả hành động:

  • description – giúp theo dõi quá trình thực thi hành động tập lệnh Robo này trong đầu ra kiểm thử Robo.

Câu nhận định

Nếu điều kiện được xác nhận là đúng, tập lệnh Robo sẽ tiếp tục thực hiện thao tác tiếp theo, có thể là một xác nhận khác. Nếu không, quá trình thực thi tập lệnh Robo sẽ bị tạm dừng do không xác nhận được.

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Nội dung mô tả
"eventType": "ASSERTION" --
contextDescriptor Mô tả ngữ cảnh hoặc điều kiện được xác nhận. Tệp này có cùng cấu trúc và cung cấp những tính năng tương tự như ContextDescriptor của tập lệnh Robo.

Sau đây là ví dụ về câu nhận định tập lệnh Robo kiểm tra để đảm bảo rằng ứng dụng đang được kiểm thử đang chạy ở nền trước:

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

Sau đây là ví dụ về câu nhận định tập lệnh Robo kiểm tra xem một tiện ích giao diện người dùng có mã nhận dạng tài nguyên "com.google.samples.apps.topeka:id/done" có xuất hiện trên màn hình hay không:

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

Sau đây là ví dụ về câu xác nhận của tập lệnh Robo để kiểm tra nhằm đảm bảo rằng "Settings" KHÔNG được phát hiện trên màn hình bằng công nghệ Nhận dạng ký tự quang học (OCR):

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

Nhấp chuột

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Nội dung mô tả
eventType Chỉ định loại thao tác tập lệnh Robo.
"eventType": "VIEW_CLICKED" Nhấp vào phần tử mục tiêu của chương trình kiểm thử ứng dụng.
"eventType": "SOFT_KEYBOARD_CLICK" Nhấp vào phần tử đích của bàn phím mềm.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Nhấp vào các phần tử ngẫu nhiên của bàn phím mềm tối đa là maxNumberOfRuns lần.
"eventType": "LIST_ITEM_CLICKED" Được trình ghi tập lệnh Robo trong Android Studio sử dụng để nhấp vào các mục trong danh sách.
elementDescriptors Xác định tiện ích giao diện người dùng đã nhấp bằng hệ phân cấp giao diện người dùng Android. Loại trừ lẫn nhau với visionText.
visionText Xác định phần tử được nhấp bằng công nghệ nhận dạng ký tự quang học (OCR). Loại trừ lẫn nhau với elementDescriptors.
matchIndex Chỉ định chỉ mục của lần xuất hiện phần tử mục tiêu được so khớp, khi phần tử mục tiêu được xác định bằng visionText. Nếu là 0, hành động tập lệnh Robo sẽ chọn phần tử được so khớp đầu tiên, nếu là 1, hành động tập lệnh Robo sẽ chọn phần tử được so khớp thứ hai, v.v. Thứ tự được xác định từ trái sang phải, từ trên xuống dưới. Giá trị mặc định là 0 (kết quả trùng khớp đầu tiên được chọn).
maxNumberOfRuns Chỉ định số lần nhấp vào một phần tử ngẫu nhiên của bàn phím mềm, khi eventTypeSOFT_KEYBOARD_RANDOM_CLICK. Giá trị mặc định là 1.

Sau đây là ví dụ về thao tác của tập lệnh Robo nhấp vào một nút có mã tài nguyên "com.google.samples.apps.topeka:id/done":

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

Sau đây là ví dụ về một thao tác tập lệnh Robo nhấp vào lần xuất hiện thứ hai của từ "Search" được phát hiện trên màn hình bằng OCR:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Search",
  "matchIndex": 1
}

Sau đây là ví dụ về một thao tác tập lệnh Robo nhấp vào một phần tử bàn phím mềm có nội dung mô tả "Emoji button":

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

Sau đây là ví dụ về một thao tác của tập lệnh Robo nhấp vào các phần tử bàn phím mềm ngẫu nhiên tối đa 5 lần:

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

Tắt bàn phím mềm

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "DISABLE_KEYBOARD" --

Sau đây là ví dụ về một thao tác tập lệnh Robo vô hiệu hoá bàn phím mềm:

{
  "eventType": "DISABLE_KEYBOARD"
}

Thực thi lệnh adb shell

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "ADB_SHELL_COMMAND" --
command Lệnh shell Cầu gỡ lỗi Android (adb) để thực thi.

Thuộc tính sau đây là không bắt buộc:

  • expectedOutputRegex – kết quả dự kiến của lệnh dưới dạng biểu thức chính quy Java. Nếu kết quả không khớp, thì thao tác với tập lệnh Robo sẽ không thành công. Theo mặc định, giá trị này là một chuỗi trống, có nghĩa là kết quả không được kiểm tra.

Sau đây là ví dụ về một hành động trong tập lệnh Robo giúp xoá dữ liệu người dùng của ứng dụng đang được kiểm thử:

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

Cấp quyền

Thao tác này được ghi lại bằng trình ghi tập lệnh Robo trong Android Studio để tương thích ngược với Trình ghi lại quá trình kiểm thử Espresso. Kiểm thử Robo cấp tất cả quyền cho ứng dụng đang được kiểm thử ở đầu mỗi lần thu thập thông tin. Do đó, thao tác này không có tác dụng. ĐỪNG sử dụng thao tác này trong tập lệnh Robo.

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "PERMISSIONS_REQUEST" --

Bỏ qua tất cả các phần tử trên màn hình

Thao tác này khiến Robo bỏ qua tất cả các phần tử trên màn hình bất kỳ kích hoạt tập lệnh Robo chứa.

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "ALL_ELEMENTS_IGNORED" --

Sau đây là ví dụ về một thao tác tập lệnh Robo khiến Robo bỏ qua tất cả các phần tử trên màn hình:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Bỏ qua một phần tử

Thao tác này khiến Robo bỏ qua một phần tử (hoặc các phần tử) khớp với elementDescriptors đã chỉ định.

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "ELEMENT_IGNORED" --
elementDescriptors Xác định(các) tiện ích giao diện người dùng bị bỏ qua bằng hệ phân cấp giao diện người dùng Android.

Thuộc tính sau đây là không bắt buộc:

  • ignoreChildren – nếu được đặt thành true, Robo cũng bỏ qua tất cả các phần tử con của(các) tiện ích giao diện người dùng bị bỏ qua. Theo mặc định, giá trị này là false.

Sau đây là ví dụ về một hành động trong tập lệnh Robo khiến Robo bỏ qua tất cả các phần tử có nội dung mô tả bắt đầu bằng "Avatar":

{
  "eventType": "ELEMENT_IGNORED",
  "elementDescriptors": [
    {
      "contentDescriptionRegex": "Avatar.*"
    }
  ]
}

Văn bản đầu vào

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
eventType Chỉ định loại thao tác tập lệnh Robo.
"eventType": "VIEW_TEXT_CHANGED" Nhập văn bản đã cho vào tiện ích giao diện người dùng mục tiêu.
"eventType": "ENTER_TEXT" nhập văn bản đã cho vào tiện ích giao diện người dùng mục tiêu, sau đó gửi sự kiện KEYCODE_ENTER đến tiện ích giao diện người dùng này.
elementDescriptors Xác định tiện ích giao diện người dùng mục tiêu bằng hệ phân cấp giao diện người dùng Android.
replacementText Văn bản cần nhập vào tiện ích giao diện người dùng mục tiêu.

Sau đây là ví dụ về một thao tác tập lệnh Robo nhập "John" vào một tiện ích giao diện người dùng có mã nhận dạng tài nguyên "com.google.samples.apps.topeka:id/first_name":

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

Nhấp và giữ

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Xác định tiện ích giao diện người dùng mục tiêu bằng hệ phân cấp giao diện người dùng Android. Tương tác lẫn nhau với visionText.
visionText Xác định phần tử được nhấp dài bằng công nghệ Nhận dạng ký tự quang học (OCR). Dành riêng cho nhau với elementDescriptors.
matchIndex Chỉ định chỉ mục của lần xuất hiện phần tử mục tiêu được so khớp, khi phần tử mục tiêu được xác định bằng visionText. Nếu là 0, hành động tập lệnh Robo sẽ chọn phần tử được so khớp đầu tiên, nếu là 1, hành động tập lệnh Robo sẽ chọn phần tử được so khớp thứ hai, v.v. Thứ tự được xác định từ trái sang phải, từ trên xuống dưới. Giá trị mặc định là 0 (kết quả trùng khớp đầu tiên được chọn).

Thuộc tính sau đây là không bắt buộc:

  • delayTime – chỉ định thời lượng nhấn và giữ của một lượt nhấp và giữ, tính bằng mili giây.

Sau đây là ví dụ về một thao tác tập lệnh Robo thực hiện một lượt nhấp kéo dài 5 giây trên một tiện ích giao diện người dùng có nội dung mô tả "Avatar 8":

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

Thực hiện cử chỉ một điểm

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "ONE_POINT_GESTURE" --
coordinates Hai toạ độ cho một cử chỉ một điểm, được định dạng là "(x1,y1)->(x2,y2)" dưới dạng tỷ lệ phần trăm hoặc pixel.

Thuộc tính sau đây là không bắt buộc:

  • dragAndDrop – nếu được đặt thành true, cử chỉ một điểm sẽ thực hiện thao tác kéo và thả. Theo mặc định, giá trị này là false.

Sau đây là ví dụ về thao tác cử chỉ một điểm của tập lệnh Robo thực hiện thao tác vuốt xuống:

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

Thực hiện cử chỉ hai điểm

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "TWO_POINT_GESTURE" --
coordinates Bốn toạ độ cho một cử chỉ hai điểm, được định dạng là "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" dưới dạng tỷ lệ phần trăm hoặc pixel.

Sau đây là ví dụ về một thao tác tập lệnh Robo thực hiện cử chỉ chụm vào:

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

Thực hiện thao tác IME

Thao tác này sẽ nhấn nút hành động hiện tại (ví dụ: tiếp theo, xong và tìm kiếm) trên Trình chỉnh sửa phương thức nhập (IME) cho tiện ích giao diện người dùng mục tiêu đã chỉ định.

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Xác định tiện ích giao diện người dùng mục tiêu bằng hệ phân cấp giao diện người dùng Android.

Sau đây là ví dụ về một thao tác tập lệnh Robo thực hiện thao tác IME trên một tiện ích giao diện người dùng có mã nhận dạng tài nguyên "com.google.samples.apps.topeka:id/first_name":

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

Nhấn nút quay lại

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
eventType Chỉ định loại hành động của tập lệnh Robo.
"eventType": "PRESSED_BACK" Gửi sự kiện KEYCODE_BACK đến thiết bị.
"eventType": "PRESSED_BACK_EMULATOR_28" Được trình ghi tập lệnh Robo trong Android Studio sử dụng để nhấn nút quay lại trên trình mô phỏng API 28.

Sau đây là ví dụ về thao tác nhấn quay lại trong tập lệnh Robo:

{
  "eventType": "PRESSED_BACK"
}

Nhấn vào nút màn hình chính

Thao tác này sẽ gửi một sự kiện KEYCODE_HOME tới thiết bị.

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "GO_HOME" --

Sau đây là ví dụ về một thao tác tập lệnh Robo nhấn vào màn hình chính:

{
  "eventType": "GO_HOME"
}

Cuộn một phần tử vào khung hiển thị

Thao tác này khiến Robo kiểm thử cuộn về phía trước tiện ích giao diện người dùng khớp với elementDescriptors đã chỉ định cho đến khi tiện ích giao diện người dùng khớp với childElementDescriptors đã chỉ định xuất hiện trên màn hình hoặc không thể cuộn tiện ích đã cuộn nữa hoặc đã đạt đến số lần cuộn tối đa là 50.

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Xác định tiện ích giao diện người dùng cuộn bằng hệ phân cấp giao diện người dùng Android.
childElementDescriptors Xác định tiện ích giao diện người dùng cần cuộn đến bằng hệ phân cấp giao diện người dùng Android.

Sau đây là ví dụ về một thao tác tập lệnh Robo cuộn tiện ích giao diện người dùng bằng mã nhận dạng tài nguyên "my.app.package:id/scrollable_card_container" cho đến khi tiện ích giao diện người dùng có văn bản "Orange" xuất hiện trên màn hình (hoặc không thể cuộn thêm hoặc đã đạt đến số lần cuộn tối đa là 50):

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

Trượt

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "VIEW_SWIPED" --
swipeDirection Chỉ định hướng vuốt:
  • Left
  • Right
  • Up
  • Down
  • ForwardDown hoặc Right tuỳ thuộc vào khả năng cuộn theo chiều dọc hoặc chiều ngang của tiện ích giao diện người dùng mục tiêu.
  • BackwardUp hoặc Left tuỳ thuộc vào khả năng cuộn theo chiều dọc hoặc chiều ngang của tiện ích giao diện người dùng đích.
elementDescriptors Xác định tiện ích giao diện người dùng mục tiêu bằng hệ phân cấp giao diện người dùng Android.

Sau đây là ví dụ về một thao tác tập lệnh Robo vuốt lên một tiện ích giao diện người dùng có mã nhận dạng tài nguyên "my.app.package:id/custom_content":

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

Chụp ảnh màn hình

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "TAKE_SCREENSHOT" --
screenshotName Chỉ định tên tệp ảnh chụp màn hình.

Sau đây là ví dụ về một hành động trong tập lệnh Robo chụp ảnh màn hình:

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

Nhấn vào một điểm trên màn hình

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "POINT_TAP" --
pointTapXCoordinate Toạ độ X theo pixel của điểm nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent.
pointTapYCoordinate Toạ độ Y theo pixel của điểm nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent.
pointTapXPercent Toạ độ X theo tỷ lệ phần trăm của điểm nhấn. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate.
pointTapYPercent Toạ độ Y theo tỷ lệ phần trăm của điểm nhấn. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate.

Sau đây là ví dụ về thao tác trong tập lệnh Robo nhấn vào giữa màn hình:

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

Nhấn vào một điểm trong một phần tử

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent Toạ độ X theo tỷ lệ phần trăm trong phần tử mục tiêu.
pointTapYPercent Toạ độ Y theo tỷ lệ phần trăm trong phần tử mục tiêu.
elementDescriptors Xác định tiện ích giao diện người dùng mục tiêu bằng hệ phân cấp giao diện người dùng Android.

Sau đây là ví dụ về thao tác của tập lệnh Robo di chuyển thanh trượt của thanh tua sang phải:

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

Chấm dứt quá trình thu thập dữ liệu

Thao tác này sẽ dừng kiểm thử Robo.

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "TERMINATE_CRAWL" --

Sau đây là ví dụ về thao tác của tập lệnh Robo làm dừng thử nghiệm Robo:

{
  "eventType": "TERMINATE_CRAWL"
}

Đợi

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "DELAYED_MESSAGE_POSTED" --
delayTime Chỉ định thời gian chờ, tính bằng mili giây.

Sau đây là ví dụ về một hành động tập lệnh Robo chờ 3 giây:

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

Chờ một phần tử

Thao tác này khiến quy trình kiểm thử Robo chờ một phần tử xuất hiện trên màn hình trong khoảng thời gian chờ đã chỉ định.

Bảng sau đây liệt kê các thuộc tính bắt buộc:

Thuộc tính Mô tả
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Chỉ định thời gian chờ, tính bằng mili giây.
elementDescriptors Xác định tiện ích giao diện người dùng đã chờ bằng hệ phân cấp giao diện người dùng Android.

Sau đây là ví dụ về một thao tác tập lệnh Robo chờ tối đa 30 giây để một tiện ích giao diện người dùng có mã nhận dạng tài nguyên "my.app.package:id/confirmation_button" xuất hiện trên màn hình:

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

Các bước tiếp theo