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ấu trúc, chức năng, cách sử dụng, bản ghi và các thao tác. Tập lệnh Robo là các bài kiểm thử tự động hoá các công việc đảm bảo chất lượng (QA) theo cách 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à chiến lược kiểm thử trước khi ra mắt. 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ỉ dành cho 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 phần Chạy tập lệnh Robo.

Giới thiệu

Tập lệnh Robo được cung cấp để 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) đang kiểm thử ứng dụng.

Sau đây là ví dụ về tập lệnh Robo đăng nhập người dùng vào một ứng dụng, được kích hoạt khi quá trình kiểm thử ứng dụng 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+ cho tập lệnh Robo

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

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

  • Xác nhận
  • Nhấp chuột
  • Nhấp và giữ
  • Trượt
  • Bỏ qua tất cả(các) phần tử
  • Đợi
  • Chụp ảnh màn hình
  • Chấm dứt thu thập thông tin

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 trình mô tả ngữ cảnh sau đây được hỗ trợ trong iOS+:

  • Đã hiển thị ứng dụng trong giai đoạn thử nghiệm
  • Hiện có phần tử
  • Đã thực hiện thao tác theo tập lệnh không phải 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ới cá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 của riêng chú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 Robo này, nhưng bạn có thể gặp khó khăn khi phân biệt các hành động với các tập lệnh Robo này trong kết quả thu thập dữ liệu. 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 của mình để tránh mọi xung đột.
description Tương tự như id nhưng mô tả cụ thể hơn.
crawlStage Giai đoạn của quy trình thu thập thông tin Robo sẽ áp dụng tập lệnh Robo này. Theo mặc định, đây là giai đoạn thu thập dữ liệu 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ả cá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 tập lệnh Robo một lần.
contextDescriptor Mô tả bối cảnh hoặc điều kiện kích hoạt tập lệnh Robo này. Nếu bạn bỏ qua, điều kiện kích hoạt của tập lệnh Robo này được coi là luôn đáp ứng; nói cách khác, tập lệnh Robo là vô điều kiện.
actions Tất cả các hành động của tập lệnh Robo này.

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

Sau đây là ví dụ về một tệp có 2 tập lệnh Robo vô điều kiện, mỗi tập lệnh có một hành động được thực thi một lần khi bắt đầu quá trình thu thập thông tin:

[
  {
    "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 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 đã hiện diện trên màn hình.
"condition": "element_disabled" 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à không tương tác đượ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 quá trình kiểm thử ứng dụng đang chạy ở nền trước.
"condition": "default_launcher_shown" Kiểm tra để đảm bảo rằng màn hình chính của một 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 thử nghiệm Robo thực hiện không phải là hành động của tập lệnh Robo.
negateCondition Nếu bạn đặt thành true, thì sẽ phủ định condition. Ví dụ: bạn có thể sử dụng thuộc tính này để kiểm tra xem có phải tiện ích giao diện người dùng KHÔNG xuất hiện trên màn hình hay không, hoặc quá trình kiểm thử ứng dụng KHÔNG chạy ở nền trước.
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 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 của tập lệnh không phải Robo được thực hiện trước đó. Tập lệnh 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 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" 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ởi "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 nhóm gồm một hoặc nhiều cặp thuộc tính-giá trị như được mô tả trong bảng sau:

Thuộc tính Nội dung mô tả
eventType Chỉ định loại thao tác, ví dụ: nhấp chuột, chỉnh sửa văn bản, v.v. Bắt buộc đối với mọi thao tác.
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ị là false.
replacementText Văn bản để nhập vào tiện ích giao diện người dùng đích. Bắt buộc để thực hiện 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 thao tác chờ.
pointTapXCoordinatepointTapYCoordinate Toạ độ pixel X và Y của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent. Cần thiết cho các thao tác nhấn điểm.
pointTapXPercentpointTapYPercent Phần trăm toạ độ X và Y của điểm đã nhấn. Dành riêng lẫn nhau với pointTapXCoordinatepointTapYCoordinate. Cần thiết cho các thao tác nhấn đ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"
  }
]

Mã mô tả phần tử

Chỉ số mô tả phần tử xác định một tiện ích giao diện người dùng bằng cách sử dụng một hoặc nhiều thuộc tính xác định sau đây:

Thuộc tính Nội dung mô tả
className
ancestorClassName Tên lớp đối tượng cấp trên 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 để 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 để 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 xác định, chẳng hạn như một nút có thể không có văn bản và phần mô tả nội dung. Ngay cả khi có một số giá trị thuộc tính, các giá trị thuộc tính đó 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 thao tác sẽ được so khớp khi tất cả các mã mô tả phần tử của tiện ích đó đều 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ề một tập lệnh Robo có thao tác thay đổi văn bản và nhấp chuột, cả hai đều yêu cầu bạn phải xác định tiện ích giao diện người dùng mục tiêu bằng cách sử dụng mã mô tả phần tử đã 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à phần biểu diễn 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 lựa chọn thực thi được áp dụng khi tập lệnh Robo đang chạy:
    • strict – nếu bạn đặ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. Điều đó nghĩa 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à sẽ 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 này. Theo mặc định, thuộc tính 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ông báo trên màn hình khi bắt đầu và kết thúc quá trình thực thi. Theo mặc định, giá trị này là true.
  • postscript – các lựa chọn thực thi được áp dụng sau khi tập lệnh Robo hoàn tất:
    • terminate – nếu bạn đặt thành true, thử nghiệm Robo sẽ ngừng thu thập thông tin 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ề một 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. Tập lệnh này 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
  }
]

Thông 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 thử nghiệm Robo tải tập lệnh Robo đó để thực thi. Các thông số mẫu có tiền tố là dấu gạch dưới kép, theo sau là dấu phần trăm, và được cố định bằng 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 chương trình kiểm thử ứng dụng.

Sau đây là ví dụ về 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%__"
  }
]

Bình luận

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 được hoàn tất (hoặc ít nhất là được 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 với một hành động của tập lệnh Robo bất cứ khi nào ứng dụng này 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:

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

Nếu so khớp một phần thành công, thao tác của 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 (ví dụ: giữa các phiên bản ứng dụng, khi các thành phần màn hình được sắp xếp lại).

Bỏ qua hành động hiện tại Nếu hành động của tập lệnh Robo hiện tại không thể khớp toàn bộ hoặc một phần, thì Robo sẽ cố gắng khớp với hành động tiếp theo của tập lệnh Robo. Nếu hành động tiếp theo khớp hoàn toàn hoặc một phần, kiểm thử Robo sẽ bỏ qua (và không bao giờ quay lại) hành động của 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 tình huống 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, chẳng hạn như khi hộp thoại không liên tục có thể xuất hiện ở nhiều màn hình trong quá trình ghi 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 nó. Sau khi bạn hoàn tất hành động này, thử nghiệm 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 đó, các tập lệnh Robo không nhất thiết phải là phần mở đầu cho thử nghiệm Robo mà bạn có thể xen kẽ các hành động của tập lệnh Robo với các hành động kiểm tra Robo tiêu chuẩn. Kỹ thuật này hỗ trợ các tình huống khi hành vi của ứng dụng không ổn định hoặc khi thay đổi giữa các phiên bản ứng dụng đủ lớn để quy trình kiểm thử Robo cần "lấp đầy khoảng trống" bằng các thao tác tiêu chuẩn.

Ưu tiên

Nếu tập lệnh Robo đạt đến maxNumberOfRuns, tập lệnh đó không thể được kích hoạt trong một lần thu thập dữ liệu nhất định nữa. Nếu bối cảnh hiện tại có thể kích hoạt nhiều tập lệnh Robo, mức độ ưu tiên sẽ được ưu tiên 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ả cá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 các tập lệnh Robo nếu các tập lệnh Robo không thay đổi 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 hành động và được kích hoạt bởi cùng một điều kiện – thử nghiệm ứng dụng đang chạy ở 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 thử nghiệm ứng dụng diễn ra ở nền trước, Robo sẽ kích hoạt các thao tác sau theo thứ tự:

  1. "Robo script 2" vì 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.

Chạy lặp lại

Theo mặc định, Robo kích hoạt tập lệnh Robo nhiều nhất một lần trong quá trình thu thập dữ liệu. Bạn có thể điều chỉnh giá trị 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

Tập lệnh Robo có thể được áp dụng ở các giai đoạn khác nhau của một lần thu thập thông tin 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 quá trình thu thập thông tin của ứng dụng dưới dạng kiểm thử.
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, ứng dụng sẽ khám phá tất cả các thao tác có thể thực hiện trên màn hình này. Theo mặc định, Robo sẽ nhấn vào nút quay lại. Đây là việc không nên làm 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 được ngụ ý là crawl.

Sau đây là ví dụ về tập lệnh Robo xoá dữ liệu người dùng trong quá trình kiểm thử ứng dụng 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" mỗi khi tìm cách 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 thao tác có điều kiện. Các hành động có điều kiện cò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 hành động có chứa tập lệnh Robo. Theo mặc định, tất cả các thao tác có điều kiện đều có mức độ ưu tiên là 1.
maxNumberOfRuns Số lần hành động có điều kiện này có thể được thực hiện trong một lần thực thi hành động có chứa tập lệnh Robo. Theo mặc định, tất cả các hành động có điều kiện đều có thể được thực hiện cùng một lần trong một lần thực thi các hành động có chứa tập lệnh Robo.
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 từng hành động không có điều kiện theo thứ tự xuất hiện. Nếu tập lệnh Robo chứa các thao tác có điều kiện, thì các thao tác đó sẽ được xem xét mọi lúc trước 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 đây. Để 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ề tập lệnh Robo vô điều kiện với thao tác có điều kiện đóng hộp thoại bật lên nếu các hộp thoại đó 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ả các tiện ích trên giao diện người dùng trên một màn hình cụ thể. Những lệnh này được biểu thị là bỏ qua "thao tác" 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 hành động 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 nhắm mục tiêu bằng các hành động bỏ qua đó (trừ phi một số hành động khác của tập lệnh Robo khiến Robo thực hiện hành động trên một trong những 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 khác của tập lệnh Robo, các thao tác bỏ qua sẽ được áp dụng, miễn là contextDescriptor của tập lệnh Robo khớp với màn hình trong quá trình thu thập thông tin Robo, bất kể giá trị của thuộc tính prioritymaxNumberOfRuns là gì.

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 mọi tiện ích giao diện người dùng trên màn hình chứa 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 tiện ích con của 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, là 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 kém hiệu quả hơn dựa vào số lần vuốt cần thiết để đưa thành phần con này đến màn hình và sau đó sử dụng vị trí màn hình.

Do đó, tập lệnh Robo ghi lại các vị trí dữ liệu tuyệt đối của phần tử 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 các vị trí dữ liệu tuyệt đối của các phần tử con AdapterView (là mục tiêu của các hành động của tập lệnh Robo dưới dạng adapterViewChildPosition).

Các thao tác trên thành phần con của RecyclerView và AdapterView đượ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. Việc kiểm thử Robo thực hiện hành động đã ghi lại ngay trên phần tử con, vì phần tử con đã 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 rồi chạy tập lệnh đó trong Phòng thử nghiệm

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

Khi bạn chạy thử nghiệm Robo có đính kèm một tập lệnh, Robo sẽ kiểm thử các bước đầu tiên thông qua các hành động được soạn theo tập lệnh, sau đó khám phá ứng dụng như bình thường.

Để tạo tệp JSON tập lệnh Robo trong Android Studio, hãy làm theo các bước trong bài viết Ghi tập lệnh Robo bằng Phòng thử nghiệm 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ả các thao tác:

  • description – giúp theo dõi việc thực thi hành động của tập lệnh Robo này trong kết quả kiểm thử Robo.

Xác nhận

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

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 của tập lệnh Robo kiểm tra để đảm bảo rằng quá trình kiểm thử ứng dụng đang chạy ở nền trước:

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

Sau đây là ví dụ về một 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ã 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 hành động của 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ử mục tiêu 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 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 được 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.
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 của tập lệnh Robo nhấp vào "Privacy Policy" đượ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": "VIEW_CLICKED",
  "visionText": "Privacy Policy"
}

Sau đây là ví dụ về một thao tác của tập lệnh Robo nhấp vào phần tử bàn phím mềm có thông tin mô tả nội dung "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 thành phần 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 của 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ạ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 thao tác của tập lệnh Robo xoá dữ liệu người dùng trong giai đoạn kiểm thử ứng dụng:

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

Cấp quyền

Thao tác này do trình ghi tập lệnh Robo trong Android Studio ghi lại để đảm bảo khả năng 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 hoạt động kiểm thử ứng dụng vào đầu mỗi lần thu thập dữ liệu, do đó, thao tác này không hoạt động. ĐỪNG sử dụng thao tác này trong tập lệnh Robo của bạn.

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 thành phần 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ọi màn hình 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ề thao tác của tập lệnh Robo khiến Robo bỏ qua tất cả các thành phần trên màn hình:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Bỏ qua một phần tử

Hành động này khiến Robo bỏ qua một (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ề thao tác của tập lệnh Robo khiến Robo bỏ qua tất cả các phần tử có phần mô tả nội dung bắt đầu bằng "Avatar":

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

Nhập văn bản

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": "VIEW_TEXT_CHANGED" Nhập văn bản đã cho vào tiện ích giao diện người dùng đích.
"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 để nhập vào tiện ích giao diện người dùng đích.

Sau đây là ví dụ về một thao tác của tập lệnh Robo nhập "John" vào 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. Dành riêng 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). Loại trừ lẫn nhau với elementDescriptors.

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

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

Sau đây là ví dụ về một thao tác của tập lệnh Robo thực hiện một lượt nhấp kéo dài 5 giây vào một tiện ích giao diện người dùng có thông tin mô tả nội dung "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 2 toạ độ cho cử chỉ một điểm, có định dạng là "(x1,y1)->(x2,y2)" dưới dạng phần trăm hoặc pixel.

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

  • dragAndDrop – nếu bạn đặ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 4 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ề thao tác của tập lệnh Robo thực hiện cử chỉ chụm:

{
  "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 của 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ã 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 vào 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 một 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 lại trên trình mô phỏng API 28.

Sau đây là ví dụ về một thao tác của tập lệnh Robo nhấn vào nút quay lại:

{
  "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 của 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 cho phép kiểm thử Robo cuộn tiện ích giao diện người dùng khớp với elementDescriptors được chỉ định cho đến khi tiện ích giao diện người dùng khớp với childElementDescriptors được 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ượt 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 của tập lệnh Robo cuộn tiện ích giao diện người dùng với mã 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ể thực hiện thêm thao tác cuộn nào nữa, hoặc đã đạt đến số lượng tối đa 50 lượt cuộn):

{
  "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 Xác định hướng vuốt:
  • Left
  • Right
  • Up
  • Down
  • ForwardDown hoặc Right tuỳ thuộc vào khả năng cuộn dọc hoặc 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 dọc hoặc ngang của tiện ích giao diện người dùng 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 vuốt lên trên một tiện ích giao diện người dùng có mã 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ề thao tác của 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ạ độ pixel X của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent.
pointTapYCoordinate Toạ độ pixel Y của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent.
pointTapXPercent Toạ độ phần trăm X của điểm đã nhấn. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate.
pointTapYPercent Toạ độ phần trăm Y của điểm được nhấn. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate.

Sau đây là ví dụ về thao tác của 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 Tỷ lệ phần trăm toạ độ X trong phần tử mục tiêu.
pointTapYPercent Tỷ lệ phần trăm toạ độ Y 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 thu thập thông tin

Hành động này sẽ dừng thử nghiệm 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 thao tác của 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 quá trình kiểm thử Robo phải đợi một phần tử xuất hiện trên màn hình trong 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 được chờ đợi 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 chờ tối đa 30 giây để tiện ích giao diện người dùng có mã 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