Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

คู่มืออ้างอิงสคริปต์ Robo

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

เอกสารนี้ให้ข้อมูลอ้างอิงเกี่ยวกับสคริปต์ 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 ทำงาน:
  • 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 ดำเนินการในขั้นตอนต่อไปนี้:

  1. การทดสอบ Robo ช่วยให้แน่ใจว่ารายการย่อยที่เกี่ยวข้องปรากฏบนหน้าจอผ่านการดำเนินการกำหนดตำแหน่งบน RecyclerView หรือ AdapterView ที่มี

  2. การทดสอบ 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 สำหรับข้อมูลเพิ่มเติม โปรดดูที่ ตัวอธิบายองค์ประกอบ
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)" เป็นเปอร์เซ็นต์หรือพิกเซล

แอตทริบิวต์ต่อไปนี้เป็นทางเลือก:

  • dragAndDrop - หากตั้งค่า true ท่าทางสัมผัสเดียวจะดำเนินการลากแล้วปล่อย โดยค่าเริ่มต้น จะเป็น false

ต่อไปนี้คือตัวอย่างการดำเนินการด้วยท่าทางเดียวของสคริปต์ 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 ระบุทิศทางของการปัด:
  • Left
  • Right
  • Up
  • Down
  • Forward - Down หรือ Right ขึ้นอยู่กับความสามารถในการเลื่อนแนวตั้งหรือแนวนอนของวิดเจ็ต UI เป้าหมาย
  • Backward - Up หรือ Left ขึ้นอยู่กับความสามารถในการเลื่อนแนวตั้งหรือแนวนอนของวิดเจ็ต UI เป้าหมาย
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"
    }
  ]
}

ขั้นตอนถัดไป