Hướng dẫn tham khảo 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, khả năng, cách sử dụng, ghi và hành động. Tập lệnh robot là các thử nghiệm tự động hóa các tác vụ đảm bảo chất lượng (QA) thủ công cho ứng dụng dành cho thiết bị di động và cho phép tích hợp liên tục (CI) cũng như các chiến lược thử nghiệm trước khi ra mắt. Tập lệnh Robo là một tệp JSON mô tả một chuỗi 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 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 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 Chạy tập lệnh Robo .

Giới thiệu

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

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

[
  {
    "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 trong một tệp và nó 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 định dạng đơn giản hơn - giống như một chuỗi hành động của tập lệnh đó:

[
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "user123",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/username"
      }
    ]
  },
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "12345",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/password"
      }
    ]
  },
  {
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/login"
      }
    ]
  }
]

Hỗ trợ iOS+ cho tập lệnh Robo

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

Các hành động sau được hỗ trợ trong iOS+:

  • Quả quyết
  • Nhấp chuột
  • Nhấp chuột dài
  • Vuốt
  • Bỏ qua tất cả các phần tử
  • Chờ đợi
  • Chụp 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 bộ mô tả phần tử được hỗ trợ trong iOS+:

  • Tên lớp
  • 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 trong bộ mô tả ngữ cảnh được hỗ trợ trong iOS+:

  • Ứng dụng đang được thử nghiệm được hiển thị
  • Yếu tố hiện tại
  • Đã thực hiện hành động tập lệnh không phải Robo

Kết cấu

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à tùy chọn với các giá trị mặc định được xác định trước:

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

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

Sau đây là ví dụ về tệp có hai tập lệnh Robo vô điều kiện, mỗi tập lệnh có một hành động duy nhất được thực thi một lần khi bắt đầu 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"
      }
    ]
  }
]

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

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

Thuộc tính Sự miêu tả
"condition": "always" Luôn kích hoạt tập lệnh Robo.
"condition": "element_present" Kiểm tra xem tiện ích giao diện người dùng có khớp với elementDescriptors hoặc văn bản do visionText chỉ định có xuất hiện trên màn hình hay không.
"condition": "element_disabled" Kiểm tra xem tiện ích giao diện người dùng khớp với elementDescriptors có xuất hiện trên màn hình và không thể tương tác được hay không.
"condition": "element_checked" Kiểm tra xem tiện ích giao diện người dùng phù hợp với elementDescriptors có xuất hiện trên màn hình hay không và được chọn.
"condition": "app_under_test_shown" Kiểm tra xem ứng dụng đang thử nghiệm có đang chạy ở nền trước hay không.
"condition": "default_launcher_shown" Kiểm tra xem màn hình chính của thiết bị có hiển thị hay không, nghĩa là không có ứng dụng nào đang chạy ở nền trước.
"condition": "non_roboscript_action_performed" Kiểm tra xem các hành động liên tiếp nonRoboscriptActionCount cuối cùng được thực hiện bởi thử nghiệm Robo không phải là hành động tập lệnh Robo.
negateCondition Nếu được đặt thành true , 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 KHÔNG xuất hiện trên màn hình hay ứng dụng đang thử nghiệm KHÔNG chạy ở nền trước.
elementDescriptors Một hoặc nhiều bộ mô tả thành phần xác định tiện ích giao diện người dùng trên màn hình. Nó được sử dụng kết hợp với các điều kiện element_present , element_disabledelement_checked . Loại trừ lẫn nhau với visionText . Để biết thêm thông tin, hãy xem phần 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 sử dụng kết hợp với điều kiện element_present . Loại trừ lẫn nhau với elementDescriptors .
nonRoboscriptActionCount Số hành động liên tiếp không phải của tập lệnh Robo được thực hiện trước đó. Nó được sử dụng kết hợp với điều kiện non_roboscript_action_performed để kích hoạt tập lệnh Robo sau mỗi hành động nonRoboscriptActionCount Robo. Theo mặc định, nó là 1 .

Sau đây là ví dụ về tập lệnh Robo được kích hoạt bởi tiện ích giao diện người dùng có ID tài nguyên "my.app.package:id/page_header" hiển thị 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" được phát hiện bởi Nhận dạng ký tự quang học (OCR):

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

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

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

hành động

Mỗi hành động trong tập lệnh Robo được thể hiện 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 Sự miêu 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 Bộ mô tả xác định tiện ích giao diện người dùng. Bắt buộc đối với tất cả hành động có tiện ích giao diện người dùng mục tiêu, như nhấp vào một nút cụ thể.
optional Nếu được đặt thành true , hành động này sẽ bị bỏ qua khi không thể thực hiện được. Ví dụ: hành động này bị bỏ qua khi không thể tìm thấy tiện ích giao diện người dùng mục tiêu trên màn hình– mà không làm hỏng tập lệnh Robo 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 mục tiêu. Cần thiết cho các hành động chỉnh sửa văn bản.
swipeDirection Chỉ định hướng vuốt. Cần thiết cho các thao tác vuốt.
delayTime Chỉ định thời gian chờ đợi, tính bằng mili giây. Cần thiết cho các hành động chờ đợi.
pointTapXCoordinatepointTapYCoordinate Tọa độ pixel X và Y của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent . Cần thiết cho các hành động nhấn điểm.
pointTapXPercentpointTapYPercent Phần trăm tọa độ X và Y của điểm được khai thác. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate . Cần thiết cho các hành động nhấn điểm.

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

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

Bộ mô tả phần tử

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

Thuộc tính Sự miêu tả
className
ancestorClassName Tên lớp của tổ tiên phân cấp giao diện người dùng của phần tử. Tổ tiên là bất kỳ nút cha nào trong hệ thống phân cấp giao diện người dùng của phần tử, bao gồm cả chính phần tử đó.
resourceId
resourceIdRegex Biểu thức chính quy Java để khớp với resourceId .
contentDescription
contentDescriptionRegex Biểu thức chính quy Java để khớp với contentDescription .
text (xuất hiện trên màn hình)
textRegex Biểu thức chính quy Java để khớp với text .
groupViewChildPosition , recyclerViewChildPosition hoặc adapterViewChildPosition Biểu thị vị trí con của tiện ích giao diện người dùng tùy thuộc vào loại tiện ích con của 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à mô tả nội dung. Ngay cả khi có một số giá trị thuộc tính, chúng 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 chỉ có thể phân biệt giữa các mục của danh sách bằng cách sử dụng các vị trí con khác nhau của chúng trong tiện ích gốc của chúng. Điều này có nghĩa là việc chỉ sử dụng một bộ mô tả thành phần để 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 một chuỗi các bộ mô tả thành phần được sắp xếp sao cho phần tử đầu tiên tương ứng với tiện ích UI đích, thuộc tính thứ hai tương ứng với tiện ích gốc của tiện ích UI đích, v.v. Tiện ích giao diện người dùng mục tiêu của một hành động được khớp khi tất cả các bộ mô tả thành phần của nó khớp với hệ thống phân cấp phụ của tiện ích giao diện người dùng tương ứng.

Sau đây là ví dụ về tập lệnh Robo có hành động nhấp chuột và thay đổi văn bản, 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 bộ mô tả thành phần đượ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"
      }
    ]
  }
]

Tùy chọn thực thi

Bạn có thể tùy ý thêm một đối tượng JSON vào danh sách hành động trong tập lệnh Robo để chỉ định các tùy 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ừ khóa roboscript , theo sau là phần trình bày JSON của các tùy chọn thực thi mong muốn.

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

  • executionMode - các tùy 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 áp dụng khớp một phần, bỏ qua hành động hiện tại và tạm dừng . Nghĩa là, tập lệnh Robo được thực thi dưới dạng kiểm tra thiết bị thông thường và không thành công ngay khi không thể thực hiện bất kỳ hành động nào của tập lệnh đó. Theo mặc định, nó là false .
    • notify - nếu được đặ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, nó là true .
  • postscript - các tùy chọn thực thi được áp dụng sau khi tập lệnh Robo hoàn tất:
    • terminate - nếu được đặt thành true , quá trình kiểm tra Robo sẽ dừng thu thập thông tin sau khi tập lệnh Robo hoàn tất. Theo mặc định, nó là false .

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

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

Thông số mẫu

Tham số mẫu là một phần giữ chỗ trong tập lệnh Robo được thay thế bằng giá trị thực tế khi kiểm tra 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 đặt ở hậu tố bằng 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 thử nghiệm.

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

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

Bình luận

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

Sau đây là ví dụ về tập lệnh Robo có một vài 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ả hành động của tập lệnh Robo được hoàn thành (hoặc ít nhất là đã thử), tập lệnh Robo vẫn hoạt động. Kiểm thử Robo tiếp tục cố gắng khớp một hành động tập lệnh Robo bất cứ khi nào nó chọn một hành động để thực hiện. Tập lệnh Robo sử dụng các kỹ thuật sau để tăng tính mạnh mẽ:

Kỹ thuật Sự miêu tả
Kết hợp một phần Nếu hành động 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à việc khớp sẽ được thử lại. Việc khớp một phần không xem xét bộ mô tả phần tử ngoài cùng trong khi khớp với tiện ích giao diện người dùng mục tiêu của hành động tập lệnh Robo.

Nếu khớp một phần thành công, hành động 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 tình huống trong đó 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 thành phần màn hình được sắp xếp lại.

Bỏ qua hành động hiện tại Nếu hành động tập lệnh Robo hiện tại không thể khớp hoàn toàn hoặc một phần, Robo sẽ cố gắng khớp hành động tập lệnh Robo tiếp theo. Nếu hành động tiếp theo khớp hoàn toàn hoặc một phần, kiểm tra 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 tình huống khi hành vi của ứng dụng thay đổi giữa các phiên bản hoặc không ổn định, chẳng hạn như khi hộp thoại ngắt quãng có thể xuất hiện ở các màn hình khác nhau trong khi ghi so với khi phát lại tập lệnh Robo.

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

Miễn là các hành động của tập lệnh Robo hiện tại hoặc tiếp theo không thể khớp, tập lệnh Robo vẫn bị treo đối với bất kỳ số lượng hành động nào. Do đó, tập lệnh Robo 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 với các hành động thử nghiệm Robo tiêu chuẩn. Kỹ thuật này hỗ trợ các tình huống khi hoạt động 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 để thử nghiệm Robo cần "lấp đầy khoảng trống" bằng các hành động tiêu chuẩn của nó.

Ưu tiên

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

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

Sau đây là ví dụ về tệp có ba 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 - ứng dụng đang thử nghiệm đang ở nền trước:

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

Khi ứng dụng đang 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ì nó có mức độ ưu tiên cao nhất.
  2. "Robo script 1" vì nó xuất hiện sớm hơn trong số các tập lệnh Robo hiện hành còn lại có cùng mức độ ưu tiên.
  3. "Robo script 3" là tập lệnh Robo có thể áp dụng cuối cùng.

Chạy lặp đi lặp lại

Theo mặc định, Robo kích hoạt tập lệnh Robo nhiều nhất một lần trong quá trình thu thập thông tin. Điều này có thể đượ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 ứng dụng đang thử nghiệm vào 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 ở các giai đoạn khác nhau của một lần thu thập dữ liệu Robo nhất định:

Giai đoạn thu thập dữ liệu Sự miêu 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 thử nghiệm.
post_crawl Sau khi Robo thu thập xong ứng dụng đang thử nghiệm.
crawl Giai đoạn thu thập thông tin chính, khi Robo thu thập dữ liệu ứng dụng đang thử nghiệm.
close_screen Khi Robo cố gắng quay lại (quay lại) từ một màn hình nhất định, khi tất cả các hành động có thể thực hiện trên màn hình này đã được khám phá. Theo mặc định, Robo sẽ nhấn lại, điều này không mong muốn trong một số trường hợp.

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

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

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

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

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

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

Tập lệnh Robo có thể chứa các hành động có điều kiện. Các hành động có điều kiện có ba thuộc tính bổ sung mô tả cách Robo thực hiện chúng:

Thuộc tính Sự miêu tả
priority Mức độ ưu tiên của hành động có điều kiện này so với các hành động có điều kiện khác trong tập lệnh Robo chứa nó. 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 Hành động có điều kiện này có thể được thực hiện bao nhiêu lần trong một lần thực thi tập lệnh Robo chứa nó. Theo mặc định, tất cả các hành động có điều kiện có thể được thực hiện nhiều nhất một lần trong một lần thực thi tập lệnh Robo chứa chú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ấu trúc tương tự và cung cấp các khả năng tương tự như [textDescriptor của tập lệnh Robo](#context-descriptor).

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

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

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

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 thể hiện dưới dạng bỏ qua "hành động" với eventType ELEMENT_IGNOREDALL_ELEMENTS_IGNORED tương ứng.

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

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

Sau đây là ví dụ về tệp có hai tập lệnh Robo. Tập lệnh Robo đầu tiên khiến Robo bỏ qua tất cả tiện ích giao diện người dùng trên màn hình chứa tiện ích giao diện người dùng có ID 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 giao diện người dùng có ID 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 "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à AdaptorView

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

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

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

  1. Kiểm tra robot đảm bảo rằng phần tử con tương ứng được hiển thị trên màn hình thông qua hành động định vị trên RecyclerView hoặc Adaptor có chứa nó.

  2. Kiểm tra robot thực hiện hành động được ghi trực tiếp trên phần tử con vì nó đã được hiển thị trên màn hình.

Sau đây là ví dụ về hành động nhấp chuột trên một Adaptor con ( 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ề hành động nhấp chuột trên 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 để lưu tập lệnh dưới dạng tệp JSON. Sau đó, bạn có thể tải tệp JSON lên Phòng thí nghiệm kiểm tra Firebase bằng ứng dụng và chạy thử nghiệm tương ứng.

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

Để tạo tệp JSON tập lệnh Robo trong Android Studio, hãy làm theo các bước trong 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 tùy chọn chung sau đây áp dụng cho tất cả các hành động:

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

Quả quyết

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, đây có thể là một xác nhận khác. Nếu không, quá trình thực thi tập lệnh Robo sẽ bị tạm dừng do xác nhận không thành công.

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

Thuộc tính Sự miêu tả
"eventType": "ASSERTION" --
contextDescriptor Mô tả bối cảnh hoặc điều kiện được khẳng định. Nó có cấu trúc tương tự và cung cấp các khả 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 nhằm kiểm tra xem ứng dụng đang thử nghiệm có ở nền trước hay không:

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

Sau đây là ví dụ về xác nhận tập lệnh Robo nhằm kiểm tra xem tiện ích giao diện người dùng có ID 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ề xác nhận tập lệnh Robo nhằm 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 liệt kê các thuộc tính bắt buộc:

Thuộc tính Sự miêu tả
eventType Chỉ định loại hành động của tập lệnh Robo.
"eventType": "VIEW_CLICKED" Nhấp vào phần tử mục tiêu của ứng dụng đang thử nghiệm.
"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 số lần maxNumberOfRuns .
"eventType": "LIST_ITEM_CLICKED" Được sử dụng bởi trình ghi tập lệnh Robo trong Android Studio để 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 cách sử dụng hệ thống 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 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ề hành động tập lệnh Robo nhấp vào nút có ID 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ề hành động 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ề hành động tập lệnh Robo nhấp vào thành phần bàn phím mềm có mô tả nội dung "Emoji button" :

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

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

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

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

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

Thuộc tính Sự miêu tả
"eventType": "DISABLE_KEYBOARD" --

Sau đây là ví dụ về hành động tập lệnh Robo vô hiệu hóa bàn phím mềm:

{
  "eventType": "DISABLE_KEYBOARD"
}

Thực thi lệnh shell adb

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

Thuộc tính Sự miêu tả
"eventType": "ADB_SHELL_COMMAND" --
command Lệnh shell Cầu gỡ lỗi Android (adb) sẽ được thực thi.

Thuộc tính sau là tùy chọn:

  • expectedOutputRegex - đầu ra dự kiến ​​của lệnh dưới dạng biểu thức chính quy Java. Nếu đầu ra không khớp thì hành động tập lệnh Robo sẽ không thành công. Theo mặc định, nó là một chuỗi rỗng, có nghĩa là đầu ra không được kiểm tra.

Sau đây là ví dụ về hành động tập lệnh Robo giúp xóa dữ liệu người dùng đang 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 được ghi lại bằng trình ghi tập lệnh Robo trong Android Studio để tương thích ngược với Trình ghi kiểm tra Espresso . Thử nghiệm Robo cấp tất cả các quyền cho ứng dụng đang được thử nghiệm vào đầu mỗi lần thu thập thông tin và do đó, hành động này là không hoạt động. KHÔNG sử dụng hành động này trong tập lệnh Robo của bạn.

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

Thuộc tính Sự miêu tả
"eventType": "PERMISSIONS_REQUEST" --

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

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

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

Thuộc tính Sự miêu tả
"eventType": "ALL_ELEMENTS_IGNORED" --

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

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

Bỏ qua một phần tử

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

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

Thuộc tính Sự miêu 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ệ thống phân cấp giao diện người dùng Android.

Thuộc tính sau là tùy chọn:

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

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

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

Nhập ký tự

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

Thuộc tính Sự miêu 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 đích rồi gửi sự kiện KEYCODE_ENTER tới 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ệ thống phân cấp giao diện người dùng Android.
replacementText Văn bản để nhập vào tiện ích giao diện người dùng mục tiêu.

Sau đây là ví dụ về hành động tập lệnh Robo nhập "John" vào tiện ích giao diện người dùng có ID 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 chuột dài

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

Thuộc tính Sự miêu 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ệ thống 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 lâu bằng OCR. Loại trừ lẫn nhau với elementDescriptors .

Thuộc tính sau là tùy chọn:

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

Sau đây là ví dụ về hành động tập lệnh Robo thực hiện thao tác nhấp chuột kéo dài 5 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 liệt kê các thuộc tính bắt buộc:

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

Thuộc tính sau là tùy chọn:

  • dragAndDrop - nếu được đặt thành true , cử chỉ một điểm sẽ thực hiện hành động kéo và thả. Theo mặc định, nó là false .

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

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

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

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

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

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

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

Thực hiện tác vụ IME

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

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

Thuộc tính Sự miêu 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ệ thống phân cấp giao diện người dùng Android.

Sau đây là ví dụ về hành động tập lệnh Robo thực hiện hành động IME trên tiện ích giao diện người dùng có ID 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 lại

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

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

Sau đây là ví dụ về hành động nhấn lùi của tập lệnh Robo:

{
  "eventType": "PRESSED_BACK"
}

Bấm về nhà

Hành động này sẽ gửi sự kiện KEYCODE_HOME tới thiết bị.

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

Thuộc tính Sự miêu tả
"eventType": "GO_HOME" --

Sau đây là ví dụ về hành động của tập lệnh Robo nhấn nút home:

{
  "eventType": "GO_HOME"
}

Cuộn một phần tử vào chế độ xem

Hành động này làm cho quá trình kiểm tra Robo 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 UI 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ượng cuộn tối đa là 50.

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

Thuộc tính Sự miêu 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ệ thống 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 để cuộn sang sử dụng hệ thống phân cấp giao diện người dùng Android.

Sau đây là ví dụ về hành động tập lệnh Robo cuộn tiện ích giao diện người dùng có ID 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 nữa được thực hiện hoặc đạt đến số lượng cuộn tối đa là 50):

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

Vuốt

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

Thuộc tính Sự miêu tả
"eventType": "VIEW_SWIPED" --
swipeDirection Chỉ định hướng vuốt:
  • Left
  • Right
  • Up
  • Down
  • Forward - Down hoặc Right tùy thuộc vào khả năng cuộn dọc hoặc ngang của tiện ích giao diện người dùng mục tiêu.
  • Backward - Up hoặc Left tùy thuộc vào khả năng cuộn dọc hoặc ngang của tiện ích giao diện người dùng mục tiêu.
elementDescriptors Xác định tiện ích giao diện người dùng mục tiêu bằng cách sử dụng hệ thống phân cấp giao diện người dùng Android.

Sau đây là ví dụ về hành động tập lệnh Robo vuốt lên tiện ích giao diện người dùng có ID 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 màn hình

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

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

Sau đây là ví dụ về hành động 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 liệt kê các thuộc tính bắt buộc:

Thuộc tính Sự miêu tả
"eventType": "POINT_TAP" --
pointTapXCoordinate Tọa độ pixel X của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent .
pointTapYCoordinate Tọa độ pixel Y của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent .
pointTapXPercent Tọa độ phần trăm X của điểm được khai thác. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate .
pointTapYPercent Tọa độ phần trăm Y của điểm được khai thác. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate .

Sau đây là ví dụ về hành động tập lệnh Robo chạm 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 liệt kê các thuộc tính bắt buộc:

Thuộc tính Sự miêu tả
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent Phần trăm tọa độ X trong phần tử đích.
pointTapYPercent Phần trăm tọa độ Y 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ệ thống phân cấp giao diện người dùng Android.

Sau đây là ví dụ về hành động tập lệnh Robo di chuyển thanh trượt của thanh tìm kiếm sang bên phải:

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

Chấm dứt thu thập thông tin

Hành động này sẽ dừng quá trình kiểm tra Robo.

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

Thuộc tính Sự miêu tả
"eventType": "TERMINATE_CRAWL" --

Sau đây là ví dụ về hành động tập lệnh Robo dừng thử nghiệm Robo:

{
  "eventType": "TERMINATE_CRAWL"
}

Chờ đợi

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

Thuộc tính Sự miêu tả
"eventType": "DELAYED_MESSAGE_POSTED" --
delayTime Chỉ định thời gian chờ đợi, tính bằng mili giây.

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

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

Chờ một phần tử

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

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

Thuộc tính Sự miêu 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ờ bằng cách sử dụng hệ thống phân cấp giao diện người dùng Android.

Sau đây là ví dụ về hành động tập lệnh Robo chờ tối đa 30 giây để tiện ích giao diện người dùng có ID 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"
    }
  ]
}

Bước tiếp theo