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, cách ghi và các thao tác. Tập lệnh Robo là các kiểm thử tự động hoá các tác vụ đả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à các chiến lược kiểm thử trước khi phát hành. Robo script là một tệp JSON mô tả một chuỗi 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 những cách sau:

  • Sử dụng tính năng ghi 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+)

  • 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, chẳng hạn như Gói ứng dụng Android (APK) của ứng dụng đang được kiểm thử.

Sau đây là ví dụ về một 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 ứ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 app_under_test_shown mặc định, 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 – chỉ cần là một chuỗi 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 cho iOS+ (Beta) có chức năng hỗ trợ hạn chế cho tập lệnh Robo. Cú pháp tập lệnh Robo cho iOS+ giống với cú pháp Android và các tính năng được hỗ trợ trên iOS+ 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ả(cá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 nhận dạng sau đây trong bộ mô tả phần tử được hỗ trợ trong iOS+:

  • Tên lớp học
  • Tên lớp tổ tiê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 sau đây trong bộ mô tả bối cảnh được hỗ trợ trong iOS+:

  • Ứng dụng đang được kiểm thử sẽ xuất hiện
  • Phần tử hiện diện
  • Đã thực hiện thao tác 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 đều 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 dữ liệu. Robo có 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 chúng, nhưng việc phân biệt các thao tác từ các tập lệnh Robo này trong đầu ra thu thập dữ liệu có thể gặp khó khăn. Bạn nên chỉ định một id duy nhất từ 1000 trở lên cho tập lệnh Robo để tránh mọi xung đột.
description Tương tự như id nhưng có tính mô tả cao 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 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 Robo có thể thực thi tập lệnh Robo này trong quá trình thu thập dữ liệu. Theo mặc định, Robo có thể thực thi một 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ị bỏ qua, điều kiện kích hoạt của tập lệnh Robo này được coi là luôn được đá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 thao tác của tập lệnh Robo này.

Một tệp duy nhất 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ó 2 tập lệnh Robo vô điều kiện, mỗi tập lệnh có một thao tác duy nhất được thực thi một lần khi bắt đầ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"
      }
    ]
  }
]

Bộ mô tả bối cảnh

Trình mô tả bối cảnh xác định bối cảnh hoặc điều kiện kích hoạt Robo Script 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 mộ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 xuất hiện 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 xuất hiện trên màn hình và được đánh dấu.
"condition": "app_under_test_shown" Kiểm tra để đảm bảo ứng dụng đang thử nghiệm đang chạy ở nền trước.
"condition": "default_launcher_shown" Kiểm tra xem màn hình chính của thiết bị có xuất hiện hay không, 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 nonRoboscriptActionCount hành động liên tiếp gần đây nhất mà kiểm thử Robo thực hiện không phải là hành động trong tập lệnh Robo.
negateCondition Nếu được đặt thành true, sẽ phủ định condition. Ví dụ: bạn có thể 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 phần mô tả thành phần xác định một tiện ích trên giao diện người dùng trên màn hình. Bạn có thể dùng điều kiện này 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 Bộ mô tả phần tử.
visionText Văn bản trên màn hình được phát hiện 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ố lượng thao tác liên tiếp không phải là thao tác bằng tập lệnh Robo đã được thực hiện trước đó. Điều kiện này được dùng kết hợp với điều kiện non_roboscript_action_performed để kích hoạt một tập lệnh Robo sau mỗi thao tác nonRoboscriptActionCount của Robo. Theo mặc định, giá trị này là 1.

Sau đây là ví dụ về một tập lệnh Robo được kích hoạt bởi một tiện ích trên giao diện người dùng có mã 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ề một 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ề một tập lệnh Robo chờ 5 giây sau mỗi thao tác Robo không phải là tập lệnh:

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

Hành động

Mỗi thao tác 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 giá trị thuộc tính, đượ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 chuột, chỉnh sửa văn bản, v.v. Bắt buộc đối với mọi hành động.
elementDescriptors Các giá trị mô tả xác định một tiện ích trên giao diện người dùng. Bắt buộc đối với tất cả các thao tác có một tiện ích trên 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 được đặt thành true, thao tác này sẽ bị bỏ qua khi không thể thực hiện. Ví dụ: thao tác này sẽ bị bỏ qua khi không 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 chứa tiện ích đó. 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 các 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ạ độ X và Y (tính bằng pixel) của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent. Bắt buộc đối với các thao tác nhấn vào điểm.
pointTapXPercentpointTapYPercent Tỷ lệ phần trăm toạ độ X và Y của điểm được nhấn. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate. Bắt buộc đối với các thao tác nhấn vào điểm.

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

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

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

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

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

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ị này 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ụ: bạn thường chỉ có thể phân biệt các mục trong 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à chỉ sử dụng một bộ mô tả phần tử để xác định một tiện ích trên giao diện người dùng thường là không đủ. Do đó, thuộc tính elementDescriptors của một thao tác chứa một chuỗi các bộ mô tả phần tử được sắp xếp sao cho bộ mô tả đầu tiên tương ứng với tiện ích giao diện người dùng mục tiêu, bộ mô tả 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 bộ mô tả phần tử của thao tác đó khớp với hệ phân cấp phụ tương ứng của tiện ích giao diện người dùng.

Sau đây là ví dụ về một tập lệnh Robo có thay đổi về văn bản và các thao tác nhấp. Cả hai thao tác này đều yêu cầu bạn xác định tiện ích đích trên giao diện người dùng bằng cách sử dụng các bộ 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"
      }
    ]
  }
]

Các lựa chọn thực thi

Bạn có thể tuỳ ý thêm tiền tố vào danh sách các thao tác trong tập lệnh Robo bằng một đối tượng JSON chỉ định các lựa 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à một biểu thị JSON của các lựa 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:

  • 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 đượ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 thao tác 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 một kiểm thử đo lường thông thường và sẽ không thành công ngay khi không thực hiện được bất kỳ thao tác nào. Theo mặc định, giá trị này là false.
    • dismiss_popups – nếu được đặt thành true, thử nghiệm 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 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, 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ề 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ẽ đợi 3 giây, sau đó quá trình thu thập dữ liệu sẽ dừng:

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

Tham số mẫu

Tham số mẫu là một trình giữ chỗ trong tập lệnh Robo, được thay thế bằng giá trị thực 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 kép, 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 kép.

Tập lệnh Robo hỗ trợ tham 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 ứng dụng đang kiểm thử:

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

Nhận xét

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

Sau đây là ví dụ về một tập lệnh Robo có một vài chú thích:

# 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 thao tác của một tập lệnh Robo hoàn tất (hoặc ít nhất là đã được thực hiện), tập lệnh Robo vẫn hoạt động. Thử nghiệm Robo sẽ tiếp tục cố gắng so khớp một thao tác trong tập lệnh Robo bất cứ khi nào chọn một thao tác để 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 thao tác tập lệnh Robo hiện tại không thể khớp hoàn toàn, thì tiêu chí khớp sẽ được nới lỏng và quá trình khớp sẽ được thử lại. Tính năng so khớp một phần không xem xét bộ 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 thao tác trong tập lệnh Robo.

Nếu quá trình 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ử trên 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ể khớp hoàn toàn hoặc một phần hành động hiện tại của tập lệnh Robo, Robo sẽ cố gắng khớp hành động tiếp theo của tập lệnh Robo. Nếu hành động tiếp theo khớp một phần hoặc toàn bộ, thì Thử nghiệm 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 một 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 so với phát lại tập lệnh Robo.

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

Miễn là các thao tác hiện tại hoặc tiếp theo của tập lệnh Robo không khớp, tập lệnh Robo sẽ vẫn bị tạm ngưng đối với bất kỳ số lượng thao tác nào. Do đó, tập lệnh Robo không nhất thiết phải là phần mở đầu cho một kiểm thử Robo và bạn có thể xen kẽ các thao tác trong tập lệnh Robo với các thao tác 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 để Robo kiểm thử cần "bổ sung" bằng các thao tác 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 được kích hoạt nữa trong một lần thu thập dữ liệu nhất định. Nếu có nhiều tập lệnh Robo có thể được kích hoạt bởi ngữ cảnh hiện tại, thì mức độ ưu tiên sẽ được xác định bằng cách chọn (theo thứ tự sau) tập lệnh Robo:

  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 priority của 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 thử nghiệm ở nền trước:

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

Khi ứng dụng đang thử nghiệm ở 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ì xuất hiện sớm hơn trong số các tập lệnh Robo còn lại có thể áp dụng với 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 thuộc tính này thông qua thuộc tính maxNumberOfRuns.

Sau đây là ví dụ về một tập lệnh Robo đưa ứng dụng đang thử nghiệm 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ể áp dụng ở nhiều giai đoạn của một quy trình thu thập dữ liệu bằng 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 dữ liệu ứng dụng đang được kiểm thử.
post_crawl Sau khi Robo hoàn tất việc thu thập dữ liệu ứng dụng đang được kiểm thử. post_crawl Tập lệnh Robo không được vượt quá 15 giây, nếu không quá trình thu thập dữ liệu có thể kết thúc do hết thời gian chờ.
crawl Giai đoạn thu thập thông tin chính, khi Robo thu thập thông tin về ứng dụng đang được kiểm thử.
close_screen Khi Robo cố gắng quay lại (quay lui) từ một màn hình nhất định, khi tất cả các thao tác có thể có 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 bạn không chỉ định thuộc tính crawlStage của một tập lệnh Robo, thì thuộc tính này sẽ được ngầm hiểu là crawl.

Sau đây là ví dụ về một tập lệnh Robo xoá dữ liệu người dùng của ứng dụng đang thử nghiệm 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ề một tập lệnh Robo hướng dẫn Robo nhấp vào "Cancel" bất cứ khi nào Robo cố gắng quay lại (quay lui) từ mộ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 thao tác có điều kiện có 3 thuộc tính bổ sung mô tả cách Robo thực hiện các thao tác đó:

Thuộc tính Nội dung mô tả
priority Mức độ ưu tiên của thao tác có điều kiện này so với các thao tác có điều kiện khác trong tập lệnh Robo chứa thao tác này. 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 thao tác có điều kiện này trong một lần thực thi tập lệnh Robo chứa thao tác đó. 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 tối đa một lần trong một lần thực thi duy nhất của tập lệnh Robo chứa các hành động đó.
contextDescriptor Bối cảnh/điều kiện kích hoạt hành động có điều kiện này. Nó có cùng cấu trúc và cung cấp các chức 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 một tập lệnh Robo chứa các thao tác có điều kiện, thì các thao tác này sẽ được xem xét mỗi khi chọn một thao tác không có điều kiện để thực hiện. Nếu có 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 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 thao tác không có điều kiện sau. Để hợp lệ, một tập lệnh Robo phải chứa ít nhất một thao tác không có điều kiện.

Sau đây là ví dụ về một tập lệnh Robo vô điều kiện có một thao tác có điều kiện sẽ đóng hộp thoại bật lên nếu hộp thoại này 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": "WAIT",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "WAIT",
      "delayTime": 10000
    }
}

Bỏ qua hành động

Một tập lệnh Robo có thể chứa các chỉ 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 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 "các thao tác" tương ứng với eventType ELEMENT_IGNOREDALL_ELEMENTS_IGNORED.

Bất cứ khi nào thuộc tính contextDescriptor của một tập lệnh Robo có chứa các thao tác bỏ qua trùng 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 mà các thao tác bỏ qua của tập lệnh đó nhắm đến (trừ phi một thao tác khác của tập lệnh Robo 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 nhiều hành động bỏ qua, 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 trong tập lệnh Robo, thao tác bỏ qua được áp dụng miễn là contextDescriptor của tập lệnh Robo chứa thao tác đó khớp với một màn hình trong quá trình thu thập dữ liệu bằng Robo, bất kể giá trị của các thuộc tính prioritymaxNumberOfRuns.

Sau đây là ví dụ về một tệp có 2 tập lệnh Robo. Tập lệnh Robo đầu tiên khiến Robo bỏ qua tất cả các tiện ích giao diện người dùng trên màn hình có 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 Robo bỏ qua các tiện ích trên giao diện người dùng có mã nhận dạng 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 trên giao diện người dùng có mã nhận dạng 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 RecyclerView và AdapterView được tải động và có thể xuất hiện sau nhiều lần vuốt trên màn hình hiện tại. Vì kích thước màn hình và số lần vuốt cần thiết để truy cập vào thành phần con này khác nhau đối với các kiểu dáng thiết bị, nên việc dựa vào vị trí dữ liệu của thành phần con (vị trí tuyệt đối) sẽ hiệu quả hơn nhiều. Đây là một phương pháp kém mạnh mẽ 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, rồi sử dụng vị trí màn hình của thành phần đó.

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

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

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

  2. Thử nghiệm Robo thực hiện hành động đã ghi trực tiếp trên phần tử con, vì phần tử này đã xuất hiện trên màn hình.

Sau đây là ví dụ về thao tác nhấp vào một thành phần con 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 vào một 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 một tập lệnh Robo trong Android Studio và chạy tập lệnh đó trong Test Lab

Bạn có thể tạo một 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 Firebase Test Lab 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 tập lệnh, thử nghiệm Robo sẽ thực hiện các hành động có trong tập lệnh trước rồi mới tiến hành thử nghiệm ứ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.

Thao tác của tập lệnh Robo

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

  • description – giúp theo dõi quá trình thực thi thao tác tập lệnh Robo này trong đầu ra của Robo test.

Câu nhận định

Nếu điều kiện được xác nhận là đúng, thì tập lệnh Robo sẽ tiếp tục thực hiện hành động 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ị 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ả bối cảnh hoặc điều kiện được xác nhận. Nó có cùng cấu trúc và cung cấp các chức năng tương tự như contextDescriptor của tập lệnh Robo.

Sau đây là ví dụ về một câu lệnh khẳng định của Robo script để kiểm tra xem ứng dụng đang được kiểm thử có ở nền trước hay không:

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

Sau đây là ví dụ về một câu lệnh Robo kiểm tra để đảm bảo rằng 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" xuất hiện trên màn hình:

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

Sau đây là ví dụ về một câu lệnh khẳng định trong tập lệnh Robo kiểm tra xem "Settings" CÓ được phát hiện trên màn hình bằng tính năng OCR hay KHÔNG:

{
  "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 trong tập lệnh Robo.
"eventType": "VIEW_CLICKED" Nhấp vào phần tử đích của ứng dụng đang được kiểm thử.
"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 maxNumberOfRuns lần.
"eventType": "LIST_ITEM_CLICKED" Được trình ghi tập lệnh Robo trong Android Studio 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 cách sử dụ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 tính năng 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ử đích được so khớp, khi phần tử đích được xác định bằng visionText. Nếu là 0, thao tác tập lệnh Robo sẽ chọn phần tử khớp đầu tiên, nếu là 1, thao tác tập lệnh Robo sẽ chọn phần tử 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 (lựa chọn khớp đầu tiê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ề một thao tác trong tập lệnh Robo, thao tác này sẽ nhấp vào một nút có mã nhận dạng 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 trong tập lệnh Robo, thao tác này 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 tính năng OCR:

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

Sau đây là ví dụ về một thao tác trong tập lệnh Robo, thao tác này nhấp vào một phần tử bàn phím ảo 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 trong tập lệnh Robo, thao tác này sẽ nhấp vào các phần tử bàn phím ảo ngẫu nhiên tối đa 5 lần:

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

Tắt bàn phím ả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": "DISABLE_KEYBOARD" --

Sau đây là ví dụ về một thao tác trong tập lệnh Robo giúp tắt bàn phím ảo:

{
  "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) cần thực thi.

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

  • expectedOutputRegex – đầu ra 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, thao tác tập lệnh Robo sẽ không thành công. Theo mặc định, đây là một chuỗi trống, tức là đầu ra không được kiểm tra.

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

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

Cấp quyền

Thao tác này được trình ghi tập lệnh Robo ghi lại trong Android Studio để tương thích ngược với Trình ghi lại quy trình kiểm thử Espresso. Thử nghiệm bằng Robo cấp tất cả các quyền cho ứng dụng đang thử nghiệm khi bắt đầu mỗi lần thu thập dữ liệu. 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ọi màn hình kích hoạt tập lệnh Robo có 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 trong 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 (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 cách sử dụ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 sẽ bỏ qua tất cả các thành phần 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 thao tác 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 trong tập lệnh Robo.
"eventType": "VIEW_TEXT_CHANGED" Nhập văn bản đã cho vào tiện ích đích trên giao diện người dùng.
"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 cách sử dụ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 trong tập lệnh Robo nhập "John" vào một tiện ích trên 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 cách sử dụ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 và giữ bằng 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ử đích được so khớp, khi phần tử đích được xác định bằng visionText. Nếu là 0, thao tác tập lệnh Robo sẽ chọn phần tử khớp đầu tiên, nếu là 1, thao tác tập lệnh Robo sẽ chọn phần tử 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 (lựa chọn khớp đầu tiên).

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

  • delayTime – chỉ định thời gian nhấn xuống của một thao tác nhấp dài, tính bằng mili giây.

Sau đây là ví dụ về một thao tác trong tập lệnh Robo thực hiện thao tác nhấp và giữ trong 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ề một thao tác bằng cử chỉ một điểm trong 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ỉ bằng hai ngón tay

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ỉ bằng 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 trong tập lệnh Robo thực hiện cử chỉ thu phóng:

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

Thực hiện một thao tác IME

Thao tác này 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 được 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 cách sử dụ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 trong tập lệnh Robo thực hiện thao tác IME trên một tiện ích trên 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 thao tác trong 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 dùng để nhấn nút quay lại trên trình mô phỏng API 28.

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

{
  "eventType": "PRESSED_BACK"
}

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

Thao tác này sẽ gửi một sự kiện KEYCODE_HOME đến 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 trong tập lệnh Robo nhấn nút trang chủ:

{
  "eventType": "GO_HOME"
}

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

Thao tác này khiến Thử nghiệm Robo cuộn về phía trước tiện ích trên giao diện người dùng khớp với elementDescriptors đã chỉ định cho đến khi tiện ích trên 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 tiện ích được cuộn không thể cuộn được 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 được cuộn bằng cách sử dụ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 cách sử dụ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 trong tập lệnh Robo giúp cuộn tiện ích trên giao diện người dùng có mã nhận dạng tài nguyên "my.app.package:id/scrollable_card_container" cho đến khi tiện ích trên 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 nữa, 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 mục tiêu.
elementDescriptors Xác định tiện ích giao diện người dùng mục tiêu bằng cách sử dụ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 trong tập lệnh Robo, thao tác này sẽ vuốt lên một tiện ích trên 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 thao tác 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 (tính bằng pixel) của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent.
pointTapYCoordinate Toạ độ Y (tính bằng pixel) của điểm được 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 được 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 được nhấn. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate.

Sau đây là ví dụ về một thao tác trong tập lệnh Robo, thao tác này sẽ 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 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ử đích.
pointTapYPercent Toạ độ Y theo tỷ lệ phần trăm trong phần tử đích.
elementDescriptors Xác định tiện ích giao diện người dùng mục tiêu bằng cách sử dụ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 trong tập lệnh Robo giúp di chuyển thanh trượt của thanh tìm kiếm 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ử bằng 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ề một thao tác trong tập lệnh Robo giúp dừng kiểm thử 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": "WAIT" (or "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 trong tập lệnh Robo chờ 3 giây:

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

Chờ một phần tử

Thao tác này khiến kiểm thử Robo chờ một phần tử xuất hiện trên màn hình cho đến khi hết 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 cách sử dụ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 trong tập lệnh Robo, thao tác này sẽ đợi tối đa 30 giây để một tiện ích trên 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