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