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à hành động. Tập lệnh Robo thử nghiệm 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, và bật tính năng tích hợp liên tục (CI) và chiến lược thử nghiệm trước khi ra mắt. Rô bốt tập lệnh là một tệp JSON mô tả một trình tự giao diện người dùng (UI) và các hành động 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 bài viết Chạy Robo tập lệnh.

Giới thiệu

Tập lệnh Robo được cung cấp để thử nghiệm Robo cùng với các thông tin đầu vào khác như Gói ứng dụng Android (APK) thử nghiệm ứng dụng.

Sau đây là ví dụ về tập lệnh Robo đăng nhập người dùng vào ứng dụng, được kích hoạt khi chạy thử nghiệm ứng dụng dưới dạng:

[
  {
    "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ó giá trị mặc định app_under_test_shown điều kiện kích hoạt (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 một định dạng đơn giản hơn - giống như trình tự hành động của nó:

[
  {
    "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 trở lên giống với cú pháp Android và các tính năng iOS trở lên được hỗ trợ hoạt động tương tự như các tính năng tương ứng trên Android.

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

  • 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 nhận dạng sau trong phần mô tả phần tử được hỗ trợ trong iOS trở lên:

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

Sau đây là các điều kiện kích hoạt trong phần mô tả ngữ cảnh được hỗ trợ trong iOS trở lên:

  • Đã 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 dữ liệu. Robo tích hợp sẵn các tập lệnh Robo với id riêng. Mặc dù cùng một id trong các tập lệnh Robo khác nhau không ảnh hưởng đến hành vi của các tập lệnh đó, nhưng việc phân biệt các hành động trong các tập lệnh Robo này trong kết quả thu thập dữ liệu có thể là một thách thức. Bạn nên chỉ định một id duy nhất là 1000 trở lên cho các tập lệnh Robo để tránh xung đột.
description Tương tự như id nhưng 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 khi Robo có thể thực thi Robo này tập lệnh. 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ị bỏ qua, điều kiện kích hoạt của tập lệnh Robo này được coi là luôn gặp nhau; 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ề tệp có hai tập lệnh Robo vô điều kiện, mỗi tập lệnh bằng một tác vụ được thực thi một lần ở đầ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

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

Thuộc tính Nội dung mô tả
"condition": "always" Luôn kích hoạt tập lệnh Robo.
"condition": "element_present" Kiểm tra để đảm bảo rằng một tiện ích giao diện người dùng khớp với elementDescriptors hoặc văn bản do visionText chỉ định xuất hiệ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 đang 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 đang hiển thị trên màn hình và được đánh dấu.
"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 màn hình chính của thiết bị hiển thị, tức là không có ứng dụng nào đang chạy ở nền trước.
"condition": "non_roboscript_action_performed" Kiểm tra để đảm bảo rằng nonRoboscriptActionCount gần đây nhất liên tiếp các hành động 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 tiện ích giao diện người dùng có KHÔNG có trên màn hình hoặc ứng dụng kiểm thử dưới quyền KHÔNG chạy trong 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 hãy xem Thông tin 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. Độc quyền lẫn nhau với elementDescriptors.
nonRoboscriptActionCount Số hành động liên tiếp không phải là tập lệnh Robo đã thực hiện trước đó. Đó là được dùng kết hợp với non_roboscript_action_performed điều kiện để kích hoạt tập lệnh Robo sau mỗi nonRoboscriptActionCount Hành động Robo. Theo mặc định, giá trị này là 1.

Sau đây là ví dụ về tập lệnh Robo được tiện ích giao diện người dùng kích hoạt có mã tài nguyên "my.app.package:id/page_header" hiện diệ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ề một tập lệnh Robo chờ 5 giây sau mỗi thao tác 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 thể hiện dưới dạng một nhóm gồm một hoặc nhiều hành động các cặp thuộc tính-giá trị được mô tả trong bảng sau:

Thuộc tính Nội dung mô tả
eventType Chỉ định loại hành động, ví dụ: nhấp 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 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 hành động 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 đượ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. 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 để chỉnh sửa văn bản hành động.
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 cùng 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. Cả hai bên dành riêng cho 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ó hai hành động không có mục tiêu Tiện ích giao diện người dùng, tức là những thao tác này không hoạt động trên một giao diện người dùng cụ thể tiện ích:

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

Mã mô tả phần tử

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

Thuộc tính Nội dung mô tả
className
ancestorClassName Tên lớp đố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ỳ của các nút mẹ trong hệ phân cấp giao diện người dùng của phần tử, bao gồm cả 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 tiện ích giao diện người dùng tuỳ thuộc vào loại tiện ích mẹ.

Thông thường, những thuộc tính này không xác định, ví dụ: một nút có thể không có văn bản và mô tả nội dung. Ngay cả khi có một số 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ì bạn 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à rằng việc sử dụng chỉ một chỉ số mô tả phần tử để xác định tiện ích giao diện người dùng thường là không đủ. Do đó, thuộc tính elementDescriptors của một hành động chứa trình tự của các mã mô tả phần tử được sắp xếp sao cho mã đầu tiên tương ứng với tiện ích giao diện người dùng đích, tiện ích thứ hai tương ứng với tiện ích giao diện người dùng Tiện ích mẹ của tiện ích giao diện người dùng, v.v. Tiện ích giao diện người dùng mục tiêu của một hành động đã được so khớp khi tất cả các mã mô tả phần tử đều khớp với tiện ích giao diện người dùng tương ứng phân cấp phụ.

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

[
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "John",
    "elementDescriptors": [
      {
        "className": "android.support.v7.widget.AppCompatEditText",
        "groupViewChildPosition": 0,
        "resourceId": "com.google.samples.apps.topeka:id/first_name"
      },
      {
        "className": "android.widget.FrameLayout",
        "groupViewChildPosition": 0
      },
      {
        "className": "android.support.design.widget.TextInputLayout",
        "groupViewChildPosition": 1
      }
    ]
  },
  {
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "className": "android.support.design.widget.FloatingActionButton",
        "groupViewChildPosition": 1,
        "resourceId": "com.google.samples.apps.topeka:id/done"
      },
      {
        "className": "android.widget.FrameLayout",
        "groupViewChildPosition": 1,
        "resourceId": "com.google.samples.apps.topeka:id/content"
      },
      {
        "className": "android.widget.FrameLayout",
        "groupViewChildPosition": 0,
        "resourceId": "com.google.samples.apps.topeka:id/sign_in_content"
      }
    ]
  }
]

Tuỳ chọn thực thi

Bạn có thể tuỳ ý thêm tiền tố JSON vào danh sách các hành động trong tập lệnh Robo chỉ định các tuỳ chọn thực thi cho tập lệnh Robo đó. Chiến dịch này tiêu đề cấu hình bắt đầu bằng từ khoá roboscript, theo sau là Bản trình bày 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 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à không thành công ngay khi không thể thực hiện bất kỳ hành động nào. Theo mặc định, hiện tại là false.
    • dismiss_popups – nếu được đặt thành true, thử nghiệm Robo sẽ bỏ qua mọi hoạt động không mong muốn trong khi thực hiện tập lệnh Robo ngay cả ở chế độ strict. Chiến dịch này không có hiệu lực khi không ở chế độ strict. Theo mặc định, giá trị này là false.
    • notify – nếu bạn đặt thành false, tập lệnh Robo sẽ không hiển thị thông báo trên màn hình ở đầu và cuối quá trình thực thi. Theo mặc định, giá trị này là true.
  • postscript – các 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 Robo tập lệnh đã 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 thông báo trên màn hình ở chế độ ngủ trong 3 giây. Sau đó, trình thu thập thông tin điểm 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. Mẫu các tham số có tiền tố là dấu gạch dưới đôi, theo sau là ký hiệu phần trăm, và được cố định bằng ký hiệu phần trăm, theo sau là dấu gạch dưới kép.

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

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

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

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

Nhận xét

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

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

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

Khả năng

Theo mặc định, cho đến khi tất cả các hành động của tập lệnh Robo được hoàn tất (hoặc ít nhất cố gắng), tập lệnh Robo vẫn hoạt động. Thử nghiệm Robo tiếp tục cố gắng khớp với Hành động của tập lệnh Robo bất cứ khi nào thao tác này chọn một hành động để thực hiện. Tập lệnh Robo triển khai các kỹ thuật sau để tăng độ chắc chắn:

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ì hành động so khớp tiêu chí được nới lỏng và kết hợp lại được thử lại. Khớp một phần không xem xét mã mô tả phần tử ngoài cùng trong khi khớp tiện ích giao diện người dùng mục tiêu của thao tác 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 trong đó cấu trúc ứng dụng thay đổi, ví dụ: giữa các phiên bản ứng dụng, khi 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, Robo sẽ cố gắng khớp với hành động tiếp theo của tập lệnh Robo. Nếu lệnh gọi tiếp theo hành động khớp hoàn toàn hoặc một phần, bỏ qua thử nghiệm Robo (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 trường hợp khi hành vi của ứng dụng thay đổi giữa hoặc không ổn định, ví dụ như khi hộp thoại không liên tục có thể xuất hiện trên các màn hình khác nhau trong quá trình ghi lại so với phát lại của Robo tập lệnh.

Tạm ngưng Nếu không thể so khớp toàn bộ hoặc một phần các hành động trong tập lệnh Robo hiện tại hoặc các hành động tiếp theo, thì tập lệnh Robo sẽ tạm thời bị tạm ngưng và kiểm thử Robo sẽ chọn một hành động để thực hiện bằng các chiến lược khác. Sau 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à không thể so khớp các hành động hiện tại hoặc hành động tiếp theo trong tập lệnh Robo, tập lệnh Robo sẽ vẫn bị tạm ngưng cho bất kỳ số hành động nào. Do đó, Robo tập lệnh không nhất thiết phải là phần mở đầu cho thử nghiệm Robo, và bạn có thể xen kẽ các hành động của tập lệnh Robo bằng thử nghiệm Robo tiêu chuẩn hành động. Kỹ thuật này hỗ trợ các trường hợp 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 để Robo thử nghiệm cần "lấp đầy khoảng trống" bằng các thao tác 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 nữa trong một lần thu thập dữ liệu nhất định. Nếu nhiều tập lệnh Robo có thể được kích hoạt bằng tập lệnh Robo ngữ cảnh, mức độ ưu tiên được đưa ra bằng cách chọn tập lệnh Robo theo thứ tự sau rằng:

  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 giá trị như nhau lượt thực thi priority/1).
  3. Xuất hiện sớm nhất trong danh sách các tập lệnh Robo, nếu tập lệnh Robo mức độ ưu tiên đều giống nhau.

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 được ở 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, trong đơn đặt hàng:

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

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

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. Thông tin này có thể là được điều chỉnh 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 trong 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 việc thu thập thông tin về ứng dụng đang được kiểm thử. Đáp post_crawl Tập lệnh Robo không được vượt quá 15 giây trong Nếu không, việc thu thập thông tin có thể chấm dứt trong thời gian chờ.
crawl Giai đoạn thu thập dữ liệu chính, khi Robo thu thập thông tin trong quá trình thử nghiệm ứng dụng.
close_screen Khi Robo cố gắng quay lại (backtrack) từ một màn hình nhất định, khi tất cả thao tác có thể thực hiện trên màn hình này đều được khám phá. Theo mặc định, Robo nhấn vào phía sau, đây là điều không mong muốn trong một số trường hợp.

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

Sau đây là ví dụ về tập lệnh Robo xoá người dùng chạy ứng dụng trong quá trình 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ề tập lệnh Robo hướng dẫn Robo nhấp vào "Cancel" bất cứ khi nào ứng dụng này cố gắng quay lại (quay lại) sau khi xác nhận hộp thoại:

{
  "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. Hành động có điều kiện có thêm 3 thuộc tính mô tả cách Robo thực hiện các hành động đó:

Thuộc tính Nội dung mô tả
priority Mức độ ưu tiên của hành động có điều kiện này so với các hành động khác các hành động có điều kiện trong tập lệnh Robo chứa. 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 thực hiện hành động có điều kiện này trong một lần việc thực thi tập lệnh Robo chứa tập lệnh này. Theo mặc định, tất cả tuỳ chọn có điều kiện có thể thực hiện tối đa một lần trong một lần thực thi 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 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 trong thứ tự xuất hiện. Nếu tập lệnh Robo chứa các hành động có điều kiện, thì chúng luôn được xem xét 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ũng đượ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. Để trở thành hợp lệ, thì 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 có thuộc tính có điều kiện thao tác đóng hộp thoại bật lên nếu chúng xuất hiện tại bất kỳ thời điểm nào trong quá trình Robo thực thi tập lệnh:

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

Đang bỏ qua hành động

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

Bất cứ khi nào thuộc tính contextDescriptor của tập lệnh Robo chứa bỏ qua các hành động khớp với màn hình có sẵn, Robo 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 theo các hành động bỏ qua (trừ khi một số hành động khác của tập lệnh Robo thực hiện Robo thực hiện thao tác trên một trong các tiện ích trên giao diện người dùng bị bỏ qua).

Tập lệnh Robo có thể bao gồm cả bối cảnh bỏ qua, có điều kiện và không có điều kiện hành động. Không giống như các hành động khác của tập lệnh Robo, các hành động bỏ qua được áp dụng trong thời gian dài vì contextDescriptor của tập lệnh Robo khớp với màn hình trong Thu thập thông tin Robo, bất kể giá trị của prioritymaxNumberOfRuns là gì .

Sau đây là ví dụ về một tệp có hai tập lệnh Robo. Robo đầu tiên tập lệnh 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 với mã nhận dạng tài nguyên "my.app.package:id/ignored_screen". Tập lệnh Robo thứ hai tạo 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ột màn hình chứa tiện ích giao diện người dùng với 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 tiện ích RecyclerView và AdapterView được tải động và có thể hiển thị nhiều lần vuốt ra khỏi màn hình hiện tại. Vì kích thước của một màn hình và số lần vuốt cần thiết để truy cập vào trẻ này là khác nhau cho các hệ số hình dạng khác nhau của thiết bị, thì sẽ hiệu quả hơn nhiều nếu dựa vào vị trí dữ liệu của nhà xuất bản con, là vị trí tuyệt đối. Đây là một phương pháp ít hiệu quả hơn khi dựa vào số lần vuốt cần thiết để đưa thành phần con này lên màn hình, sau đó sử dụng vị trí màn hình của thành phần con đó.

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

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

  1. Kiểm thử Robo đảm bảo rằng thành phần con tương ứng sẽ hiển thị 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 con đó.

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

Sau đây là ví dụ về thao tác nhấp trên một AdapterView (android.widget.GridView) phần tử con:

{
  "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 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 tập lệnh Robo trong Android Studio và chạy tập lệnh đó trong Test Lab

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

Khi bạn chạy thử nghiệm Robo có đính kèm một tập lệnh, hãy thử nghiệm Robo các bước đầu tiên thông qua các hành động theo tập lệnh sẵn rồi 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 Ghi tập lệnh Robo bằng Test Lab trong Android Studio.

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

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

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

Xác nhận

Nếu điều kiện được xác nhận là đúng, tập lệnh Robo sẽ tiếp tục thực hiện thao tác tiếp theo, có thể là một xác nhận khác. Nếu không, việc thực thi tập lệnh Robo 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. Có cùng cấu trúc và cung cấp các tính năng tương tự như ContextDescriptor của tập lệnh Robo.

Sau đây là ví dụ về xác nhận tập lệnh Robo kiểm tra xem app-under-test chạy trên nền trước:

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

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

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

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

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

Nhấp chuột

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

Thuộc tính Nội dung mô tả
eventType Chỉ định loại thao tác tập lệnh Robo.
"eventType": "VIEW_CLICKED" Nhấp vào phần tử mục tiêu của ứng dụng đang được kiểm thử.
"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 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 tập lệnh Robo nhấp vào "Privacy Policy" được phát hiện trên màn hình bằng OCR:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Privacy Policy"
}

Sau đây là ví dụ về thao tác của tập lệnh Robo nhấp vào nút phần tử bàn phím có 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 nút mềm ngẫu nhiên phần tử bàn phím 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ề thao tác của tập lệnh Robo vô hiệu hoá phần mềm bàn phí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 thông thường Java biểu thức. 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, đó 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ề thao tác của tập lệnh Robo xoá dữ liệu người dùng thử nghiệm ứng dụng:

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

Cấp quyền

Hành động này do trình ghi tập lệnh Robo trong Android Studio ghi lại cho 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 ứng dụng đang được kiểm thử ở đầu mỗi lần thu thập thông tin. Do đó, thao tác này không có tác dụng. ĐỪNG sử dụng thao tác này trong tập lệnh Robo.

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

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

Bỏ qua tất cả các 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 lệnh chứa 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": "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ử

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

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

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

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

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

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

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

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

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

Thuộc tính Mô tả
eventType Chỉ định loại 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 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ề hành động của tập lệnh Robo nhập "John" vào một tiện ích giao diện người dùng có mã nhận dạng tài nguyên "com.google.samples.apps.topeka:id/first_name":

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

Nhấp và giữ

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

Thuộc tính Mô tả
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Xác định tiện ích giao diện người dùng mục tiêu bằng hệ phân cấp giao diện người dùng Android. Cả hai bên dành riêng cho 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). Độc quyền lẫn nhau với elementDescriptors.

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

  • delayTime – xác định thời gian nhấn và giữ một nhấp chuột, tính bằng mili giây.

Sau đây là ví dụ về hành động của tập lệnh Robo thực hiện năm nhấp chuột dài vài giây vào tiện ích giao diện người dùng có 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 Hai toạ độ cho một 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 một 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 sẽ vuốt xuống:

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

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

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

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

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

{
  "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 nhấn vào 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 đích đượ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 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 tiện ích giao diện người dùng có mã nhận dạng tài nguyên "com.google.samples.apps.topeka:id/first_name":

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

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

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

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

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

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

Trượt

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

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

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

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

Chụp ảnh màn hình

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

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

Sau đây là ví dụ về 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ạ độ X theo pixel của điểm nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent.
pointTapYCoordinate Toạ độ pixel Y của điểm được nhấn. Độc quyền lẫn nhau với pointTapXPercentpointTapYPercent.
pointTapXPercent Toạ độ X theo tỷ lệ phần trăm của điểm nhấn. Độc quyền lẫn nhau với pointTapXCoordinatepointTapYCoordinate.
pointTapYPercent Toạ độ Y theo tỷ lệ phần trăm của điểm nhấn. Độc quyền 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 tua thanh trượt 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

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ề một thao tác tập lệnh Robo 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": "DELAYED_MESSAGE_POSTED" --
delayTime Chỉ định thời gian chờ, tính bằng mili giây.

Sau đây là ví dụ về thao tác của tập lệnh Robo đợi giây:

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

Chờ một phần tử

Hành động này khiến quá trình thử nghiệm Robo đợi một phần tử xuất hiện trên màn hình lên đến thời gian chờ đượ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": "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 đợi tối đa 30 giây đối vớ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/confirmation_button" sẽ 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