เอกสารนี้ให้ข้อมูลอ้างอิงเกี่ยวกับสคริปต์ Robo รวมถึงโครงสร้าง ความสามารถ การใช้งาน การบันทึก และการดำเนินการ สคริปต์ Robo คือการทดสอบที่ทำให้งานการประกันคุณภาพด้วยตนเอง (QA) เป็นแบบอัตโนมัติสำหรับแอปบนอุปกรณ์เคลื่อนที่ และเปิดใช้งานการผสานรวมอย่างต่อเนื่อง (CI) และกลยุทธ์การทดสอบก่อนการเปิดตัว สคริปต์ Robo คือไฟล์ JSON ที่อธิบายลำดับของอินเทอร์เฟซผู้ใช้ (UI) และการดำเนินการอื่นๆ
คุณสามารถสร้างสคริปต์ Robo ด้วยวิธีต่อไปนี้:
- ใช้คุณสมบัติการบันทึกสคริปต์ Robo
- สร้างสคริปต์ Robo ด้วยตนเอง
- บันทึกสคริปต์ Robo แล้วแก้ไขด้วยตนเอง
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการใช้สคริปต์ Robo โปรดดู เรียกใช้สคริปต์ Robo
สคริปต์ Robo มีให้สำหรับการทดสอบ Robo ควบคู่ไปกับอินพุตอื่นๆ เช่น Android Application Package (APK) ที่อยู่ภายใต้การทดสอบแอป
ต่อไปนี้คือตัวอย่างสคริปต์ Robo ที่ลงชื่อเข้าใช้แอป:
[
{
"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"
}
]
}
]
โครงสร้าง
การดำเนินการแต่ละรายการในสคริปต์ Robo จะแสดงเป็นชุดของคู่ค่าแอตทริบิวต์ตั้งแต่หนึ่งคู่ขึ้นไป ซึ่งอธิบายไว้ในตารางต่อไปนี้:
คุณลักษณะ | คำอธิบาย |
eventType | ระบุประเภทของการกระทำ เช่น คลิก แก้ไขข้อความ ฯลฯ จำเป็นสำหรับทุกการกระทำ |
elementDescriptors | ตัวอธิบายที่ระบุวิดเจ็ต UI จำเป็นสำหรับการดำเนินการทั้งหมดที่มีวิดเจ็ต UI เป้าหมาย เช่น การคลิกปุ่มเฉพาะ |
optional | หากตั้งค่า true การดำเนินการนี้จะถูกข้ามเมื่อไม่สามารถทำได้ ตัวอย่างเช่น การดำเนินการนี้จะถูกข้ามเมื่อไม่พบวิดเจ็ต UI เป้าหมายบนหน้าจอ โดยไม่ทำให้สคริปต์ Robo ที่มีอยู่ล้มเหลว โดยค่าเริ่มต้น ค่าจะเป็น false |
replacementText | ข้อความที่จะป้อนลงในวิดเจ็ต UI เป้าหมาย จำเป็นสำหรับการดำเนินการแก้ไขข้อความ |
swipeDirection | ระบุทิศทางของการปัด จำเป็นสำหรับการดำเนินการปัด |
delayTime | ระบุระยะเวลารอในหน่วยมิลลิวินาที จำเป็นสำหรับการดำเนินการรอ |
pointTapXCoordinate และ pointTapYCoordinate | พิกัดพิกเซล X และ Y ของจุดที่แตะ เอกสิทธิ์ร่วมกันกับ pointTapXPercent และ pointTapYPercent จำเป็นสำหรับการดำเนินการแตะจุด |
pointTapXPercent และ pointTapYPercent | เปอร์เซ็นต์พิกัด X และ Y ของจุดที่แตะ เอกสิทธิ์ร่วมกันกับ pointTapXCoordinate และ pointTapYCoordinate จำเป็นสำหรับการดำเนินการแตะจุด |
ต่อไปนี้คือตัวอย่างของสคริปต์ Robo ที่มีการดำเนินการสองอย่างโดยไม่มีวิดเจ็ต UI เป้าหมาย ซึ่งหมายความว่าการดำเนินการเหล่านี้จะไม่ทำงานบนวิดเจ็ต UI เฉพาะ:
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
},
{
"eventType": "PRESSED_BACK"
}
]
ตัวอธิบายองค์ประกอบ
ตัวอธิบายองค์ประกอบระบุวิดเจ็ต UI โดยใช้แอตทริบิวต์การระบุต่อไปนี้อย่างน้อยหนึ่งรายการ:
คุณลักษณะ | คำอธิบาย |
className | – |
ancestorClassName | ชื่อคลาสของบรรพบุรุษลำดับชั้น UI ขององค์ประกอบ บรรพบุรุษคือโหนดหลักใดๆ ในลำดับชั้น UI ขององค์ประกอบ ซึ่งรวมถึงองค์ประกอบด้วย |
resourceId | – |
resourceIdRegex | นิพจน์ปกติของ Java เพื่อจับคู่ resourceId |
contentDescription | – |
contentDescriptionRegex | นิพจน์ทั่วไปของ Java เพื่อให้ตรงกับ contentDescription |
text (ที่ปรากฏบนหน้าจอ) | – |
textRegex | นิพจน์ปกติของ Java เพื่อจับคู่ text |
groupViewChildPosition , recyclerViewChildPosition หรือ adapterViewChildPosition | แสดงตำแหน่งย่อยของวิดเจ็ต UI ขึ้นอยู่กับชนิดของวิดเจ็ตหลัก |
บ่อยครั้ง แอตทริบิวต์เหล่านี้ไม่ได้กำหนดไว้ ตัวอย่างเช่น ปุ่มอาจไม่มีคำอธิบายข้อความและเนื้อหา แม้ว่าจะมีค่าแอตทริบิวต์บางค่า แต่ก็อาจไม่ซ้ำกันในหน้าจอแอปที่กำหนด (รวมถึง resourceId
)
ตัวอย่างเช่น การแยกความแตกต่างระหว่างรายการต่างๆ ของรายการสามารถทำได้โดยใช้ตำแหน่งย่อยที่แตกต่างกันภายในวิดเจ็ตหลักเท่านั้น ซึ่งหมายความว่าการใช้ตัวอธิบายองค์ประกอบเพียงตัวเดียวในการระบุวิดเจ็ต UI มักจะไม่เพียงพอ ดังนั้น แอ็ตทริบิวต์ elementDescriptors
ของแอ็คชันจึงมีลำดับของตัวอธิบายองค์ประกอบที่เรียงลำดับให้อันแรกสอดคล้องกับวิดเจ็ต UI เป้าหมาย อันที่สองสอดคล้องกับวิดเจ็ตหลักของวิดเจ็ต UI เป้าหมาย เป็นต้น วิดเจ็ต UI เป้าหมายของการดำเนินการจะถูกจับคู่เมื่อตัวอธิบายองค์ประกอบทั้งหมดตรงกับลำดับชั้นย่อยของวิดเจ็ต UI ที่เกี่ยวข้อง
ต่อไปนี้เป็นตัวอย่างของสคริปต์ Robo ที่มีการเปลี่ยนแปลงข้อความและการดำเนินการคลิก ซึ่งทั้งสองอย่างนี้ต้องการให้คุณระบุวิดเจ็ต UI เป้าหมายโดยใช้ตัวอธิบายองค์ประกอบที่ให้มา:
[
{
"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"
}
]
}
]
ตัวเลือกการดำเนินการ
คุณสามารถเลือกนำหน้ารายการการดำเนินการในสคริปต์ Robo ด้วยออบเจ็กต์ JSON ที่ระบุตัวเลือกการดำเนินการสำหรับสคริปต์ Robo นั้น ส่วนหัวการกำหนดค่านี้เริ่มต้นด้วยคำ roboscript
ตามด้วยการแสดง JSON ของตัวเลือกการดำเนินการที่ต้องการ
สคริปต์ Robo รองรับตัวเลือกการดำเนินการต่อไปนี้:
- operationMode - ตัวเลือกการ
executionMode
การที่ใช้เมื่อสคริปต์ Robo ทำงาน:-
strict
หากตั้งค่าtrue
สคริปต์ Robo จะไม่ใช้ การจับคู่บางส่วน การข้ามการดำเนินการปัจจุบัน และการระงับ กล่าวคือ สคริปต์ Robo ถูกเรียกใช้งานในการทดสอบเครื่องมือวัดปกติ และล้มเหลวทันทีที่ไม่สามารถดำเนินการใดๆ ได้
-
-
postscript
- ตัวเลือกการดำเนินการที่ใช้หลังจากสคริปต์ Robo เสร็จสมบูรณ์:-
terminate
- หากตั้งค่าtrue
การทดสอบ Robo จะหยุดรวบรวมข้อมูลหลังจากสคริปต์ Robo เสร็จสิ้น
-
ต่อไปนี้คือตัวอย่างของสคริปต์ Robo ที่ทำงานในโหมด strict
ซึ่งอยู่ในโหมดสลีปเป็นเวลาสามวินาที หลังจากนั้นการรวบรวมข้อมูลจะหยุดลง:
"roboscript": {
"executionMode": {
"strict": true
},
"postscript": {
"terminate": true
}
}
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
พารามิเตอร์เทมเพลต
พารามิเตอร์เทมเพลต คือตัวยึดตำแหน่งในสคริปต์ Robo ที่ถูกแทนที่ด้วยค่าจริงเมื่อการทดสอบ Robo โหลดสคริปต์ Robo นั้นสำหรับการดำเนินการ พารามิเตอร์เทมเพลตนำหน้าด้วยเครื่องหมายขีดล่างคู่ตามด้วยเครื่องหมายเปอร์เซ็นต์ และนำหน้าด้วยเครื่องหมายเปอร์เซ็นต์ตามด้วยขีดล่างคู่
สคริปต์ Robo รองรับพารามิเตอร์เทมเพลตต่อไปนี้:
-
__%APP_PACKAGE_NAME%__
- ชื่อแพ็กเกจของแอปที่อยู่ระหว่างการทดสอบ
ต่อไปนี้เป็นตัวอย่างของสคริปต์ Robo ที่หยุดกระบวนการทดสอบแอป:
[
{
"eventType": "ADB_SHELL_COMMAND",
"command": "am force-stop __%APP_PACKAGE_NAME%__"
}
]
ความคิดเห็น
สคริปต์ Robo สามารถมีบรรทัดแสดงความคิดเห็น ซึ่งเป็นบรรทัดที่ขึ้นต้นด้วย #
หรือ //
ต่อไปนี้คือตัวอย่างสคริปต์ Robo ที่มีความคิดเห็นสองสามข้อ:
# Confirm a user account.
[
{
// Click the DONE button.
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
]
ความสามารถ
โดยค่าเริ่มต้น จนกว่าการดำเนินการทั้งหมดของสคริปต์ Robo จะเสร็จสิ้น (หรืออย่างน้อยก็พยายาม) สคริปต์ Robo จะยังคงทำงานอยู่ การทดสอบ Robo พยายามจับคู่การกระทำของสคริปต์ Robo ทุกครั้งที่เลือกการดำเนินการที่จะดำเนินการ สคริปต์ Robo ใช้เทคนิคต่อไปนี้เพื่อเพิ่มความทนทาน:
เทคนิค | คำอธิบาย |
การจับคู่บางส่วน | หากการกระทำสคริปต์ Robo ปัจจุบันไม่สามารถจับคู่ได้อย่างสมบูรณ์ เกณฑ์การจับคู่จะผ่อนคลายและลองจับคู่ใหม่ การจับคู่บางส่วนไม่พิจารณาองค์ประกอบที่อยู่นอกสุดในขณะที่จับคู่วิดเจ็ต UI เป้าหมายของการดำเนินการสคริปต์ Robo หากการจับคู่บางส่วนสำเร็จ การดำเนินการสคริปต์ Robo ที่สอดคล้องกันจะดำเนินการตามปกติ เทคนิคนี้สนับสนุนสถานการณ์ที่โครงสร้างแอปเปลี่ยนแปลง เช่น ระหว่างเวอร์ชันแอป เมื่อมีการจัดเรียงองค์ประกอบหน้าจอใหม่ |
ข้ามการดำเนินการปัจจุบัน | หากการทำงานของสคริปต์ Robo ปัจจุบันไม่สามารถจับคู่ทั้งหมดหรือบางส่วนได้ Robo จะพยายามจับคู่การทำงานของสคริปต์ Robo ที่ตามมา หากการดำเนินการที่ตามมาตรงกันทั้งหมดหรือบางส่วน การทดสอบ Robo จะข้าม (และจะไม่ย้อนกลับไปยัง) การดำเนินการของสคริปต์ Robo ปัจจุบันและดำเนินการต่อไป เทคนิคนี้รองรับสถานการณ์เมื่อพฤติกรรมของแอปเปลี่ยนไประหว่างเวอร์ชันต่างๆ หรือไม่สม่ำเสมอ เช่น เมื่อกล่องโต้ตอบไม่ต่อเนื่องอาจปรากฏขึ้นที่หน้าจอต่างๆ ระหว่างการบันทึกกับการเล่นสคริปต์ Robo ซ้ำ |
ระงับ | หากการกระทำของสคริปต์ Robo ปัจจุบันหรือที่ตามมาไม่สามารถจับคู่ทั้งหมดหรือบางส่วนได้ สคริปต์ Robo จะถูกระงับชั่วคราว และการทดสอบ Robo จะเลือกการดำเนินการที่จะดำเนินการโดยใช้กลยุทธ์อื่น หลังจากการดำเนินการนี้เสร็จสิ้น การทดสอบ Robo จะกลับมาดำเนินการสคริปต์ Robo ต่อ ตราบใดที่ไม่สามารถจับคู่การทำงานของสคริปต์ Robo ในปัจจุบันหรือที่ตามมาได้ สคริปต์ Robo จะยังคงถูกระงับสำหรับการกระทำจำนวนเท่าใดก็ได้ ดังนั้น สคริปต์ Robo ไม่จำเป็นต้องเป็นบทนำสำหรับการทดสอบ Robo และคุณสามารถแยกการทำงานของสคริปต์ Robo กับการดำเนินการทดสอบ Robo มาตรฐานได้ เทคนิคนี้รองรับสถานการณ์เมื่อพฤติกรรมของแอปไม่สม่ำเสมอ หรือเมื่อการเปลี่ยนแปลงระหว่างเวอร์ชันของแอปมีขนาดใหญ่พอที่การทดสอบ Robo จำเป็นต้อง "เติมช่องว่าง" ด้วยการดำเนินการมาตรฐาน |
รองรับ RecyclerView และ AdapterView
วิดเจ็ตย่อยของ RecyclerView และ AdapterView ถูกโหลดแบบไดนามิก และอาจแสดงผลได้หลายครั้งจากหน้าจอปัจจุบัน เนื่องจากขนาดของหน้าจอและจำนวนการปัดนิ้วเพื่อเข้าถึงเด็กคนนี้ แตกต่างกันไปตามปัจจัยของรูปแบบอุปกรณ์ที่แตกต่างกัน การพึ่งพาตำแหน่งข้อมูลของเด็กจึงแข็งแกร่งกว่ามาก ซึ่งถือว่าแน่นอน เป็นวิธีที่มีประสิทธิภาพน้อยกว่าในการพึ่งพาจำนวนการกวาดนิ้วที่จำเป็นในการนำเด็กคนนี้ไปที่หน้าจอแล้วใช้ตำแหน่งหน้าจอ
ดังนั้น สคริปต์ Robo จะจับตำแหน่งข้อมูลสัมบูรณ์ของเด็ก RecyclerView ที่เป็นเป้าหมายของการทำงานของสคริปต์ Robo เป็น recyclerViewChildPosition
สคริปต์ Robo ยังจับตำแหน่งข้อมูลสัมบูรณ์ของเด็ก AdapterView ที่เป็นเป้าหมายของการดำเนินการสคริปต์ Robo เป็น adapterViewChildPosition
การดำเนินการกับลูก RecyclerView และ AdapterView ดำเนินการในขั้นตอนต่อไปนี้:
การทดสอบ Robo ช่วยให้แน่ใจว่ารายการย่อยที่เกี่ยวข้องปรากฏบนหน้าจอผ่านการดำเนินการกำหนดตำแหน่งบน RecyclerView หรือ AdapterView ที่มี
การทดสอบ Robo ดำเนินการบันทึกโดยตรงบนองค์ประกอบย่อย เนื่องจากมีการแสดงบนหน้าจอแล้ว
ต่อไปนี้คือตัวอย่างของการดำเนินการคลิกบนลูก 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
}
]
}
ต่อไปนี้เป็นตัวอย่างของการดำเนินการคลิกบนลูก 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
}
]
}
บันทึกสคริปต์ Robo ใน Android Studio และเรียกใช้ใน Test Lab
คุณสามารถสร้างสคริปต์ Robo ใน Android Studio ซึ่งบันทึกสคริปต์เป็นไฟล์ JSON จากนั้น คุณสามารถอัปโหลดไฟล์ JSON ไปยัง Firebase Test Lab ด้วยแอปพลิเคชันและเรียกใช้การทดสอบตามนั้น
เมื่อคุณเรียกใช้การทดสอบ Robo โดยแนบสคริปต์ Robo จะทดสอบขั้นตอนแรกผ่านการดำเนินการที่กำหนดไว้ล่วงหน้าแล้วสำรวจแอปตามปกติ
ในการสร้างไฟล์ JSON สคริปต์ Robo ใน Android Studio ให้ทำตามขั้นตอนใน บันทึกสคริปต์ Robo โดยใช้ Test Lab ใน Android Studio
การทำงานของสคริปต์ Robo
แอตทริบิวต์เสริมทั่วไปต่อไปนี้ใช้กับการดำเนินการทั้งหมด:
-
description
- ช่วยติดตามการดำเนินการของการกระทำสคริปต์ Robo นี้ในผลลัพธ์การทดสอบ Robo
คำยืนยัน
หากเงื่อนไขที่ยืนยันเป็นจริง สคริปต์ Robo จะดำเนินการต่อในการดำเนินการถัดไป ซึ่งอาจเป็นการยืนยันอื่น มิฉะนั้น การดำเนินการสคริปต์ Robo จะหยุดลงเนื่องจากการยืนยันล้มเหลว และผลการทดสอบล้มเหลว
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "ASSERTION" | -- |
contextDescriptor | อธิบายบริบทหรือเงื่อนไขที่ยืนยัน |
ตัวอธิบายบริบท
ตัวอธิบายบริบทกำหนดบริบท/เงื่อนไขโดยใช้แอตทริบิวต์ต่อไปนี้อย่างใดอย่างหนึ่งหรือหลายอย่างรวมกัน:
คุณลักษณะ | คำอธิบาย |
---|---|
"condition": "element_present" | ตรวจสอบว่าวิดเจ็ต UI ที่ตรงกับ elementDescriptors หรือข้อความที่ระบุโดย visionText ปรากฏบนหน้าจอ |
"condition": "app_under_test_shown" | ตรวจสอบว่าแอปภายใต้การทดสอบกำลังทำงานในเบื้องหน้า |
"condition": "default_launcher_shown" | ตรวจสอบว่าหน้าจอหลักของอุปกรณ์ปรากฏขึ้น ซึ่งหมายความว่าไม่มีแอปทำงานอยู่เบื้องหน้า |
"condition": "non_roboscript_action_performed" | ตรวจสอบว่าการดำเนินการล่าสุดที่ทำโดยการทดสอบ Robo ไม่ใช่การทำงานของสคริปต์ Robo |
negateCondition | หากตั้งค่า true จะลบล้าง condition ตัวอย่างเช่น คุณสามารถใช้แอตทริบิวต์นี้เพื่อตรวจสอบว่าวิดเจ็ต UI ไม่มีอยู่บนหน้าจอ หรือแอปภายใต้การทดสอบไม่ทำงานในเบื้องหน้า |
elementDescriptors | ตัวอธิบายองค์ประกอบอย่างน้อยหนึ่งรายการที่ระบุวิดเจ็ต UI บนหน้าจอ ใช้ร่วมกับเงื่อนไข element_present เอกสิทธิ์ร่วมกันกับ visionText สำหรับข้อมูลเพิ่มเติม โปรดดูที่ Element descriptors |
visionText | ตรวจพบข้อความบนหน้าจอโดยใช้ Optical Character Recognition (OCR) API visionText ใช้ร่วมกับเงื่อนไข element_present เอกสิทธิ์ร่วมกันกับ elementDescriptors |
ต่อไปนี้คือตัวอย่างการยืนยันสคริปต์ Robo ที่ตรวจสอบว่าแอปอยู่ภายใต้การทดสอบอยู่เบื้องหน้าหรือไม่:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
ต่อไปนี้คือตัวอย่างการยืนยันสคริปต์ Robo ที่ตรวจสอบว่าวิดเจ็ต UI ที่มี ID ทรัพยากร "com.google.samples.apps.topeka:id/done"
ปรากฏบนหน้าจอ:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
ต่อไปนี้เป็นตัวอย่างของการยืนยันสคริปต์ Robo ที่ตรวจสอบว่า "Settings"
ไม่ถูกตรวจพบบนหน้าจอโดยใช้ OCR:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"negateCondition": true,
"elementDescriptors": [
{
"visionText": "Settings"
}
]
}
}
คลิก
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
---|---|
eventType | ระบุประเภทของการดำเนินการสคริปต์ Robo |
"eventType": "VIEW_CLICKED" | คลิกองค์ประกอบเป้าหมายของแอปที่อยู่ระหว่างการทดสอบ |
"eventType": "SOFT_KEYBOARD_CLICK" | คลิกองค์ประกอบเป้าหมายของแป้นพิมพ์นุ่ม |
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" | คลิกองค์ประกอบแบบสุ่มของคีย์บอร์ดแบบนุ่มสูงสุดครั้ง maxNumberOfRuns |
"eventType": "LIST_ITEM_CLICKED" | ใช้โดยตัวบันทึกสคริปต์ Robo ใน Android Studio สำหรับการคลิกรายการ |
elementDescriptors | ระบุวิดเจ็ต UI ที่คลิกโดยใช้ลำดับชั้น Android UI เอกสิทธิ์ร่วมกันกับ visionText |
visionText | ระบุองค์ประกอบที่ถูกคลิกโดยใช้ OCR เอกสิทธิ์ร่วมกันกับ elementDescriptors |
maxNumberOfRuns | ระบุจำนวนครั้งที่คลิกองค์ประกอบสุ่มของซอฟต์คีย์บอร์ด เมื่อ eventType เป็น SOFT_KEYBOARD_RANDOM_CLICK ค่าเริ่มต้นคือ 1 |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่คลิกปุ่มที่มีรหัสทรัพยากร "com.google.samples.apps.topeka:id/done"
:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่คลิก "Privacy Policy"
ที่ตรวจพบบนหน้าจอโดยใช้ OCR:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"visionText": "Privacy Policy"
}
]
}
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่คลิกองค์ประกอบซอฟต์คีย์บอร์ดที่มีคำอธิบายเนื้อหา "Emoji button"
:
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่คลิกองค์ประกอบคีย์บอร์ดแบบสุ่มแบบสุ่มสูงสุดห้าครั้ง:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
ปิดการใช้งานคีย์บอร์ดนุ่ม
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "DISABLE_KEYBOARD" | -- |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่ปิดใช้งานคีย์บอร์ดแบบซอฟต์:
{
"eventType": "DISABLE_KEYBOARD"
}
ดำเนินการคำสั่งเชลล์ adb
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "ADB_SHELL_COMMAND" | -- |
command | คำสั่งเชลล์ Android Debug Bridge (adb) เพื่อดำเนินการ |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่ล้างข้อมูลผู้ใช้ที่อยู่ภายใต้การทดสอบแอป:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
ให้สิทธิ์
การดำเนินการนี้บันทึกโดยเครื่องบันทึกสคริปต์ Robo ใน Android Studio เพื่อให้สามารถใช้งานร่วมกับ Espresso Test Recorder แบบย้อนหลังได้ การทดสอบ Robo ให้สิทธิ์ทั้งหมดแก่แอปภายใต้การทดสอบที่จุดเริ่มต้นของการรวบรวมข้อมูลทุกครั้ง ดังนั้น การดำเนินการนี้จึงไม่มีการดำเนินการ อย่าใช้การกระทำนี้ในสคริปต์ Robo ของคุณ
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "PERMISSIONS_REQUEST" | -- |
ป้อนข้อความ
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
---|---|
eventType | ระบุประเภทของการดำเนินการสคริปต์ Robo |
"eventType": "VIEW_TEXT_CHANGED" | ป้อนข้อความที่กำหนดลงในวิดเจ็ต UI เป้าหมาย |
"eventType": "ENTER_TEXT" | ป้อนข้อความที่กำหนดลงในวิดเจ็ต UI เป้าหมาย จากนั้นจึงส่งเหตุการณ์ KEYCODE_ENTER ไปยังวิดเจ็ต UI นี้ |
elementDescriptors | ระบุวิดเจ็ต UI เป้าหมายโดยใช้ลำดับชั้น Android UI |
replacementText | ข้อความที่จะป้อนลงในวิดเจ็ต UI เป้าหมาย |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่ป้อน "John"
ลงในวิดเจ็ต UI ที่มี ID ทรัพยากร "com.google.samples.apps.topeka:id/first_name"
:
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
คลิกยาว
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "VIEW_LONG_CLICKED" | -- |
elementDescriptors | ระบุวิดเจ็ต UI เป้าหมายโดยใช้ลำดับชั้น Android UI |
แอตทริบิวต์ต่อไปนี้เป็นทางเลือก:
-
delayTime
- ระบุระยะเวลาในการกดลงของการคลิกที่ยาวๆ ในหน่วยมิลลิวินาที
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่ดำเนินการคลิกนานห้าวินาทีบนวิดเจ็ต UI พร้อมคำอธิบายเนื้อหา "Avatar 8"
:
{
"eventType": "VIEW_LONG_CLICKED",
"elementDescriptors": [
{
"contentDescription": "Avatar 8"
}
],
"delayTime": 5000
}
ทำท่าทางหนึ่งจุด
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
---|---|
"eventType": "ONE_POINT_GESTURE" | -- |
coordinates | สองพิกัดสำหรับท่าทางสัมผัสจุดเดียว จัดรูปแบบเป็น "(x1,y1)->(x2,y2)" เป็นเปอร์เซ็นต์หรือพิกเซล |
ต่อไปนี้คือตัวอย่างการดำเนินการด้วยท่าทางสัมผัสเดียวของสคริปต์ Robo ที่ทำการปัดลง:
{
"eventType": "ONE_POINT_GESTURE",
"coordinates": "(50%,25%)->(50%,75%)"
}
ทำท่าทางสัมผัสสองจุด
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
---|---|
"eventType": "TWO_POINT_GESTURE" | -- |
coordinates | สี่พิกัดสำหรับท่าทางสัมผัสสองจุด จัดรูปแบบเป็น "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" เป็นเปอร์เซ็นต์หรือพิกเซล |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่ทำการบีบนิ้วออก:
{
"eventType": "TWO_POINT_GESTURE",
"coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}
ดำเนินการ IME
การดำเนินการนี้กดปุ่มการดำเนินการปัจจุบัน เช่น ถัดไป เสร็จสิ้น และค้นหาบน Input Method Editor (IME) สำหรับวิดเจ็ต UI เป้าหมายที่ระบุ
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
---|---|
"eventType": "PRESSED_EDITOR_ACTION" | -- |
elementDescriptors | ระบุวิดเจ็ต UI เป้าหมายโดยใช้ลำดับชั้น Android UI |
ต่อไปนี้เป็นตัวอย่างของการกระทำสคริปต์ Robo ที่ดำเนินการ IME บนวิดเจ็ต UI ที่มี ID ทรัพยากร "com.google.samples.apps.topeka:id/first_name"
:
{
"eventType": "PRESSED_EDITOR_ACTION",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
กดกลับ
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
eventType | ระบุประเภทของการดำเนินการสคริปต์ Robo |
"eventType": "PRESSED_BACK" | ส่งเหตุการณ์ KEYCODE_BACK ไปยังอุปกรณ์ |
"eventType": "PRESSED_BACK_EMULATOR_28" | ใช้โดยตัวบันทึกสคริปต์ Robo ใน Android Studio สำหรับการกดทับบน emulators API 28 |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่กดกลับ:
{
"eventType": "PRESSED_BACK"
}
กดโฮม
การดำเนินการนี้จะส่งเหตุการณ์ KEYCODE_HOME
ไปยังอุปกรณ์
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "GO_HOME" | -- |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่กดหน้าแรก:
{
"eventType": "GO_HOME"
}
เลื่อนองค์ประกอบเข้าสู่มุมมอง
การดำเนินการนี้ทำให้การทดสอบ Robo เลื่อนไปข้างหน้าวิดเจ็ต UI ที่ตรงกับ elementDescriptors
ที่ระบุ จนกว่าวิดเจ็ต UI ที่ตรงกับ childElementDescriptors
ที่ระบุจะปรากฏบนหน้าจอ มิฉะนั้นจะไม่สามารถเลื่อนวิดเจ็ตที่เลื่อนได้อีกต่อไป หรือถึงจำนวนการเลื่อนสูงสุด 50 ครั้ง
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "ELEMENT_SCROLL_INTO_VIEW" | -- |
elementDescriptors | ระบุวิดเจ็ต UI ที่เลื่อนโดยใช้ลำดับชั้น Android UI |
childElementDescriptors | ระบุวิดเจ็ต UI เพื่อเลื่อนไปยังโดยใช้ลำดับชั้นของ Android UI |
ต่อไปนี้เป็นตัวอย่างของการกระทำสคริปต์ Robo ที่เลื่อนวิดเจ็ต UI ด้วย ID ทรัพยากร "my.app.package:id/scrollable_card_container"
จนกระทั่งวิดเจ็ต UI ที่มีข้อความ "Orange"
ปรากฏบนหน้าจอ (หรือไม่สามารถเลื่อนได้อีก ดำเนินการหรือถึงจำนวนสูงสุด 50 ม้วน):
{
"eventType": "ELEMENT_SCROLL_INTO_VIEW",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/scrollable_card_container"
}
],
"childElementDescriptors": [
{
"text": "Orange"
}
]
}
รูด
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
---|---|
"eventType": "VIEW_SWIPED" | -- |
swipeDirection | ระบุทิศทางของการปัด:
|
elementDescriptors | ระบุวิดเจ็ต UI เป้าหมายโดยใช้ลำดับชั้น Android UI |
ต่อไปนี้คือตัวอย่างของการดำเนินการสคริปต์ Robo ที่ปัดวิดเจ็ต UI ด้วย ID ทรัพยากร "my.app.package:id/custom_content"
:
{
"eventType": "VIEW_SWIPED",
"swipeDirection": "Up",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/custom_content"
}
]
}
จับภาพหน้าจอ
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "TAKE_SCREENSHOT" | -- |
screenshotName | ระบุชื่อไฟล์ภาพหน้าจอ |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่จับภาพหน้าจอ:
{
"eventType": "TAKE_SCREENSHOT",
"screenshotName": "my_screenshot"
}
แตะจุดบนหน้าจอ
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
---|---|
"eventType": "POINT_TAP" | -- |
pointTapXCoordinate | พิกัดพิกเซล X ของจุดที่เคาะ เอกสิทธิ์ร่วมกันกับ pointTapXPercent และ pointTapYPercent |
pointTapYCoordinate | พิกัดพิกเซล Y ของจุดที่เคาะ เอกสิทธิ์ร่วมกันกับ pointTapXPercent และ pointTapYPercent |
pointTapXPercent | เปอร์เซ็นต์พิกัด X ของจุดที่เคาะ เฉพาะร่วมกันกับ pointTapXCoordinate และ pointTapYCoordinate |
pointTapYPercent | เปอร์เซ็นต์พิกัด Y ของจุดที่เคาะ เฉพาะร่วมกันกับ pointTapXCoordinate และ pointTapYCoordinate |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่แตะตรงกลางหน้าจอ:
{
"eventType": "POINT_TAP",
"pointTapXPercent": 50,
"pointTapYPercent": 50
}
แตะจุดภายในองค์ประกอบ
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "POINT_TAP_ELEMENT" | -- |
pointTapXPercent | เปอร์เซ็นต์พิกัด X ภายในองค์ประกอบเป้าหมาย |
pointTapYPercent | เปอร์เซ็นต์พิกัด Y ภายในองค์ประกอบเป้าหมาย |
elementDescriptors | ระบุวิดเจ็ต UI เป้าหมายโดยใช้ลำดับชั้น Android UI |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่เลื่อนแถบเลื่อนของแถบค้นหาไปทางขวา:
{
"eventType": "POINT_TAP_ELEMENT",
"pointTapXPercent": 80,
"pointTapYPercent": 50,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/my_seekbar"
}
]
}
ยุติการรวบรวมข้อมูล
การดำเนินการนี้จะหยุดการทดสอบ Robo
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
---|---|
"eventType": "TERMINATE_CRAWL" | -- |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่หยุดการทดสอบ Robo:
{
"eventType": "TERMINATE_CRAWL"
}
รอ
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "DELAYED_MESSAGE_POSTED" | -- |
delayTime | ระบุระยะเวลารอในหน่วยมิลลิวินาที |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่รอสามวินาที:
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
รอองค์ประกอบ
การดำเนินการนี้ทำให้การทดสอบ Robo รอให้องค์ประกอบปรากฏบนหน้าจอจนถึงระยะหมดเวลาที่กำหนด
ตารางต่อไปนี้แสดงรายการแอตทริบิวต์ที่จำเป็น:
คุณลักษณะ | คำอธิบาย |
"eventType": "WAIT_FOR_ELEMENT" | -- |
delayTime | ระบุระยะหมดเวลารอ หน่วยเป็นมิลลิวินาที |
elementDescriptors | ระบุวิดเจ็ต UI ที่รอโดยใช้ลำดับชั้น Android UI |
ต่อไปนี้คือตัวอย่างการทำงานของสคริปต์ Robo ที่รอนานถึง 30 วินาทีเพื่อให้วิดเจ็ต UI ที่มี ID ทรัพยากร "my.app.package:id/confirmation_button"
ปรากฏบนหน้าจอ:
{
"eventType": "WAIT_FOR_ELEMENT",
"delayTime": 30000,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_button"
}
]
}