Firebase is back at Google I/O on May 10! Register now

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

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

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 âm và hành động. Tập lệnh Robo 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 các ứng dụng dành cho thiết bị di động và cho phép tích hợp liên tục (CI) và 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 các cách sau:

  • Sử dụng tính năng ghi tập lệnh Robo.
  • Tạo tập lệnh Robo theo cách thủ công.
  • Ghi lại tập lệnh Robo và sau đó chỉnh sửa thủ công.

Để 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 .

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

Sau đây là một ví dụ về tập lệnh Robo đăng nhập người dùng vào một ứng dụng, được kích hoạt khi khởi chạy thử nghiệm dưới ứng 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 này 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 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"
      }
    ]
  }
]

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.
description Tương tự như id nhưng mô tả nhiều hơn.
crawlStage Giai đoạn Robo thu thập thông tin áp dụng tập lệnh Robo này tại. Theo mặc định, đây là giai đoạn thu thập dữ liệu chính.
priority Mức độ ưu tiên của tập lệnh Robo này so với các tập lệnh Robo khác. Theo mặc định, tất cả các tập lệnh Robo đều có mức độ ưu tiên là 1 .
maxNumberOfRuns Chỉ định số lần trong quá trình thu thập thông tin mà Robo có thể thực thi tập lệnh Robo này. Theo mặc định, Robo có thể thực thi tập lệnh Robo một lần.
contextDescriptor Mô tả bối cảnh/điều kiện kích hoạt tập lệnh Robo này. Nếu 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, kịch bản 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 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"
      }
    ]
  }
]

mô tả ngữ cảnh

Bộ mô tả ngữ cảnh xác định ngữ cảnh/đ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": "element_present" Kiểm tra xem tiện ích giao diện người dùng khớp với elementDescriptors hoặc văn bản được chỉ định bởi visionText 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 không.
"condition": "element_checked" 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 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 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, điều đó có 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 hành động cuối cùng được thực hiện bởi Kiểm tra Robo không phải là hành động trong tập lệnh Robo.
negateCondition Nếu được đặt thành true , phủ nhận 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 có 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ả phần tử 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 .

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" xuất hiện trên màn hình:

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

Sau đây là ví dụ về tập lệnh Robo được kích hoạt bở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 có 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 thuộc tính-giá trị, đượ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ả 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 , 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 lỗi 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 hành động 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 đã gõ. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent . Cần thiết cho các hành động nhấn điểm.
pointTapXPercentpointTapYPercent Tỷ lệ phần trăm tọa độ X và Y của điểm đã 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à một ví dụ về tập lệnh Robo có hai tác vụ không có tiện ích giao diện người dùng mục tiêu, điều đó có nghĩa là các tác vụ này không hoạt động trên một tiện ích giao diện người dùng cụ thể:

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

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 xác định 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 Cụm từ thông dụng Java để khớp với resourceId .
contentDescription
contentDescriptionRegex Cụm từ thông dụng 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 Thể hiện 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 mẹ 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 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 mẹ của chúng. Điều này có nghĩa là việc chỉ sử dụng một bộ 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 một chuỗi các bộ mô tả phần tử được sắp xếp sao cho cái đầu tiên tương ứng với tiện ích UI đích, cái thứ hai tương ứng với tiện ích mẹ 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 đối sánh khi tất cả các bộ mô tả phần tử của nó khớp với 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 và thay đổi văn bản, cả hai hành động này đề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 hiện

Bạn có thể tùy ý thêm vào đầu danh sách các hành động trong tập lệnh Robo một đối tượng JSON 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à biểu diễn 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:
  • postscript - các tùy chọn thực thi được áp dụng sau khi hoàn thành tập lệnh Robo:
    • terminate - nếu được đặt thành true , kiểm tra Robo sẽ dừng thu thập thông tin sau khi hoàn thành tập lệnh Robo.

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

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

Thông số mẫu

Thông 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 thử nghiệm 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 gắn sau 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 thử nghiệm.

Sau đây là một 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 chú thích, là những dòng bắt đầu bằng # hoặc // .

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

Kỹ thuật Sự miêu tả
khớp một phần Nếu không thể khớp hoàn toàn hành động tập lệnh Robo hiện tại, tiêu chí khớp sẽ được nới lỏng và quá trình khớp sẽ được thử lại. 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 tiện ích giao diện người dùng đích 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, thì 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 một hộp thoại ngắt quãng 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.

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

Chừng nào các hành động trong tập lệnh Robo hiện tại hoặc tiếp theo không thể khớp với nhau, thì 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 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 để 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 này không thể được kích hoạt trong một lần thu thập dữ liệu nhất định nữa. Nếu nhiều hơn một tập lệnh Robo có thể được kích hoạt bởi ngữ cảnh hiện tại, thì ưu tiên được ưu tiên 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ả các tập lệnh Robo đều có cùng priority thực thi là 1 ).
  3. Xuất hiện sớm nhất trong danh sách 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ề một 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 ở 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 ở phía 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ì tập lệnh này xuất hiện sớm hơn trong số các tập lệnh Robo hiện hành còn lại có cùng mức độ ưu tiên.
  3. "Robo script 3" là tập lệnh Robo á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 thông tin

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 thông tin 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 hoàn thành thu thập dữ liệu ứng dụng đang thử nghiệm.
crawl Giai đoạn thu thập dữ liệu chính, khi Robo thu thập dữ liệu ứng dụng đang thử nghiệm.
close_screen Khi Robo cố quay lại (quay ngược) từ một màn hình nhất định, khi tất cả các hành động có thể có trên màn hình này được khám phá. Theo mặc định, Robo nhấn lại, đâ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 đó được hiểu là crawl .

Sau đây là ví dụ về tập lệnh Robo sẽ xóa dữ liệu người dùng trong ứng dụng đang được 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 nó cố quay lại (quay lui) 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 Số lần hành động có điều kiện này có thể được thực hiện trong một lần thực thi 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ùng cấu trúc và cung cấp các khả năng tương tự như [bộ mô tả ngữ cảnh của tập lệnh Robo](#bộ mô tả ngữ cảnh).

Khi được kích hoạt, tập lệnh Robo thực hiện lần lượt các hành động không có điều kiện theo thứ tự xuất hiện. Nếu 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 một hành động không có điều kiện để thực hiện. Nếu bất kỳ hành động có điều kiện nào được kích hoạt và chọn dựa trên mức độ ưu tiên của 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 với hành động có điều kiện sẽ loại bỏ 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
    }
}

Hành động bỏ qua

Tập lệnh Robo có thể chứa các hướng dẫn để Robo bỏ qua các tiện ích giao diện người dùng cụ thể hoặc tất cả các tiện ích 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 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 hỗn 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 khác của tập lệnh Robo, các hành động bỏ qua được áp dụng miễn là contextDescriptor chứa tập lệnh Robo khớp với màn hình trong quá trình thu thập dữ liệu Robo, bất kể giá trị của thuộc priority và thuộc tính maxNumberOfRuns .

Sau đây là một ví dụ về tệp có hai tập lệnh Robo. Tập lệnh Robo đầu tiên làm cho 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 làm cho Robo bỏ qua 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 giao diện người dùng có ID tài nguyên "my.app.package:id/main_screen" :

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

Hỗ trợ RecyclerView và AdapterView

Các tiện ích con của RecyclerView và AdapterView được tải động và có thể được hiển thị trong 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 để truy cập phần tử con này là khác nhau đối với các yếu tố hình thức thiết bị khác nhau, nên việc dựa vào vị trí dữ liệu của phần tử con sẽ hiệu quả hơn nhiều, đó là vị trí tuyệt đối. Đó 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 phần tử con này lên màn hình và sau đó sử dụng vị trí màn hình của phần tử đó.

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 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 AdapterView là mục tiêu của các hành động tập lệnh Robo dưới dạng adapterViewChildPosition .

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

  1. Kiểm tra Robo đả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 phần chứa RecyclerView hoặc AdapterView của nó.

  2. Kiểm tra rô-bốt 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à một ví dụ về hành động nhấp chuột trên một 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ề hành động nhấp chuột trê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 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 cùng với ứ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 của bạn, sau đó khám phá ứng dụng như bình thường.

Để tạo tệp JSON của 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 kịch bản Robo

Thuộc tính tùy chọn phổ biến sau á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ả thử nghiệm Robo.

Quả quyết

Nếu điều kiện đã xác nhận là đúng, tập lệnh Robo sẽ tiếp tục thực hiện hành động tiếp theo, hành động này có thể là một xác nhận khác. Mặt khác, quá trình 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 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ùng cấu trúc và cung cấp các khả năng tương tự như contextDescriptor của tập lệnh Robo .

Sau đây là một ví dụ về xác nhận tập lệnh Robo để 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à một ví dụ về xác nhận tập lệnh Robo để 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 để 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 Sự miêu tả
eventType Chỉ định loại hành động 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ử đí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 lên đến maxNumberOfRuns lần.
"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 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 thành phần 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 phần tử 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 ngẫu nhiên vào các phần tử bàn phím mềm tối đa năm lần:

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

Vô hiệu hóa 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 Sự miêu tả
"eventType": "DISABLE_KEYBOARD" --

Sau đây là một 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 trình bao adb

Bảng sau đây 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 Android Debug Bridge (adb) để thực thi.

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

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

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

Bỏ qua tất cả các yếu tố trên màn hình

Hành động này làm cho 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 đây 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 yếu tố

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

Bảng sau đây 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 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 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.*"
    }
  ]
}

Nhập ký tự

Bảng sau đây 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 tập lệnh Robo.
"eventType": "VIEW_TEXT_CHANGED" Nhập văn bản đã cho vào tiện ích giao diện người dùng mục tiêu.
"eventType": "ENTER_TEXT" nhập văn bản đã cho vào tiện ích giao diện người dùng mục tiêu, sau đó gửi sự kiện KEYCODE_ENTER 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 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"
    }
  ]
}

bấm dài

Bảng sau đây 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 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:

  • delayTime - chỉ định thời gian nhấn xuống của một lần nhấp dài kéo 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 nhấp chuột kéo dài 5 giây trên 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 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 đây 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à một ví dụ về hành động tập lệnh Robo thực hiện cử chỉ véo:

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

Thực hiện một 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, xong và tìm kiếm, trên Trình soạn phương pháp nhập liệu (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 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 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 đây 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 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 vào API 28 của trình giả lập.

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

{
  "eventType": "PRESSED_BACK"
}

nhấn nhà

Hành động này sẽ gửi 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 Sự miêu tả
"eventType": "GO_HOME" --

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

{
  "eventType": "GO_HOME"
}

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

Hành động này làm cho thử nghiệm 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 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 đã cuộn không thể cuộn được nữa hoặc đạt đến số lần cuộn tối đa là 50 lần.

Bảng sau đây 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 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 tới bằ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 nữa được thực hiện hoặc đạt đến số lượng tối đa 50 cuộn):

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

vuốt

Bảng sau đây 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 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 đây 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"
}

Chạm 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 Sự miêu tả
"eventType": "POINT_TAP" --
pointTapXCoordinate Tọa độ pixel X của điểm đã khai thác. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent .
pointTapYCoordinate Tọa độ pixel Y của điểm đã khai thác. Loại trừ lẫn nhau với pointTapXPercentpointTapYPercent .
pointTapXPercent Tỷ lệ phần trăm tọa độ X của điểm khai thác. Loại trừ lẫn nhau với pointTapXCoordinatepointTapYCoordinate .
pointTapYPercent Tỷ lệ phần trăm tọa độ Y của điểm 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 đây 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 Tỷ lệ phần trăm tọa độ X trong phần tử đích.
pointTapYPercent Tỷ lệ 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 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 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 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 Sự miêu tả
"eventType": "TERMINATE_CRAWL" --

Sau đây là một ví dụ về hành động tập lệnh Robo dừng kiểm tra Robo:

{
  "eventType": "TERMINATE_CRAWL"
}

Chờ đợi

Bảng sau đây 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à một 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 làm cho Robo test đợi một phần tử xuất hiện trên màn hình cho đến 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 Sự miêu tả
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Chỉ định thời gian chờ đợi, 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 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