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, ghi và hành động. Tập lệnh Robo là các kiểm thử tự động hoá các tác vụ đảm bảo chất lượng (QA) thủ công cho ứng dụng di động, đồng thời hỗ trợ các chiến lược kiểm thử trước khi ra mắt và tích hợp liên tục (CI). 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 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 tập lệnh Robo.
Giới thiệu
Tập lệnh Robo được cung cấp cho thử nghiệm Robo cùng với các dữ liệu đầu vào khác như Gói ứng dụng Android (APK) đang được thử nghiệm.
Sau đây là ví dụ về một tập lệnh Robo giúp người dùng đăng nhập vào một ứng dụng, được kích hoạt khi ứng dụng đang kiểm thử khởi chạy:
[
{
"crawlStage": "crawl",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "user123",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/username"
}
]
},
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "12345",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/password"
}
]
},
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/login"
}
]
}
]
}
]
Nếu có một tập lệnh Robo duy nhất trong một tệp và tập lệnh đó có điều kiện kích hoạt mặc định app_under_test_shown, như trong ví dụ trên, thì bạn có thể chỉ định tập lệnh Robo trong một tệp bằng định dạng đơn giản hơn – chỉ dưới dạng một chuỗi các hành động:
[
{
"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ợ tập lệnh Robo cho iOS trở lên
Robo cho iOS+ (Thử nghiệm) chỉ hỗ trợ một số tập lệnh Robo. Cú pháp tập lệnh Robo cho iOS+ giống hệt với cú pháp Android và các tính năng iOS+ đượ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+:
- Câu nhận định
- Nhấp chuột
- Nhấp và giữ
- Trượt
- Bỏ qua tất cả phần tử
- Đợi
- Chụp ảnh màn hình
- Chấm dứt thu thập dữ liệu
Các thuộc tính nhận dạng sau đây trong phần mô tả phần tử được hỗ trợ trong iOS+:
- 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)
iOS+ hỗ trợ các điều kiện kích hoạt sau đây trong phần mô tả bối cảnh:
- Ứng dụng đang được kiểm thử
- Có phần tử
- Đã thực hiện hành động không phải tập lệnh 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à có giá trị mặc định được xác định trước:
| Thuộc tính | Nội dung mô tả |
id
|
Một số nguyên giúp theo dõi tập lệnh Robo này trong kết quả thu thập dữ liệu.
Robo có các tập lệnh Robo tích hợp sẵn với id riêng. Mặc dù
id giống nhau 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 của các tập lệnh Robo này trong kết quả thu thập dữ liệu có thể gặp khó khăn. Bạn nên chỉ định một id duy nhất từ 1000 trở lên cho tập lệnh Robo để tránh mọi xung đột.
|
description
|
Tương tự như id nhưng mô tả chi tiết hơn.
|
crawlStage
|
Giai đoạn thu thập dữ liệu mà Robo á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ả tập lệnh Robo đều có mức độ ưu tiên là 1.
|
maxNumberOfRuns
|
Chỉ định số lần Robo có thể thực thi tập lệnh Robo này trong một lần thu thập dữ liệu. Theo mặc định, Robo có thể thực thi tập lệnh Robo một lần. |
contextDescriptor
|
Mô tả bối cảnh hoặc điều kiện kích hoạt tập lệnh Robo này. Nếu bạn bỏ qua, điều kiện kích hoạt của tập lệnh Robo này được coi là luôn được đáp ứng; nói cách khác, tập lệnh Robo là vô điều kiện. |
actions
|
Tất cả hành động của tập lệnh Robo này. |
Một tệp duy nhất chứa một tập hợp gồm một hoặc nhiều tập lệnh Robo.
Sau đây là ví dụ về một tệp có hai tập lệnh Robo không đ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 dữ liệu:
[
{
"id": 1000,
"description": "My first Robo script",
"actions": [
{
"eventType": "DISABLE_KEYBOARD"
}
]
},
{
"id": 1001,
"description": "My second Robo script",
"actions": [
{
"eventType": "PRESSED_BACK"
}
]
}
]
Phần mô tả bối cảnh
Phần mô tả bối cảnh xác định bối 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 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 có 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 có 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 có trên màn hình và đã được đánh dấu.
|
"condition": "app_under_test_shown"
|
Kiểm tra để đảm bảo ứng dụng đang được kiểm thử đang chạy trên 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ị đang hiển thị, tức là không có ứng dụng nào đang chạy ở nền trước. |
"condition": "non_roboscript_action_performed"
|
Kiểm tra để đảm bảo rằng nonRoboscriptActionCount hành động liên tiếp gần đây nhất mà 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 được đặt thành true, thì condition sẽ bị phủ định. Ví dụ: bạn có thể sử dụng thuộc tính này để kiểm tra xem một tiện ích giao diện người dùng có KHÔNG xuất hiện trên màn hình hay không, hoặc ứng dụng đang được kiểm thử có KHÔNG chạy ở nền trước hay không.
|
elementDescriptors
|
Một hoặc nhiều phần 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.
Thuộc tính này được dùng kết hợp với các điều kiện element_present, element_disabled và element_checked. Không thể dùng chung với visionText. Để biết thêm thông tin, hãy xem phần Phần tử mô 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. Không thể dùng chung với elementDescriptors.
|
nonRoboscriptActionCount
|
Số hành động liên tiếp không phải là hành động của Robo script được thực hiện trước đó. Điều kiện này được dùng kết hợp với điều kiện non_roboscript_action_performed để kích hoạt 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ề một tập lệnh Robo được kích hoạt bởi một tiện ích giao diện người dùng có mã tài nguyên "my.app.package:id/page_header" xuất hiện trên màn hình:
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/page_header"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Settings"
}
]
}
]
}
Sau đây là ví dụ về một tập lệnh Robo được kích hoạt bằng
"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 hành động Robo không phải tập lệnh:
{
"contextDescriptor": {
"condition": "non_roboscript_action_performed"
},
"maxNumberOfRuns" : 1000,
"actions" : [
{
"eventType" : "WAIT",
"delayTime" : 5000
}]
}
Hành động
Mỗi hành động trong tập lệnh Robo được biểu thị dưới dạng một gói gồm một hoặc nhiều cặp giá trị thuộc tính, được mô tả trong bảng sau:
| Thuộc tính | Nội dung mô tả |
eventType
|
Chỉ định loại hành động, ví dụ: nhấp, 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ả giúp 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ả 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 bạn đặt thành true, thao tác này sẽ bị bỏ qua khi không thể thực hiện. Ví dụ: hành động 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 hành động đó. Theo mặc định, giá trị này là false.
|
replacementText
|
Văn bản cần nhập vào tiện ích giao diện người dùng mục tiêu. Bắt buộc đối với các thao tác chỉnh sửa văn bản. |
swipeDirection
|
Chỉ định hướng vuốt. Bắt buộc đối với 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 hành động chờ. |
pointTapXCoordinate và pointTapYCoordinate
|
Toạ độ X và Y của điểm được nhấn vào, tính bằng pixel. Loại trừ lẫn nhau với pointTapXPercent và pointTapYPercent.
Bắt buộc đối với các hành động nhấn vào điểm.
|
pointTapXPercent và pointTapYPercent
|
Toạ độ X và Y theo tỷ lệ phần trăm của điểm được nhấn. Loại trừ lẫn nhau với pointTapXCoordinate và pointTapYCoordinate. Bắt buộc đối với các hành động nhấn vào điểm.
|
Sau đây là ví dụ về một 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, tức là các hành động này không hoạt động trên một tiện ích giao diện người dùng cụ thể:
[
{
"eventType": "WAIT",
"delayTime": 3000
},
{
"eventType": "PRESSED_BACK"
}
]
Phần mô tả phần tử
Phần tử mô tả xác định một tiện ích giao diện người dùng bằng cách sử dụng một hoặc nhiều thuộc tính nhận dạng sau:
| Thuộc tính | Nội dung mô tả |
className
|
– |
ancestorClassName
|
Tên lớp của thành phần cấp trên trong hệ phân cấp giao diện người dùng của phần tử. Phần tử cấp trên là bất kỳ nút mẹ nào trong hệ phân cấp giao diện người dùng của phần tử, bao gồm cả chính phần tử đó. |
resourceId
|
– |
resourceIdRegex
|
Biểu thức chính quy Java để so khớp với resourceId.
|
contentDescription
|
– |
contentDescriptionRegex
|
Biểu thức chính quy Java để so 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 để so khớp với text.
|
groupViewChildPosition,
recyclerViewChildPosition hoặc
adapterViewChildPosition
|
Biểu thị vị trí của tiện ích con trên giao diện người dùng, tuỳ thuộc vào loại tiện ích mẹ. |
Thông thường, các thuộc tính này không được xác định, ví dụ: một nút có thể không có văn bản và nội dung mô tả. Ngay cả khi có một số giá trị thuộc tính,
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 thường, bạn chỉ có thể phân biệt giữa 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à việc chỉ sử dụng một chỉ số mô tả phần tử để xác định một 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 chỉ số mô tả phần tử được sắp xếp sao cho chỉ số đầu tiên tương ứng với tiện ích giao diện người dùng mục tiêu, chỉ số thứ hai tương ứng với tiện ích mẹ của tiện ích giao diện người dùng mục tiêu, v.v. Tiện ích giao diện người dùng mục tiêu của một hành động sẽ khớp khi tất cả các phần mô tả phần tử của tiện ích đó khớp với hệ phân cấp phụ của tiện ích giao diện người dùng tương ứng.
Sau đây là ví dụ về một tập lệnh Robo có hành động thay đổi văn bản và hành động nhấp, 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 các chỉ số 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ể thêm tiền tố vào danh sách hành động trong tập lệnh Robo bằng một đối tượng JSON chỉ định các tuỳ chọn thực thi cho tập lệnh Robo đó. Tiêu đề cấu hình này bắt đầu bằng từ khoá roboscript, theo sau là bản trình bày JSON của các lựa chọn thực thi mong muốn.
Tập lệnh Robo hỗ trợ các tuỳ chọn thực thi sau:
executionMode– các tuỳ chọn thực thi được áp dụng khi tập lệnh Robo đang chạy:strict– nếu được đặt thànhtrue, tập lệnh Robo sẽ không sử dụng tính năng so khớp một phần, bỏ qua hành động hiện tại và tạm ngưng. Tức 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, giá trị này làfalse.dismiss_popups– nếu được đặt thànhtrue, thì thử nghiệm Robo sẽ đóng mọi hộp thoại không mong muốn trong khi thực hiện tập lệnh Robo, ngay cả ở chế độstrict. Tuỳ chọn này không có hiệu lực khi không ở chế độstrict. Theo mặc định, giá trị này làfalse.notify– nếu bạn đặt thànhfalse, tập lệnh Robo sẽ không hiện thông báo trên màn hình khi bắt đầu và kết thúc quá trình thực thi. Theo mặc định, giá trị này làtrue.
postscript– các lựa chọn thực thi được áp dụng sau khi hoàn tất tập lệnh Robo:terminate– nếu bạn đặt thànhtrue, thử nghiệm Robo sẽ ngừng thu thập dữ liệu sau khi tập lệnh Robo hoàn tất. Theo mặc định, giá trị này làfalse.
Sau đây là ví dụ về một tập lệnh Robo được thực thi ở chế độ strict mà không có thông báo trên màn hình, chờ trong 3 giây, sau đó quá trình thu thập dữ liệu sẽ dừng lại:
"roboscript": {
"executionMode": {
"strict": true,
"notify": false
},
"postscript": {
"terminate": true
}
}
[
{
"eventType": "WAIT",
"delayTime": 3000
}
]
Tham 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 thử nghiệm Robo tải tập lệnh Robo đó để thực thi. Tham số mẫu có tiền tố là dấu gạch dưới kép, theo sau là dấu phần trăm và có hậu tố là dấu phần trăm, theo sau là dấu gạch dưới kép.
Tập lệnh Robo hỗ trợ tham số mẫu sau:
__%APP_PACKAGE_NAME%__– tên gói của ứng dụng đang được kiểm thử.
Sau đây là ví dụ về một tập lệnh Robo dừng quy trình của ứng dụng đang được kiểm thử:
[
{
"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à những dòng bắt đầu bằng # hoặc //.
Sau đây là ví dụ về một tập lệnh Robo có một vài 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 hoàn tất (hoặc ít nhất là đã được thử), tập lệnh Robo vẫn hoạt động. Thử nghiệm Robo liên tục cố gắng so khớp một hành động trong tập lệnh Robo bất cứ khi nào 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 | Nội dung mô tả |
| Kiểu khớp một phần | Nếu không thể so khớp hoàn toàn hành động hiện tại của tập lệnh Robo, thì tiêu chí so khớp sẽ được nới lỏng và quá trình so khớp sẽ được thử lại. Tính năng so khớp một phần không xem xét phần mô tả phần tử ngoài cùng trong khi so khớp tiện ích giao diện người dùng mục tiêu của một hành động trong Robo script.
Nếu so khớp một phần thành công, thì hành động tương ứng của tập lệnh Robo sẽ được thực hiện như bình thường. Kỹ thuật này hỗ trợ các trường hợp cấu trúc ứng dụng thay đổi, chẳng hạn như giữa các phiên bản ứng dụng, khi các phần tử trên màn hình được sắp xếp lại. |
| Bỏ qua hành động hiện tại | Nếu không thể so khớp toàn bộ hoặc một phần hành động hiện tại của tập lệnh Robo, thì Robo sẽ cố gắng so khớp hành động tiếp theo của tập lệnh Robo. Nếu hành động tiếp theo khớp hoàn toàn hoặc khớp một phần, thì thử nghiệm Robo sẽ bỏ qua (và không bao giờ quay lại) hành động hiện tại của tập lệnh Robo và thực hiện hành động tiếp theo.
Kỹ thuật này hỗ trợ các trường hợp khi hành vi của ứng dụng thay đổi giữa các phiên bản hoặc không ổn định, ví dụ: khi một hộp thoại không liên tục có thể xuất hiện ở các màn hình khác nhau trong quá trình ghi so với phát lại tập lệnh Robo. |
| Tạm ngưng | Nếu không thể so khớp hoàn toàn hoặc một phần hành động hiện tại hoặc hành động tiếp theo của tập lệnh Robo, thì tập lệnh Robo sẽ tạm thời bị tạm ngưng và thử nghiệm Robo sẽ chọn một hành động để thực hiện bằng các chiến lược khác. Sau khi hoàn tất hành động này, thử nghiệm Robo sẽ tiếp tục thực thi tập lệnh Robo.
Miễn là không thể so khớp các hành động hiện tại hoặc tiếp theo của tập lệnh Robo, tập lệnh Robo sẽ vẫn bị tạm ngưng đối với 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 trường hợp khi hành vi của ứng dụng không ổn định hoặc khi các thay đổi giữa các phiên bản ứng dụng đủ lớn để Thử nghiệm Robo cần "lấp đầy khoảng trống" bằng các hành động tiêu chuẩn. |
Mức độ ưu tiên
Nếu tập lệnh Robo đạt đến maxNumberOfRuns, thì tập lệnh đó sẽ 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 có nhiều tập lệnh Robo có thể được kích hoạt theo bối cảnh hiện tại, thì mức độ ưu tiên sẽ được đưa ra bằng cách chọn tập lệnh Robo theo thứ tự sau:
- Có thuộc tính
contextDescriptor. - Có
prioritycao nhất (theo mặc định, tất cả tập lệnh Robo đều có cùngprioritythực thi là1). - 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 các tập lệnh Robo là như 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 theo cùng một điều kiện – ứng dụng đang được kiểm thử ở nền trước:
[
{
"id": 1000,
"description": "Robo script 1",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
},
{
"id": 1001,
"description": "Robo script 2",
"priority": "2",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
},
{
"id": 1002,
"description": "Robo script 3",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "WAIT",
"delayTime": 3000
}
]
}
]
Khi ứng dụng đang được kiểm thử ở nền trước, Robo sẽ kích hoạt các thao tác sau theo thứ tự:
"Robo script 2"vì có mức độ ưu tiên cao nhất."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 còn lại có thể áp dụng và có cùng mức độ ưu tiên."Robo script 3"là tập lệnh Robo áp dụng gần đây nhất.
Lượt chạy lặp lại
Theo mặc định, Robo sẽ kích hoạt một tập lệnh Robo tối đa một lần trong quá trình thu thập dữ liệu. Bạn có thể điều chỉnh thuộc tính này thông qua thuộc tính maxNumberOfRuns.
Sau đây là ví dụ về một tập lệnh Robo đưa ứng dụng đang được kiểm thử vào chế độ nền tối đa 10 lần:
{
"id": 1000,
"maxNumberOfRuns": 10,
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "GO_HOME"
}
]
}
Giai đoạn thu thập dữ liệu
Bạn có thể áp dụng tập lệnh Robo ở nhiều giai đoạn 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 | Nội dung mô tả |
pre_crawl
|
Trước khi Robo khởi chạy và bắt đầu thu thập dữ liệu ứng dụng đang được kiểm thử. |
post_crawl
|
Sau khi Robo hoàn tất việc thu thập dữ liệu ứng dụng đang được kiểm thử. Một
Tập lệnh Robo post_crawl không được vượt quá 15 giây
thời lượng, nếu không, quá trình thu thập dữ liệu có thể chấm dứt do hết thời gian chờ.
|
crawl
|
Giai đoạn thu thập dữ liệu chính, khi Robo thu thập dữ liệu của ứng dụng đang được kiểm thử. |
close_screen
|
Khi Robo cố gắng quay lại (quay lui) từ một màn hình nhất định, khi tất cả các hành động có thể thực hiện trên màn hình này đều được khám phá. Theo mặc định, Robo sẽ nhấn nút quay 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 này được ngụ ý là crawl.
Sau đây là ví dụ về một tập lệnh Robo xoá dữ liệu người dùng của ứng dụng đang được kiểm thử trước khi Robo bắt đầu thu thập thông tin:
{
"id": 1000,
"crawlStage": "pre_crawl",
"actions": [
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
]
}
Sau đây là ví dụ về một tập lệnh Robo hướng dẫn Robo nhấp vào "Cancel" bất cứ khi nào Robo cố gắng quay lại (quay lại) từ hộp thoại xác nhận:
{
"id": 1000,
"crawlStage": "close_screen",
"maxNumberOfRuns": 999,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_dialog"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Cancel"
}
]
}
]
}
Hành động có điều kiện
Tập lệnh Robo có thể chứa các hành động có điều kiện. Hành động có điều kiện có 3 thuộc tính bổ sung mô tả cách Robo thực hiện các hành động đó:
| Thuộc tính | Nội dung mô tả |
priority
|
Mức độ ưu tiên của hành động có điều kiện này so với các hành động có điều kiện khác trong tập lệnh Robo chứa hành động đó. Theo mặc định, tất cả
hành động có điều kiện đều có mức độ ưu tiên là 1.
|
maxNumberOfRuns
|
Số lần có thể thực hiện hành động có điều kiện này trong một lần thực thi tập lệnh Robo chứa hành động đó. Theo mặc định, tất cả hành động có điều kiện đều có thể được thực hiện tối đa một lần trong một lần thực thi 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. Trường 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 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ì các hành động đó sẽ được xem xét mỗi lần 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 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 không có điều kiện với một hành động có điều kiện để đóng hộp thoại bật lên nếu hộp thoại đó xuất hiện tại bất kỳ thời điểm nào trong quá trình thực thi tập lệnh Robo:
{
"id": 1000,
"actions": [
{
"description": "Dismiss popup",
"maxNumberOfRuns": 100,
"contextDescriptor": {
"condition": "default_launcher_shown",
"negateCondition": true
},
"eventType": "GO_HOME"
},
{
"description": "Screen off",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 26"
},
{
"description": "Wait for 10 seconds",
"eventType": "WAIT",
"delayTime": 10000
},
{
"description": "Screen on",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 82"
},
{
"description": "Wait for 10 seconds",
"eventType": "WAIT",
"delayTime": 10000
}
}
Bỏ qua hành động
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ị dưới dạng bỏ qua "hành động" bằng eventType ELEMENT_IGNORED và ALL_ELEMENTS_IGNORED tương ứng.
Bất cứ khi nào thuộc tính contextDescriptor của tập lệnh Robo chứa các hành động bỏ qua khớp với một màn hình nhất định, Robo sẽ không tương tác với bất kỳ tiện ích giao diện người dùng nào được nhắm mục tiêu bằng các hành động bỏ qua (trừ phi một số hành động khác của tập lệnh Robo khiến Robo thực hiện 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).
Một 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 khác trong tập lệnh Robo, các hành động bỏ qua sẽ được áp dụng miễn là contextDescriptor của tập lệnh Robo chứa các hành động đó khớp với một màn hình trong quá trình thu thập dữ liệu của Robo, bất kể giá trị của các thuộc tính priority và maxNumberOfRuns.
Sau đây là ví dụ về một tệp có hai tập lệnh Robo. Tập lệnh Robo đầu tiên khiến Robo bỏ qua 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ó mã 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ó mã tài nguyên khớp với biểu thức chính quy Java ".*:id/done" trên màn hình chứa tiện ích giao diện người dùng có mã tài nguyên "my.app.package:id/main_screen":
[
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/ignored_screen"
}
]
},
"actions": [
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
]
},
{
"id": 1001,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/main_screen"
}
]
},
"actions": [
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"resourceIdRegex": ".*:id/done"
}
]
}
]
}
]
Hỗ trợ RecyclerView và AdapterView
Các thành phần con của tiện ích RecyclerView và AdapterView được tải linh động và có thể xuất hiện sau 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 để chuyển đến thành phần con này là khác nhau đối với các kiểu dáng thiết bị khác nhau, nên việc dựa vào vị trí dữ liệu của thành phần con (vốn là tuyệt đối) sẽ hiệu quả hơn nhiều. Đâ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 rồi sử dụng vị trí của thành phần đó trên màn hình.
Do đó, tập lệnh Robo ghi lại các vị trí dữ liệu tuyệt đối của các phần tử con RecyclerView là mục tiêu của các hành động trong tập lệnh Robo dưới dạng recyclerViewChildPosition. Tập lệnh Robo cũng ghi lại 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 trong tập lệnh Robo dưới dạng adapterViewChildPosition.
Thao tác trên các thành phần con của RecyclerView và AdapterView được thực hiện theo các bước sau:
Thử nghiệm Robo đảm bảo rằng thành phần con tương ứng sẽ xuất hiện trên màn hình thông qua một thao tác định vị trên RecyclerView hoặc AdapterView chứa thành phần con đó.
Thử nghiệm Robo thực hiện hành động đã ghi trực tiếp trên phần tử con vì phần tử này đã xuất hiện trên màn hình.
Sau đây là ví dụ về thao tác nhấp vào một thành phần con của AdapterView (android.widget.GridView):
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "com.google.samples.apps.topeka.widget.AvatarView",
"adapterViewChildPosition": 5,
"resourceId": "com.google.samples.apps.topeka:id/avatar",
"contentDescription": "Avatar 6"
},
{
"className": "android.widget.GridView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/avatars"
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 1
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 0
}
]
}
Sau đây là ví dụ về thao tác nhấp vào một thành phần con của 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ẽ được lưu dưới dạng tệp JSON. Sau đó, bạn có thể tải tệp JSON lên Firebase Test Lab bằng ứng dụng và chạy kiểm thử tương ứng.
Khi bạn chạy thử nghiệm Robo có đính kèm tập lệnh, trước tiên, thử nghiệm Robo sẽ thực hiện các hành động được viết sẵn trong tập lệnh, 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 phần Ghi lại tập lệnh Robo bằng Test Lab trong Android Studio.
Thao tác trong 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 quá trình thực thi hành động này của tập lệnh Robo trong kết quả thử nghiệm Robo.
Câu nhận định
Nếu điều kiện được xác nhận là đúng, thì tập lệnh Robo sẽ tiếp tục thực hiện hành động tiếp theo, có thể là một câu nhận định khác. Nếu không, quá trình thực thi tập lệnh Robo sẽ bị tạm dừng do xác nhận không thành công.
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Nội dung mô tả |
"eventType": "ASSERTION"
|
-- |
contextDescriptor
|
Mô tả bối cảnh hoặc điều kiện được xác nhận. Trường 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. |
Sau đây là ví dụ về câu nhận định trong tập lệnh Robo để kiểm tra xem ứng dụng đang được kiểm thử có đang chạy ở nền trước hay không:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
Sau đây là ví dụ về câu nhận định trong tập lệnh Robo để kiểm tra xem một tiện ích giao diện người dùng có mã tài nguyên "com.google.samples.apps.topeka:id/done" có xuất hiện trên màn hình hay không:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
Sau đây là ví dụ về câu nhận định trong tập lệnh Robo để kiểm tra xem "Settings" có KHÔNG được phát hiện trên màn hình bằng OCR hay không:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"negateCondition": true,
"visionText": "Settings"
}
}
Nhấp chuột
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Nội dung mô tả |
|---|---|
eventType
|
Chỉ định loại 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 đượ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 vào bằng hệ phân cấp giao diện người dùng Android.
Không thể dùng chung với visionText.
|
visionText
|
Xác định phần tử được nhấp bằng OCR. Không thể dùng chung với elementDescriptors.
|
matchIndex
|
Chỉ định chỉ mục của lần xuất hiện phần tử mục tiêu khớp, khi
phần tử mục tiêu được xác định bằng visionText. Nếu là 0, thì hành động của tập lệnh Robo sẽ chọn phần tử khớp đầu tiên, nếu là 1, thì hành động của tập lệnh Robo sẽ chọn phần tử khớp thứ hai, v.v. Thứ tự được xác định từ trái sang phải, từ trên xuống dưới. Giá trị mặc định là 0 (giá trị khớp đầu tiên được chọn).
|
maxNumberOfRuns
|
Chỉ định số lần nhấp vào một phần tử ngẫu nhiên của bàn phím mềm,
khi eventType là SOFT_KEYBOARD_RANDOM_CLICK.
Giá trị mặc định là 1.
|
Sau đây là ví dụ về một hành động trong tập lệnh Robo nhấp vào nút có mã tài nguyên "com.google.samples.apps.topeka:id/done":
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
Sau đây là ví dụ về một hành động trong tập lệnh Robo nhấp vào lần xuất hiện thứ hai của từ "Search" được phát hiện trên màn hình bằng OCR:
{
"eventType": "VIEW_CLICKED",
"visionText": "Search",
"matchIndex": 1
}
Sau đây là ví dụ về một hành động trong tập lệnh Robo nhấp vào một phần tử bàn phím mềm có nội dung mô tả "Emoji button":
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
Sau đây là ví dụ về một hành động trong tập lệnh Robo nhấp vào các phần tử bàn phím mềm ngẫu nhiên tối đa 5 lần:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
Tắt bàn phím mềm
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "DISABLE_KEYBOARD"
|
-- |
Sau đây là ví dụ về một hành động trong tập lệnh Robo giúp tắt bàn phím ảo:
{
"eventType": "DISABLE_KEYBOARD"
}
Thực thi lệnh shell adb
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "ADB_SHELL_COMMAND"
|
-- |
command
|
Lệnh shell Cầu gỡ lỗi Android (adb) cần thực thi. |
Thuộc tính sau đây là không bắt buộc:
expectedOutputRegex– kết quả dự kiến của lệnh dưới dạng biểu thức chính quy Java. Nếu kết quả không khớp, hành động của tập lệnh Robo sẽ không thành công. Theo mặc định, đây là một chuỗi trống, nghĩa là kết quả không được kiểm tra.
Sau đây là ví dụ về một hành động trong tập lệnh Robo giúp xoá dữ liệu người dùng của ứng dụng đang được kiểm thử:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
Cấp quyền
Thao tác này được trình ghi tập lệnh Robo ghi lại trong Android Studio để có khả năng tương thích ngược với Trình ghi lại quá trình kiểm thử Espresso. Thử nghiệm Robo cấp tất cả quyền cho ứng dụng đang được kiểm thử khi bắt đầu mỗi lần thu thập dữ liệu, do đó, hành động này không có hiệu lực. KHÔNG sử dụng hành động này trong tập lệnh Robo.
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "PERMISSIONS_REQUEST"
|
-- |
Bỏ qua tất cả các phần tử trên màn hình
Thao tác này khiến Robo bỏ qua tất cả các phần tử trên mọi màn hình kích hoạt tập lệnh Robo chứa thao tác này.
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "ALL_ELEMENTS_IGNORED"
|
-- |
Sau đây là ví dụ về một hành động trong tập lệnh Robo khiến Robo bỏ qua tất cả phần tử trên màn hình:
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
Bỏ qua một phần tử
Thao tác này khiến Robo bỏ qua một (hoặc nhiều) 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 | Mô tả |
"eventType": "ELEMENT_IGNORED"
|
-- |
elementDescriptors
|
Xác định(các) tiện ích giao diện người dùng bị bỏ qua bằng cách sử dụng hệ phân cấp giao diện người dùng Android. |
Thuộc tính sau đây là không bắt buộc:
ignoreChildren– nếu được đặt thànhtrue, Robo cũng sẽ bỏ qua tất cả thành phần con của(các) tiện ích giao diện người dùng bị bỏ qua. Theo mặc định, giá trị này làfalse.
Sau đây là ví dụ về một hành động trong tập lệnh Robo khiến Robo bỏ qua tất 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 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 đến tiện ích giao diện người dùng này.
|
elementDescriptors
|
Xác định tiện ích giao diện người dùng mục tiêu bằng cách sử dụng hệ phân cấp giao diện người dùng Android. |
replacementText
|
Văn bản cần nhập vào tiện ích giao diện người dùng mục tiêu. |
Sau đây là ví dụ về một hành động trong tập lệnh Robo nhập "John" vào một tiện ích giao diện người dùng có mã tài nguyên "com.google.samples.apps.topeka:id/first_name":
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
Nhấp và giữ
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "VIEW_LONG_CLICKED"
|
-- |
elementDescriptors
|
Xác định tiện ích giao diện người dùng mục tiêu bằng cách sử dụng hệ phân cấp giao diện người dùng Android. Không thể dùng chung với visionText.
|
visionText
|
Xác định phần tử được nhấp và giữ bằng OCR. Không thể dùng chung với elementDescriptors.
|
matchIndex
|
Chỉ định chỉ mục của lần xuất hiện phần tử mục tiêu khớp, khi
phần tử mục tiêu được xác định bằng visionText. Nếu là 0, thì hành động của tập lệnh Robo sẽ chọn phần tử khớp đầu tiên, nếu là 1, thì hành động của tập lệnh Robo sẽ chọn phần tử khớp thứ hai, v.v. Thứ tự được xác định từ trái sang phải, từ trên xuống dưới. Giá trị mặc định là 0 (giá trị khớp đầu tiên được chọn).
|
Thuộc tính sau đây là không bắt buộc:
delayTime– chỉ định thời gian nhấn giữ của một lượt nhấp dài, tính bằng mili giây.
Sau đây là ví dụ về một hành động trong tập lệnh Robo thực hiện thao tác nhấp kéo dài 5 giây trên một tiện ích giao diện người dùng có nội dung mô tả "Avatar 8":
{
"eventType": "VIEW_LONG_CLICKED",
"elementDescriptors": [
{
"contentDescription": "Avatar 8"
}
],
"delayTime": 5000
}
Thực hiện cử chỉ một điểm
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
|---|---|
"eventType": "ONE_POINT_GESTURE"
|
-- |
coordinates
|
Hai toạ độ cho cử chỉ một điểm, được định dạng là "(x1,y1)->(x2,y2)" dưới dạng tỷ lệ phần trăm hoặc pixel. |
Thuộc tính sau đây là không bắt buộc:
dragAndDrop– nếu được đặt thànhtrue, cử chỉ một điểm sẽ thực hiện thao tác kéo và thả. Theo mặc định, giá trị này làfalse.
Sau đây là ví dụ về thao tác vuốt xuống bằng cử chỉ một điểm trong Robo script:
{
"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 hành động trong tập lệnh Robo thực hiện cử chỉ chụm hai ngón tay:
{
"eventType": "TWO_POINT_GESTURE",
"coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}
Thực hiện thao tác IME
Thao tác này sẽ nhấn nút hành động hiện tại, ví dụ: tiếp theo, xong và tìm kiếm, trên Trình chỉnh sửa phương thức nhập (IME) cho tiện ích giao diện người dùng mục tiêu được chỉ định.
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
|---|---|
"eventType": "PRESSED_EDITOR_ACTION"
|
-- |
elementDescriptors
|
Xác định tiện ích giao diện người dùng mục tiêu bằng cách sử dụng hệ phân cấp giao diện người dùng Android. |
Sau đây là ví dụ về một hành động trong Robo script thực hiện hành động IME trên một tiện ích giao diện người dùng có mã tài nguyên "com.google.samples.apps.topeka:id/first_name":
{
"eventType": "PRESSED_EDITOR_ACTION",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
Nhấn nút quay lại
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
eventType
|
Chỉ định loại hành động của tập lệnh Robo. |
"eventType": "PRESSED_BACK"
|
Gửi sự kiện KEYCODE_BACK đến thiết bị.
|
"eventType": "PRESSED_BACK_EMULATOR_28"
|
Được trình ghi tập lệnh Robo trong Android Studio 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 hành động trong tập lệnh Robo nhấn nút quay lại:
{
"eventType": "PRESSED_BACK"
}
Nhấn nút màn hình chính
Thao tác này sẽ gửi một sự kiện KEYCODE_HOME đến thiết bị.
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "GO_HOME"
|
-- |
Sau đây là ví dụ về một hành động trong tập lệnh Robo nhấn nút 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 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 được chỉ định cho đến khi tiện ích giao diện người dùng khớp với childElementDescriptors được chỉ định xuất hiện trên màn hình hoặc tiện ích được cuộn không thể cuộn được nữa hoặc đạt đến số lần cuộn tối đa là 50.
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "ELEMENT_SCROLL_INTO_VIEW"
|
-- |
elementDescriptors
|
Xác định tiện ích giao diện người dùng được cuộn bằng cách sử dụng hệ phân cấp giao diện người dùng Android. |
childElementDescriptors
|
Xác định tiện ích giao diện người dùng cần di chuyển đến bằng cách sử dụng hệ phân cấp giao diện người dùng Android. |
Sau đây là ví dụ về một hành động trong tập lệnh Robo cuộn tiện ích giao diện người dùng có mã tài nguyên "my.app.package:id/scrollable_card_container" cho đến khi tiện ích giao diện người dùng có văn bản "Orange" xuất hiện trên màn hình (hoặc không thể cuộn thêm nữa hoặc đạt đến số lần cuộn tối đa là 50):
{
"eventType": "ELEMENT_SCROLL_INTO_VIEW",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/scrollable_card_container"
}
],
"childElementDescriptors": [
{
"text": "Orange"
}
]
}
Trượt
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
|---|---|
"eventType": "VIEW_SWIPED"
|
-- |
swipeDirection
|
Chỉ định hướng vuốt:
|
elementDescriptors
|
Xác định tiện ích giao diện người dùng mục tiêu bằng cách sử dụng hệ phân cấp giao diện người dùng Android. |
Sau đây là ví dụ về một hành động trong Robo script vuốt lên một tiện ích giao diện người dùng có mã tài nguyên "my.app.package:id/custom_content":
{
"eventType": "VIEW_SWIPED",
"swipeDirection": "Up",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/custom_content"
}
]
}
Chụp ảnh màn hình
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "TAKE_SCREENSHOT"
|
-- |
screenshotName
|
Chỉ định tên tệp ảnh chụp màn hình. |
Sau đây là ví dụ về một hành động trong tập lệnh Robo chụp ảnh màn hình:
{
"eventType": "TAKE_SCREENSHOT",
"screenshotName": "my_screenshot"
}
Nhấn vào một điểm trên màn hình
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
|---|---|
"eventType": "POINT_TAP"
|
-- |
pointTapXCoordinate
|
Toạ độ X (tính bằng pixel) của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercent và pointTapYPercent.
|
pointTapYCoordinate
|
Toạ độ Y theo pixel của điểm được nhấn. Loại trừ lẫn nhau với pointTapXPercent và pointTapYPercent.
|
pointTapXPercent
|
Toạ độ X theo tỷ lệ phần trăm của điểm được nhấn. Loại trừ lẫn nhau với pointTapXCoordinate và pointTapYCoordinate.
|
pointTapYPercent
|
Toạ độ Y theo tỷ lệ phần trăm của điểm được nhấn. Loại trừ lẫn nhau với pointTapXCoordinate và pointTapYCoordinate.
|
Sau đây là ví dụ về một hành động trong 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
|
Toạ độ X theo tỷ lệ phần trăm trong phần tử mục tiêu. |
pointTapYPercent
|
Toạ độ Y theo tỷ lệ phần trăm 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 cách sử dụng hệ phân cấp giao diện người dùng Android. |
Sau đây là ví dụ về một hành động trong 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 dữ liệu
Thao tác 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 hành động trong tập lệnh Robo giúp dừng thử nghiệm Robo:
{
"eventType": "TERMINATE_CRAWL"
}
Đợi
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "WAIT" (or "DELAYED_MESSAGE_POSTED")
|
-- |
delayTime
|
Chỉ định thời gian chờ, tính bằng mili giây. |
Sau đây là ví dụ về một hành động trong tập lệnh Robo chờ trong 3 giây:
{
"eventType": "WAIT",
"delayTime": 3000
}
Chờ một phần tử
Thao tác này khiến thử nghiệm Robo đợi một phần tử xuất hiện trên màn hình cho đến khi hết thời gian chờ đã chỉ định.
Bảng sau đây liệt kê các thuộc tính bắt buộc:
| Thuộc tính | Mô tả |
"eventType": "WAIT_FOR_ELEMENT"
|
-- |
delayTime
|
Chỉ định thời gian chờ, tính bằng mili giây. |
elementDescriptors
|
Xác định tiện ích giao diện người dùng đang chờ bằng cách sử dụng hệ phân cấp giao diện người dùng Android. |
Sau đây là ví dụ về một hành động trong tập lệnh Robo, chờ tối đa 30 giây để một tiện ích giao diện người dùng có mã tài nguyên "my.app.package:id/confirmation_button" xuất hiện trên màn hình:
{
"eventType": "WAIT_FOR_ELEMENT",
"delayTime": 30000,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_button"
}
]
}