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 cho 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:
[
{
"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. Chiến lược phát hành đĩa đơn Cú pháp tập lệnh Robo cho iOS+ giống với cú pháp của Android và được hỗ trợ cho iOS+ hoạt động tương tự như các tính năng tương tự 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 xác định sau đây trong mã mô tả phần tử được hỗ trợ trong iOS trở lên:
- Tên lớp
- Tên lớp đối tượng cấp trên
- Mô tả nội dung (và biểu thức chính quy)
- Văn bản (và biểu thức chính quy)
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 thông tin.
Robo đã tích hợp sẵn các tập lệnh Robo với id của riêng chúng. Mặc dù
cùng một id trong các tập lệnh Robo khác nhau sẽ không ảnh hưởng đến
hành vi, phân biệt các hành động với các tập lệnh Robo này trong kết quả thu thập thông tin
có thể là 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 của bạn để tránh mọi 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 rằng màn hình chính của một thiết bị hiển thị, tức là không có ứng dụng nào đang chạy trên 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 . Cho
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.
Hàm này được dùng kết hợp với element_present ,
element_disabled và element_checked
conditions. 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
|
Phát hiện văn bản trên màn hình bằng công nghệ 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 của tập lệnh không phải Robo được 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,
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ằng
"Privacy Policy"
được 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ề tập lệnh Robo đợi 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 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 thao tác 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 , thì thao tác này sẽ bị bỏ qua khi không thể thực hiện
thực hiện. Ví dụ: hành động này bị bỏ qua khi không tìm thấy
nhắm mục tiêu tiện ích giao diện người dùng trên màn hình– mà không làm hỏng Robo chứa
tập lệnh. 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ử
Chỉ số mô tả phần 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 các 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ụ: chỉ có thể phân biệt giữa các mục trong một 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,false
.notify
– nếu bạn đặt thànhfalse
, tập lệnh Robo sẽ không hiển thị trên màn hình thông báo vào lúc bắt đầu và kết thúc quá trình thực thi. Theo mặc định, 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 chương trình kiểm thử ứng dụng.
Sau đây là ví dụ về một tập lệnh Robo dừng quá trình kiểm thử ứng dụng quá trình:
[
{
"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 các hành động tập lệnh Robo hiện tại lẫn các hành động tiếp theo đều không thể hoàn toàn hoặc
khớp một phần, 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ác chiến lược khác của hành động đó. 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.
Nếu 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 vẫn bị tạm ngưng cho bất kỳ 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ì 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.
Chạy 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 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 quá trình thu thập thông tin của ứng dụng dưới dạng kiểm thử. |
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ì điều đó được ngụ ý
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ó 3 các thuộc tính bổ sung mô tả cách Robo thực hiện:
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 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. Chiến dịch này 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 |
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 các hướng dẫn để Robo bỏ qua 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ể. Những hướng dẫn này
được thể hiện là bỏ qua "hành động" với 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 tiện ích con của RecyclerView và AdapterView được tải động và có thể hiển thị nhiều thao tác 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 kém hiệu quả hơn để dựa vào số lần vuốt cần thiết để đưa trẻ đến màn hình và sau đó sử dụng vị trí 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 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 thu thập dữ liệu tuyệt đối
các vị trí của phần tử con AdapterView là mục tiêu của các hành động của tập lệnh Robo
adapterViewChildPosition
.
Các thao tác trên RecyclerView và phần tử con AdapterView được thực hiện như sau các bước:
Thử nghiệm Robo đảm bảo rằng 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 đó.
Thử nghiệm Robo thực hiện hành động đã ghi lại ngay trên phần tử con, vì ảnh đã được 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 RecyclerView
(android.support.v7.widget.RecyclerView
) phần tử con:
{
"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 rồi chạy tập lệnh đó trong Phòng thử nghiệm
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 Phòng thử nghiệm Firebase với ứng dụng và chạy kiểm thử sao cho phù hợp.
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 kịch bản 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 Phòng thử nghiệm 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ả các thao tác:
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 hành động, 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 của tập lệnh Robo kiểm tra để đảm bảo rằng một giao diện người dùng
tiện ích có mã tài nguyên "com.google.samples.apps.topeka:id/done"
là
hiển thị trên màn hình:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
Sau đây là ví dụ về câu xác nhận tập lệnh Robo kiểm tra
"Settings"
KHÔNG được phát hiện trên màn hình bằng công nghệ Nhận dạng ký tự quang học (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 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 chương trình kiểm thử ứng dụng. |
"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 danh sách mục. |
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). Độc quyền 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ề hành động của tập lệnh Robo nhấp vào
Đã phát hiện "Privacy Policy"
trên màn hình dùng công nghệ nhận dạng ký tự quang học (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, thì thao tác với 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. Thử nghiệm Robo cấp tất cả các quyền cho thử nghiệm dưới mức ứng dụng ở đầu mỗi lần thu thập dữ liệu và do đó, hành động này không hoạt động. 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 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ử
Hành động này khiến Robo bỏ qua một (các) phần tử khớp với giá trị được chỉ định
elementDescriptors
.
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 được đặ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ề thao tác của tập lệnh Robo khiến Robo bỏ qua tất cả
các phần tử có phần mô tả nội dung bắt đầu bằng "Avatar"
:
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"contentDescriptionRegex": "Avatar.*"
}
]
}
Nhập văn bản
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 rồi gửi một
Sự kiện KEYCODE_ENTER đối vớ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ệ 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 đích. |
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
|
4 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 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 hành động của 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ị
Hành động này khiến 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
được chỉ định cho đến khi tiện ích giao diện người dùng khớp với
childElementDescriptors
hiện diện trên màn hình, hoặc tiện ích mà người dùng cuộn có thể
không còn cuộn được nữa hoặc đã đạt đến số lượt cuộn tối đa là 50 lượ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": "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 của 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 giao diện người dùng
tiện ích có văn bản "Orange"
hiện diện trên màn hình (hoặc không thể cuộn thêm nữa
hoặc đã đạt đến số lượt cuộn tối đa là 50 lượt cuộn):
{
"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ề thao tác của tập lệnh Robo vuốt lên trê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ạ độ pixel X của điểm được nhấn. Độc quyền 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ạ độ phần trăm X của điểm đã nhấn. Độc quyền lẫn nhau với
pointTapXCoordinate và pointTapYCoordinate .
|
pointTapYPercent
|
Toạ độ phần trăm Y của điểm được 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 thu thập thông tin
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ề thao tác của tập lệnh Robo làm 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": "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"
}
]
}