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

เอกสารนี้ให้ข้อมูลอ้างอิงเกี่ยวกับสคริปต์ Robo ซึ่งรวมถึงโครงสร้าง ความสามารถ การใช้งาน การบันทึก และการดำเนินการ สคริปต์ Robo คือการทดสอบที่ทำให้งานการประกันคุณภาพ (QA) ด้วยตนเองสำหรับแอปบนอุปกรณ์เคลื่อนที่เป็นแบบอัตโนมัติ และเปิดใช้กลยุทธ์การรวมอย่างต่อเนื่อง (CI) และการทดสอบก่อนการเปิดตัว สคริปต์ Robo คือไฟล์ JSON ที่อธิบายลำดับของอินเทอร์เฟซผู้ใช้ (UI) และการดำเนินการอื่นๆ

คุณสร้างสคริปต์ Robo ได้ด้วยวิธีต่อไปนี้

  • ใช้ฟีเจอร์การบันทึกสคริปต์ Robo (Android เท่านั้น)

  • สร้างสคริปต์ Robo ด้วยตนเอง (Android และ iOS+)

  • บันทึกสคริปต์ Robo แล้วแก้ไขด้วยตนเอง (Android เท่านั้น)

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้สคริปต์ Robo ได้ที่เรียกใช้สคริปต์ Robo

บทนำ

สคริปต์ Robo จะส่งไปยังการทดสอบ Robo พร้อมกับอินพุตอื่นๆ เช่น แพ็กเกจแอปพลิเคชัน Android (APK) ของแอปที่อยู่ระหว่างการทดสอบ

ต่อไปนี้คือตัวอย่างสคริปต์ Robo ที่ลงชื่อเข้าใช้แอปให้ผู้ใช้ ซึ่งจะทริกเกอร์เมื่อเปิดแอปที่อยู่ระหว่างการทดสอบ

[
  {
    "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"
          }
        ]
      }
    ]
  }
]

หากมีสคริปต์ Robo เพียงรายการเดียวในไฟล์และมีเงื่อนไขการทริกเกอร์ app_under_test_shown เริ่มต้นตามตัวอย่างด้านบน คุณสามารถระบุสคริปต์ 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"
      }
    ]
  }
]

การรองรับ iOS+ สำหรับสคริปต์ Robo

Robo สำหรับ iOS+ (เบต้า) มีการรองรับที่จำกัดสำหรับสคริปต์ Robo ไวยากรณ์สคริปต์ Robo สำหรับ iOS+ เหมือนกับไวยากรณ์ Android และฟีเจอร์ iOS+ ที่รองรับจะทำงานคล้ายกับฟีเจอร์ Android

ระบบรองรับการดำเนินการต่อไปนี้ใน iOS+

  • การยืนยัน
  • คลิก
  • คลิกค้าง
  • การปัดหน้าจอ
  • ข้ามองค์ประกอบทั้งหมด
  • รอ
  • จับภาพหน้าจอ
  • สิ้นสุดการ Crawl

iOS+ รองรับแอตทริบิวต์การระบุต่อไปนี้ในข้อบ่งชี้องค์ประกอบ

  • ชื่อชั้นเรียน
  • ชื่อคลาสระดับบนสุด
  • คำอธิบายเนื้อหา (และนิพจน์ทั่วไป)
  • ข้อความ (และนิพจน์ทั่วไป)

iOS+ รองรับเงื่อนไขการทริกเกอร์ในข้อบ่งชี้บริบทต่อไปนี้

  • แอปที่อยู่ระหว่างการทดสอบแสดงขึ้น
  • มีองค์ประกอบ
  • มีการดำเนินการสคริปต์ที่ไม่ใช่ Robo

โครงสร้าง

สคริปต์ Robo มีแอตทริบิวต์หลายรายการที่อธิบายวิธีที่ Robo เรียกใช้สคริปต์ แอตทริบิวต์เหล่านี้ส่วนใหญ่เป็นแอตทริบิวต์ที่ไม่บังคับซึ่งมีค่าเริ่มต้นที่กำหนดไว้ล่วงหน้า ดังนี้

แอตทริบิวต์ คำอธิบาย
id จำนวนเต็มที่ช่วยติดตามสคริปต์ Robo นี้ในเอาต์พุตการ Crawl Robo มีสคริปต์ Robo ในตัวพร้อม id ของตัวเอง แม้ว่า id เดียวกันในสคริปต์ Robo ที่ต่างกันจะไม่ส่งผลต่อลักษณะการทำงาน แต่การแยกแยะการดำเนินการจากสคริปต์ Robo เหล่านี้ในเอาต์พุตการ Crawl อาจเป็นเรื่องที่ท้าทาย เราขอแนะนำให้กำหนด id ที่ไม่ซ้ำกันเป็น 1000 ขึ้นไปสำหรับสคริปต์ Robo เพื่อหลีกเลี่ยงความขัดแย้ง
description คล้ายกับ id แต่มีคำอธิบายมากกว่า
crawlStage ขั้นตอนของการ Crawl ที่ Robo ใช้สคริปต์ Robo นี้ โดยค่าเริ่มต้น ขั้นตอนนี้จะเป็นขั้นตอนการ Crawl หลัก
priority ลำดับความสำคัญของสคริปต์ Robo นี้เมื่อเทียบกับสคริปต์ Robo อื่นๆ โดยค่าเริ่มต้น สคริปต์ Robo ทั้งหมดจะมีลำดับความสำคัญเป็น 1
maxNumberOfRuns ระบุจำนวนครั้งที่ Robo สามารถเรียกใช้สคริปต์ Robo นี้ในระหว่างการ Crawl โดยค่าเริ่มต้น Robo จะเรียกใช้สคริปต์ Robo ได้ 1 ครั้ง
contextDescriptor อธิบายบริบทหรือเงื่อนไขที่ทริกเกอร์สคริปต์ Robo นี้ หากละเว้น ระบบจะถือว่าเงื่อนไขการทริกเกอร์ของสคริปต์ Robo นี้เป็นไปตามเงื่อนไขเสมอ กล่าวคือ สคริปต์ Robo ไม่มีเงื่อนไข
actions การดำเนินการทั้งหมดของสคริปต์ Robo นี้

ไฟล์เดียวประกอบด้วยคอลเล็กชันสคริปต์ Robo อย่างน้อย 1 รายการ

ต่อไปนี้เป็นตัวอย่างของไฟล์ที่มีสคริปต์ Robo แบบไม่มีเงื่อนไข 2 รายการ โดยแต่ละรายการมีการดำเนินการเดียวที่ทำงาน 1 ครั้งเมื่อเริ่มทำการ Crawl

[
  {
    "id": 1000,
    "description": "My first Robo script",
    "actions": [
      {
        "eventType": "DISABLE_KEYBOARD"
      }
    ]
  },
  {
    "id": 1001,
    "description": "My second Robo script",
    "actions": [
      {
        "eventType": "PRESSED_BACK"
      }
    ]
  }
]

ข้อบ่งชี้บริบท

ข้อบ่งชี้บริบทจะกำหนดบริบทหรือเงื่อนไขที่ทริกเกอร์สคริปต์ Robo โดยใช้แอตทริบิวต์อย่างน้อย 1 รายการหรือหลายรายการรวมกัน ดังนี้

แอตทริบิวต์ คำอธิบาย
"condition": "always" เรียกใช้สคริปต์ Robo เสมอ
"condition": "element_present" ตรวจสอบว่าวิดเจ็ต UI ที่ตรงกับ elementDescriptors หรือข้อความที่ระบุโดย visionText ปรากฏบนหน้าจอ
"condition": "element_disabled" ตรวจสอบว่าวิดเจ็ต UI ที่ตรงกับ elementDescriptors ปรากฏบนหน้าจอและโต้ตอบไม่ได้
"condition": "element_checked" ตรวจสอบว่าวิดเจ็ต UI ที่ตรงกับ elementDescriptors ปรากฏบนหน้าจอและเลือกอยู่
"condition": "app_under_test_shown" ตรวจสอบว่าแอปที่อยู่ระหว่างการทดสอบทำงานอยู่เบื้องหน้า
"condition": "default_launcher_shown" ตรวจสอบว่าหน้าจอหลักของอุปกรณ์แสดงอยู่ ซึ่งหมายความว่าไม่มีแอปใดทำงานอยู่เบื้องหน้า
"condition": "non_roboscript_action_performed" ตรวจสอบว่าการดำเนินการ nonRoboscriptActionCount ครั้งล่าสุดติดต่อกันที่ดำเนินการโดยการทดสอบ Robo ไม่ใช่การดำเนินการของสคริปต์ Robo
negateCondition หากตั้งค่าเป็น true จะลบล้าง condition เช่น คุณสามารถใช้แอตทริบิวต์นี้เพื่อตรวจสอบว่าวิดเจ็ต UI ไม่ได้แสดงบนหน้าจอ หรือแอปที่อยู่ระหว่างการทดสอบไม่ได้ทำงานอยู่เบื้องหน้า
elementDescriptors ข้อบ่งชี้องค์ประกอบอย่างน้อย 1 รายการที่ระบุวิดเจ็ต UI บนหน้าจอ โดยจะใช้ร่วมกับเงื่อนไข element_present, element_disabled และ element_checked ไม่รวมกับ visionText ดูข้อมูลเพิ่มเติมได้ที่ตัวบ่งชี้องค์ประกอบ
visionText ระบบจะตรวจจับข้อความบนหน้าจอโดยใช้ API การรู้จำอักขระด้วยภาพ (OCR) visionText ใช้ร่วมกับเงื่อนไข element_present ไม่รวมกับ elementDescriptors
nonRoboscriptActionCount จำนวนการดำเนินการของสคริปต์ที่ไม่ใช่ Robo ที่ดำเนินการติดต่อกันก่อนหน้านี้ โดยจะใช้ร่วมกับเงื่อนไข non_roboscript_action_performed เพื่อเรียกใช้สคริปต์ Robo หลังจากการดำเนินการของ Robo ทุกๆ nonRoboscriptActionCount ครั้ง โดยค่าเริ่มต้นจะเป็น 1

ต่อไปนี้เป็นตัวอย่างสคริปต์ Robo ที่ทริกเกอร์โดยวิดเจ็ต UI ที่มีรหัสทรัพยากร "my.app.package:id/page_header" ปรากฏบนหน้าจอ

{
  "id": 1000,
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/page_header"
      }
    ]
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "elementDescriptors": [
        {
          "text": "Settings"
        }
      ]
    }
  ]
}

ต่อไปนี้เป็นตัวอย่างของสคริปต์ Robo ที่ทริกเกอร์โดย "Privacy Policy" ซึ่งตรวจพบโดยการรู้จำอักขระด้วยภาพ (OCR)

{
  "id": 1000,
  "description": "Vision text Robo script",
  "contextDescriptor": {
    "condition": "element_present",
    "visionText": "Privacy Policy"
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "visionText": "Privacy Policy"
    }
  ]
}

ต่อไปนี้เป็นตัวอย่างของสคริปต์ Robo ที่รอเป็นเวลา 5 วินาทีหลังจากการดำเนินการ Robo ที่ไม่ใช่สคริปต์ทุกครั้ง

{
  "contextDescriptor": {
    "condition": "non_roboscript_action_performed"
  },
  "maxNumberOfRuns" : 1000,
  "actions" : [
    {
      "eventType" : "WAIT",
      "delayTime" : 5000
    }]
}

การดำเนินการ

การดำเนินการแต่ละรายการในสคริปต์ Robo จะแสดงเป็นกลุ่มของคู่แอตทริบิวต์-ค่าอย่างน้อย 1 คู่ ซึ่งอธิบายไว้ในตารางต่อไปนี้

แอตทริบิวต์ คำอธิบาย
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 ที่มีการดำเนินการ 2 รายการโดยไม่มีวิดเจ็ต UI เป้าหมาย ซึ่งหมายความว่าการดำเนินการเหล่านี้ไม่ได้ทำงานในวิดเจ็ต UI ที่เฉพาะเจาะจง

[
  {
    "eventType": "WAIT",
    "delayTime": 3000
  },
  {
    "eventType": "PRESSED_BACK"
  }
]

ข้อบ่งชี้องค์ประกอบ

ข้อบ่งชี้องค์ประกอบจะระบุวิดเจ็ต UI โดยใช้แอตทริบิวต์ระบุอย่างน้อย 1 รายการต่อไปนี้

แอตทริบิวต์ คำอธิบาย
className –
ancestorClassName ชื่อคลาสของระดับบนสุดของลำดับชั้น UI ขององค์ประกอบ ระดับบนสุดคือโหนดหลักใดๆ ในลำดับชั้น UI ขององค์ประกอบ รวมถึงตัวองค์ประกอบเอง
resourceId –
resourceIdRegex นิพจน์ทั่วไปของ Java ที่ตรงกับ resourceId
contentDescription –
contentDescriptionRegex นิพจน์ทั่วไปของ Java ที่ตรงกับ contentDescription
text (ที่ปรากฏบนหน้าจอ) –
textRegex นิพจน์ทั่วไปของ Java ที่ตรงกับ text
groupViewChildPosition recyclerViewChildPosition หรือ adapterViewChildPosition แสดงตำแหน่งย่อยของวิดเจ็ต UI โดยขึ้นอยู่กับประเภทของวิดเจ็ตหลัก

บ่อยครั้งที่แอตทริบิวต์เหล่านี้ไม่ได้กำหนดไว้ เช่น ปุ่มอาจไม่มีข้อความและคำอธิบายเนื้อหา แม้ว่าจะมีค่าแอตทริบิวต์บางค่าอยู่ แต่ค่าเหล่านั้นอาจไม่ซ้ำกันในหน้าจอแอปหนึ่งๆ (รวมถึง resourceId)

ตัวอย่างเช่น การแยกความแตกต่างระหว่างรายการต่างๆ ในลิสต์มักจะทำได้โดยใช้ตำแหน่งย่อยที่แตกต่างกันภายในวิดเจ็ตหลักเท่านั้น ซึ่งหมายความว่าการใช้ข้อบ่งชี้องค์ประกอบเพียงรายการเดียวเพื่อระบุวิดเจ็ต UI มักจะไม่เพียงพอ ดังนั้น แอตทริบิวต์ elementDescriptors ของการดำเนินการจึงมีลำดับของตัวบ่งชี้องค์ประกอบที่เรียงลำดับเพื่อให้ตัวแรกสอดคล้องกับวิดเจ็ต UI เป้าหมาย ตัวที่ 2 สอดคล้องกับวิดเจ็ตหลักของวิดเจ็ต UI เป้าหมาย และอื่นๆ วิดเจ็ต UI เป้าหมายของการดำเนินการจะตรงกันเมื่อข้อบ่งชี้องค์ประกอบทั้งหมดตรงกับลำดับชั้นย่อยของวิดเจ็ต UI ที่เกี่ยวข้อง

ต่อไปนี้เป็นตัวอย่างสคริปต์ Robo ที่มีการเปลี่ยนแปลงข้อความและการดำเนินการคลิก ซึ่งทั้ง 2 อย่างนี้กำหนดให้คุณต้องระบุวิดเจ็ต 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 รองรับตัวเลือกการดำเนินการต่อไปนี้

  • executionMode - ตัวเลือกการดำเนินการที่ใช้เมื่อสคริปต์ Robo ทำงานอยู่
    • strict - หากตั้งค่าเป็น true สคริปต์ Robo จะไม่ใช้การจับคู่บางส่วน การข้ามการดำเนินการปัจจุบัน และการระงับ กล่าวคือ สคริปต์ Robo จะทำงานเป็นการทดสอบการวัดคุมตามปกติและจะล้มเหลวทันทีที่ไม่สามารถดำเนินการใดๆ ได้ โดยค่าเริ่มต้นจะเป็น false
    • dismiss_popups - หากตั้งค่าเป็น true การทดสอบ Robo จะปิดกล่องโต้ตอบที่ไม่คาดคิดขณะเรียกใช้สคริปต์ Robo แม้จะอยู่ในโหมด strict ก็ตาม ตัวเลือกนี้จะไม่มีผลเมื่อไม่ได้อยู่ในโหมด strict โดยค่าเริ่มต้นจะเป็น false
    • notify - หากตั้งค่าเป็น false สคริปต์ Robo จะไม่แสดงการแจ้งเตือนบนหน้าจอเมื่อเริ่มต้นและสิ้นสุดการดำเนินการ โดยค่าเริ่มต้นจะเป็น true
  • postscript - ตัวเลือกการดำเนินการที่ใช้หลังจากสคริปต์ Robo เสร็จสมบูรณ์
    • terminate - หากตั้งค่าเป็น true การทดสอบ Robo จะหยุดทำการ Crawl หลังจากสคริปต์ Robo ทำงานเสร็จสมบูรณ์ โดยค่าเริ่มต้นจะเป็น false

ต่อไปนี้คือตัวอย่างของสคริปต์ Robo ที่ดำเนินการในโหมด strict โดยไม่มีการแจ้งเตือนบนหน้าจอ ซึ่งจะรอเป็นเวลา 3 วินาที หลังจากนั้นการ Crawl จะหยุดลง

"roboscript": {
  "executionMode": {
    "strict": true,
    "notify": false
  },
  "postscript": {
    "terminate": true
  }
}
[
  {
    "eventType": "WAIT",
    "delayTime": 3000
  }
]

พารามิเตอร์เทมเพลต

พารามิเตอร์เทมเพลตคือตัวยึดตำแหน่งในสคริปต์ Robo ซึ่งจะถูกแทนที่ด้วยค่าจริงเมื่อการทดสอบ Robo โหลดสคริปต์ Robo นั้นเพื่อดำเนินการ พารามิเตอร์เทมเพลตจะมีคำนำหน้าเป็นเครื่องหมายขีดล่าง 2 ตัวตามด้วยเครื่องหมายเปอร์เซ็นต์ และมีคำต่อท้ายเป็นเครื่องหมายเปอร์เซ็นต์ตามด้วยเครื่องหมายขีดล่าง 2 ตัว

สคริปต์ Robo รองรับพารามิเตอร์เทมเพลตต่อไปนี้

  • __%APP_PACKAGE_NAME%__ - ชื่อแพ็กเกจของแอปที่อยู่ระหว่างการทดสอบ

ต่อไปนี้เป็นตัวอย่างสคริปต์ Robo ที่หยุดกระบวนการของแอปที่อยู่ระหว่างการทดสอบ

[
  {
    "eventType": "ADB_SHELL_COMMAND",
    "command": "am force-stop __%APP_PACKAGE_NAME%__"
  }
]

ความคิดเห็น

สคริปต์ Robo อาจมีบรรทัดความคิดเห็น ซึ่งเป็นบรรทัดที่ขึ้นต้นด้วย # หรือ //

ต่อไปนี้เป็นตัวอย่างสคริปต์ Robo ที่มีความคิดเห็น 2 รายการ

# 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 ต้อง "เติมเต็มช่องว่าง" ด้วยการดำเนินการมาตรฐาน

ลำดับความสำคัญ

หากสคริปต์ Robo ถึงmaxNumberOfRunsแล้ว ระบบจะไม่เรียกให้ทำงานอีกในการ Crawl หนึ่งๆ หากบริบทปัจจุบันสามารถเรียกใช้สคริปต์ Robo ได้มากกว่า 1 รายการ ระบบจะจัดลำดับความสำคัญโดยเลือกสคริปต์ Robo ตามลำดับต่อไปนี้

  1. มีแอตทริบิวต์ contextDescriptor
  2. มี priority สูงสุด (โดยค่าเริ่มต้น สคริปต์ Robo ทั้งหมดจะมี priority การดำเนินการเท่ากันที่ 1)
  3. ปรากฏก่อนในรายการสคริปต์ Robo หากลำดับความสำคัญของสคริปต์ Robo เหมือนกัน

ต่อไปนี้คือตัวอย่างไฟล์ที่มีสคริปต์ Robo 3 รายการซึ่งดำเนินการเดียวกันและทริกเกอร์โดยเงื่อนไขเดียวกัน นั่นคือแอปที่อยู่ระหว่างการทดสอบอยู่ในเบื้องหน้า

[
  {
    "id": 1000,
    "description": "Robo script 1",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1001,
    "description": "Robo script 2",
    "priority": "2",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1002,
    "description": "Robo script 3",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  }
]

เมื่อแอปที่อยู่ระหว่างการทดสอบทำงานอยู่เบื้องหน้า Robo จะทริกเกอร์สิ่งต่อไปนี้ตามลำดับ

  1. "Robo script 2" เนื่องจากมีลำดับความสำคัญสูงสุด
  2. "Robo script 1" เนื่องจากปรากฏก่อนในสคริปต์ Robo ที่เกี่ยวข้องที่เหลือซึ่งมีลำดับความสำคัญเท่ากัน
  3. "Robo script 3" เป็นสคริปต์ Robo ที่ใช้ได้ล่าสุด

การวิ่งซ้ำ

โดยค่าเริ่มต้น Robo จะเรียกใช้สคริปต์ Robo อย่างมาก 1 ครั้งระหว่างการ Crawl ซึ่งปรับได้ผ่านแอตทริบิวต์ maxNumberOfRuns

ต่อไปนี้เป็นตัวอย่างสคริปต์ Robo ที่นำแอปที่อยู่ระหว่างการทดสอบไปไว้ในเบื้องหลังสูงสุด 10 ครั้ง

{
  "id": 1000,
  "maxNumberOfRuns": 10,
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  },
  "actions": [
    {
      "eventType": "GO_HOME"
    }
  ]
}

ระยะการ Crawl

สคริปต์ Robo ใช้ได้ในขั้นตอนต่างๆ ของการ Crawl ด้วย Robo ดังนี้

ขั้นตอนการ Crawl คำอธิบาย
pre_crawl ก่อนที่ Robo จะเปิดตัวและเริ่มทำการ Crawl แอปที่อยู่ระหว่างการทดสอบ
post_crawl หลังจาก Robo ทำการ Crawl แอปที่อยู่ระหว่างการทดสอบเสร็จแล้ว สคริปต์ Robo post_crawl ต้องมีความยาวไม่เกิน 15 วินาที มิฉะนั้นการ Crawl อาจสิ้นสุดลงเนื่องจากหมดเวลา
crawl ขั้นตอนการ Crawl หลัก เมื่อ Robo ทำการ Crawl แอปที่อยู่ระหว่างการทดสอบ
close_screen เมื่อ Robo พยายามย้อนกลับ (ย้อนรอย) จากหน้าจอหนึ่งๆ เมื่อมีการสำรวจการดำเนินการที่เป็นไปได้ทั้งหมดในหน้าจอนี้แล้ว โดยค่าเริ่มต้น Robo จะกดกลับ ซึ่งเป็นสิ่งที่ไม่พึงประสงค์ในบางสถานการณ์

หากไม่ได้ระบุแอตทริบิวต์ crawlStage ของสคริปต์ Robo ระบบจะถือว่าเป็น crawl

ต่อไปนี้เป็นตัวอย่างสคริปต์ Robo ที่ล้างข้อมูลผู้ใช้ของแอปที่อยู่ระหว่างการทดสอบก่อนที่ Robo จะเริ่มทำการ Crawl

{
  "id": 1000,
  "crawlStage": "pre_crawl",
  "actions": [
    {
      "eventType": "ADB_SHELL_COMMAND",
      "command": "pm clear __%APP_PACKAGE_NAME%__"
    }
  ]
}

ต่อไปนี้คือตัวอย่างสคริปต์ Robo ที่สั่งให้ Robo คลิก "Cancel" เมื่อใดก็ตามที่พยายามย้อนกลับ (ย้อนรอย) จากกล่องโต้ตอบการยืนยัน

{
  "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"
        }
      ]
    }
  ]
}

การทำงานตามเงื่อนไข

สคริปต์ Robo มีการดำเนินการแบบมีเงื่อนไขได้ การทำงานตามเงื่อนไขมีแอตทริบิวต์เพิ่มเติม 3 รายการที่อธิบายวิธีที่ Robo ดำเนินการ ดังนี้

แอตทริบิวต์ คำอธิบาย
priority ลำดับความสำคัญของการทำงานตามเงื่อนไขนี้เมื่อเทียบกับการทำงานตามเงื่อนไขอื่นๆ ภายในสคริปต์ Robo ที่มีอยู่ โดยค่าเริ่มต้น การทำงานตามเงื่อนไขทั้งหมดจะมีลำดับความสำคัญเป็น 1
maxNumberOfRuns จำนวนครั้งที่สามารถดำเนินการตามเงื่อนไขนี้ได้ในระหว่างการเรียกใช้สคริปต์ Robo ที่มีเงื่อนไขนี้ 1 ครั้ง โดยค่าเริ่มต้น การดำเนินการตามเงื่อนไขทั้งหมดจะทำได้สูงสุด 1 ครั้งในการดำเนินการสคริปต์ Robo ที่มีอยู่ครั้งเดียว
contextDescriptor บริบท/เงื่อนไขที่ทริกเกอร์การดำเนินการตามเงื่อนไขนี้ ซึ่งมีโครงสร้างเดียวกันและมีความสามารถคล้ายกับ contextDescriptor ของสคริปต์ Robo

เมื่อทริกเกอร์ สคริปต์ Robo จะดำเนินการแบบไม่มีเงื่อนไขทีละรายการตามลำดับที่ปรากฏ หากสคริปต์ Robo มีการดำเนินการแบบมีเงื่อนไข ระบบจะพิจารณาการดำเนินการเหล่านั้นทุกครั้งก่อนที่จะเลือกการดำเนินการแบบไม่มีเงื่อนไขเพื่อดำเนินการ หากมีการทริกเกอร์การทำงานตามเงื่อนไขและเลือกตามลำดับความสำคัญและจำนวนการเรียกใช้ที่เหลืออยู่ สคริปต์ Robo จะดำเนินการตามเงื่อนไขนี้ ไม่เช่นนั้น สคริปต์ Robo จะดำเนินการแบบไม่มีเงื่อนไขต่อไปนี้ สคริปต์ Robo ต้องมีการดำเนินการแบบไม่มีเงื่อนไขอย่างน้อย 1 รายการจึงจะถูกต้อง

ต่อไปนี้เป็นตัวอย่างสคริปต์ Robo แบบไม่มีเงื่อนไขที่มีการดำเนินการแบบมีเงื่อนไขซึ่งจะปิดกล่องโต้ตอบป๊อปอัปหากปรากฏขึ้น ณ จุดใดก็ตามระหว่างการเรียกใช้สคริปต์ Robo

{
  "id": 1000,
  "actions": [
    {
      "description": "Dismiss popup",
      "maxNumberOfRuns": 100,
      "contextDescriptor": {
        "condition": "default_launcher_shown",
        "negateCondition": true
      },
      "eventType": "GO_HOME"
    },
    {
      "description": "Screen off",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 26"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "WAIT",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "WAIT",
      "delayTime": 10000
    }
}

การละเว้นการดำเนินการ

สคริปต์ Robo อาจมีวิธีการให้ Robo ละเว้นวิดเจ็ต UI ที่เฉพาะเจาะจงหรือวิดเจ็ต UI ทั้งหมดในหน้าจอหนึ่งๆ คำสั่งเหล่านี้จะแสดงเป็นการละเว้น "การดำเนินการ" ด้วย eventType ELEMENT_IGNORED และ ALL_ELEMENTS_IGNORED ตามลำดับ

เมื่อใดก็ตามที่แอตทริบิวต์ contextDescriptor ของสคริปต์ Robo ที่มีการดำเนินการละเว้นตรงกับหน้าจอที่ระบุ Robo จะไม่โต้ตอบกับวิดเจ็ต UI ใดๆ ที่กำหนดเป้าหมายโดยการดำเนินการละเว้น (เว้นแต่การดำเนินการสคริปต์ Robo อื่นๆ จะทำให้ Robo ดำเนินการกับวิดเจ็ต UI ที่ละเว้นรายการใดรายการหนึ่ง)

สคริปต์ Robo อาจมีการดำเนินการแบบละเว้น แบบมีเงื่อนไข และแบบไม่มีเงื่อนไขผสมกัน การดำเนินการละเว้นจะต่างจากการดำเนินการอื่นๆ ของสคริปต์ Robo ตรงที่จะมีผลตราบใดที่ contextDescriptor ของสคริปต์ Robo ที่มีอยู่ตรงกับหน้าจอระหว่างการ Crawl ของ Robo โดยไม่คำนึงถึงค่าของแอตทริบิวต์ priority และ maxNumberOfRuns

ต่อไปนี้เป็นตัวอย่างไฟล์ที่มีสคริปต์ Robo 2 รายการ สคริปต์ Robo แรกจะทำให้ Robo ละเว้นวิดเจ็ต UI ทั้งหมดในหน้าจอที่มีวิดเจ็ต UI ที่มีรหัสทรัพยากร "my.app.package:id/ignored_screen" สคริปต์ Robo รายการที่ 2 จะทำให้ Robo ละเว้นวิดเจ็ต UI ที่มีรหัสทรัพยากรตรงกับนิพจน์ทั่วไปของ Java ".*:id/done" ในหน้าจอที่มีวิดเจ็ต UI ที่มีรหัสทรัพยากร "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"
          }
        ]
      }
    ]
  }
]

การรองรับ 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 อธิบายบริบทหรือเงื่อนไขที่ยืนยัน ซึ่งมีโครงสร้างเหมือนกันและมีความสามารถคล้ายกับ contextDescriptor ของสคริปต์ Robo

ต่อไปนี้เป็นตัวอย่างการยืนยันสคริปต์ Robo ที่ตรวจสอบว่าแอปที่อยู่ระหว่างการทดสอบทำงานอยู่เบื้องหน้า

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  }
}

ต่อไปนี้เป็นตัวอย่างการยืนยันสคริปต์ Robo ที่ตรวจสอบว่าวิดเจ็ต UI ที่มีรหัสทรัพยากร "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,
    "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 ที่คลิกโดยใช้ลำดับชั้น UI ของ Android ไม่รวมกับ visionText
visionText ระบุองค์ประกอบที่คลิกโดยใช้ OCR ไม่รวมกับ elementDescriptors
matchIndex ระบุดัชนีของการเกิดขึ้นขององค์ประกอบเป้าหมายที่ตรงกัน เมื่อมีการระบุองค์ประกอบเป้าหมายโดยใช้ visionText หากเป็น 0 การดำเนินการของสคริปต์ Robo จะเลือกองค์ประกอบแรกที่ตรงกัน หากเป็น 1 การดำเนินการของสคริปต์ Robo จะเลือกองค์ประกอบที่ 2 ที่ตรงกัน และอื่นๆ โดยจะเรียงลำดับจากซ้ายไปขวาและจากบนลงล่าง ค่าเริ่มต้นคือ 0 (ระบบจะเลือกรายการที่ตรงกันรายการแรก)
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 ที่คลิกคำว่า "Search" ที่ตรวจพบเป็นครั้งที่ 2 บนหน้าจอโดยใช้ OCR

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Search",
  "matchIndex": 1
}

ต่อไปนี้คือตัวอย่างการดำเนินการของสคริปต์ Robo ที่คลิกองค์ประกอบแป้นพิมพ์เสมือนที่มีคำอธิบายเนื้อหา "Emoji button"

{
  "eventType": "SOFT_KEYBOARD_CLICK",
  "elementDescriptors": [
    {
      "contentDescription": "Emoji button"
    }
  ]
}

ต่อไปนี้คือตัวอย่างการดำเนินการของสคริปต์ Robo ที่คลิกองค์ประกอบแป้นพิมพ์เสมือนแบบสุ่มสูงสุด 5 ครั้ง

{
  "eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
  "maxNumberOfRuns": 5
}

ปิดใช้แป้นพิมพ์เสมือน

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "DISABLE_KEYBOARD" --

ต่อไปนี้เป็นตัวอย่างการดำเนินการของสคริปต์ Robo ที่ปิดใช้แป้นพิมพ์เสมือน

{
  "eventType": "DISABLE_KEYBOARD"
}

เรียกใช้คำสั่ง adb shell

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "ADB_SHELL_COMMAND" --
command คำสั่ง Shell ของ Android Debug Bridge (adb) ที่จะเรียกใช้

แอตทริบิวต์ต่อไปนี้ไม่บังคับ

  • expectedOutputRegex - เอาต์พุตที่คาดไว้ของคำสั่งเป็นนิพจน์ทั่วไปของ Java หากเอาต์พุตไม่ตรงกัน การดำเนินการของสคริปต์ Robo จะไม่สำเร็จ โดยค่าเริ่มต้นจะเป็นสตริงว่าง ซึ่งหมายความว่าระบบจะไม่ตรวจสอบเอาต์พุต

ต่อไปนี้คือตัวอย่างการดำเนินการของสคริปต์ Robo ที่ล้างข้อมูลผู้ใช้ของแอปที่อยู่ระหว่างการทดสอบ

{
  "eventType": "ADB_SHELL_COMMAND",
  "command": "pm clear __%APP_PACKAGE_NAME%__"
}

ให้สิทธิ์

เครื่องมือบันทึกสคริปต์ Robo ใน Android Studio จะบันทึกการดำเนินการนี้เพื่อความเข้ากันได้แบบย้อนหลังกับ Espresso Test Recorder การทดสอบ Robo จะให้สิทธิ์ทั้งหมดแก่แอปที่อยู่ระหว่างการทดสอบเมื่อเริ่มการ Crawl ทุกครั้ง ดังนั้นการดำเนินการนี้จึงไม่มีผลใดๆ อย่าใช้การดำเนินการนี้ในสคริปต์ Robo

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "PERMISSIONS_REQUEST" --

ไม่ต้องสนใจองค์ประกอบทั้งหมดบนหน้าจอ

การดำเนินการนี้จะทำให้ Robo ละเว้นองค์ประกอบทั้งหมดในหน้าจอที่ทริกเกอร์สคริปต์ Robo ที่มีอยู่

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "ALL_ELEMENTS_IGNORED" --

ต่อไปนี้คือตัวอย่างการดำเนินการของสคริปต์ Robo ที่ทำให้ Robo ละเว้นองค์ประกอบทั้งหมดในหน้าจอ

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

ละเว้นองค์ประกอบ

การดำเนินการนี้จะทำให้ Robo ละเว้นองค์ประกอบที่ตรงกับ elementDescriptors ที่ระบุ

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "ELEMENT_IGNORED" --
elementDescriptors ระบุวิดเจ็ต UI ที่ละเว้นโดยใช้ลำดับชั้น UI ของ Android

แอตทริบิวต์ต่อไปนี้ไม่บังคับ

  • ignoreChildren - หากตั้งค่าเป็น true Robo จะละเว้นองค์ประกอบย่อยทั้งหมดของวิดเจ็ต UI ที่ละเว้นด้วย โดยค่าเริ่มต้นจะเป็น false

ต่อไปนี้คือตัวอย่างการดำเนินการของสคริปต์ Robo ที่ทำให้ Robo ละเว้นองค์ประกอบทั้งหมดที่มีคำอธิบายเนื้อหาขึ้นต้นด้วย "Avatar"

{
  "eventType": "ELEMENT_IGNORED",
  "elementDescriptors": [
    {
      "contentDescriptionRegex": "Avatar.*"
    }
  ]
}

ข้อความอินพุต

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
eventType ระบุประเภทของการดำเนินการของสคริปต์ Robo
"eventType": "VIEW_TEXT_CHANGED" ป้อนข้อความที่ระบุลงในวิดเจ็ต UI เป้าหมาย
"eventType": "ENTER_TEXT" ป้อนข้อความที่ระบุลงในวิดเจ็ต UI เป้าหมาย แล้วส่งเหตุการณ์ KEYCODE_ENTER ไปยังวิดเจ็ต UI นี้
elementDescriptors ระบุวิดเจ็ต UI เป้าหมายโดยใช้ลำดับชั้น UI ของ Android
replacementText ข้อความที่จะป้อนลงในวิดเจ็ต UI เป้าหมาย

ต่อไปนี้เป็นตัวอย่างการดำเนินการของสคริปต์ Robo ที่ป้อน "John" ลงในวิดเจ็ต UI ที่มีรหัสทรัพยากร "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 เป้าหมายโดยใช้ลำดับชั้น UI ของ Android ไม่รวมกับ visionText
visionText ระบุองค์ประกอบที่คลิกค้างไว้โดยใช้ OCR ไม่รวมกับ elementDescriptors
matchIndex ระบุดัชนีของการเกิดขึ้นขององค์ประกอบเป้าหมายที่ตรงกัน เมื่อมีการระบุองค์ประกอบเป้าหมายโดยใช้ visionText หากเป็น 0 การดำเนินการของสคริปต์ Robo จะเลือกองค์ประกอบแรกที่ตรงกัน หากเป็น 1 การดำเนินการของสคริปต์ Robo จะเลือกองค์ประกอบที่ 2 ที่ตรงกัน และอื่นๆ โดยจะเรียงลำดับจากซ้ายไปขวาและจากบนลงล่าง ค่าเริ่มต้นคือ 0 (ระบบจะเลือกรายการที่ตรงกันรายการแรก)

แอตทริบิวต์ต่อไปนี้ไม่บังคับ

  • delayTime - ระบุระยะเวลาที่กดค้างไว้สำหรับการคลิกค้าง โดยมีหน่วยเป็นมิลลิวินาที

ต่อไปนี้คือตัวอย่างการดำเนินการของสคริปต์ Robo ที่คลิกวิดเจ็ต UI ที่มีคำอธิบายเนื้อหา "Avatar 8" เป็นเวลา 5 วินาที

{
  "eventType": "VIEW_LONG_CLICKED",
  "elementDescriptors": [
    {
      "contentDescription": "Avatar 8"
    }
  ],
  "delayTime": 5000
}

ทำท่าทางสัมผัสแบบจุดเดียว

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "ONE_POINT_GESTURE" --
coordinates พิกัด 2 จุดสำหรับท่าทางสัมผัสแบบจุดเดียว โดยอยู่ในรูปแบบ "(x1,y1)->(x2,y2)" เป็นเปอร์เซ็นต์หรือพิกเซล

แอตทริบิวต์ต่อไปนี้ไม่บังคับ

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

ต่อไปนี้เป็นตัวอย่างการดำเนินการด้วยท่าทางสัมผัสแบบจุดเดียวของสคริปต์ Robo ที่ทำการปัดลง

{
  "eventType": "ONE_POINT_GESTURE",
  "coordinates": "(50%,25%)->(50%,75%)"
}

ใช้ท่าทางสัมผัสแบบ 2 จุด

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "TWO_POINT_GESTURE" --
coordinates พิกัด 4 จุดสำหรับท่าทางสัมผัส 2 จุด โดยจัดรูปแบบเป็น "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" เป็นเปอร์เซ็นต์หรือพิกเซล

ต่อไปนี้เป็นตัวอย่างการดำเนินการของสคริปต์ Robo ที่ทำการบีบนิ้วออก

{
  "eventType": "TWO_POINT_GESTURE",
  "coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}

ดำเนินการ IME

การดำเนินการนี้จะกดปุ่มดำเนินการปัจจุบัน เช่น ถัดไป เสร็จสิ้น และค้นหา ในตัวแก้ไขวิธีการป้อนข้อมูล (IME) สำหรับวิดเจ็ต UI เป้าหมายที่ระบุ

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors ระบุวิดเจ็ต UI เป้าหมายโดยใช้ลำดับชั้น UI ของ Android

ต่อไปนี้คือตัวอย่างการดำเนินการของสคริปต์ Robo ที่ดำเนินการ IME ในวิดเจ็ต UI ที่มีรหัสทรัพยากร "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 เพื่อกดกลับในโปรแกรมจำลอง 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 ที่เลื่อนโดยใช้ลําดับชั้น UI ของ Android
childElementDescriptors ระบุวิดเจ็ต UI ที่จะเลื่อนไปโดยใช้ลำดับชั้น UI ของ Android

ต่อไปนี้คือตัวอย่างการดำเนินการของสคริปต์ Robo ที่เลื่อนวิดเจ็ต UI ที่มีรหัสทรัพยากร "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 เป้าหมายโดยใช้ลำดับชั้น UI ของ Android

ต่อไปนี้เป็นตัวอย่างการดำเนินการของสคริปต์ Robo ที่ปัดวิดเจ็ต UI ขึ้นด้วยรหัสทรัพยากร "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 เป้าหมายโดยใช้ลำดับชั้น UI ของ Android

ต่อไปนี้เป็นตัวอย่างการดำเนินการของสคริปต์ Robo ที่เลื่อนแถบเลื่อนของแถบค้นหาไปทางขวา

{
  "eventType": "POINT_TAP_ELEMENT",
  "pointTapXPercent": 80,
  "pointTapYPercent": 50,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/my_seekbar"
    }
  ]
}

สิ้นสุดการ Crawl

การดำเนินการนี้จะหยุดการทดสอบ Robo

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "TERMINATE_CRAWL" --

ต่อไปนี้เป็นตัวอย่างการดำเนินการของสคริปต์ Robo ที่หยุดการทดสอบ Robo

{
  "eventType": "TERMINATE_CRAWL"
}

รอ

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "WAIT" (or "DELAYED_MESSAGE_POSTED") --
delayTime ระบุระยะเวลาที่ต้องรอเป็นมิลลิวินาที

ต่อไปนี้เป็นตัวอย่างการดำเนินการของสคริปต์ Robo ที่รอเป็นเวลา 3 วินาที

{
  "eventType": "WAIT",
  "delayTime": 3000
}

รอองค์ประกอบ

การดำเนินการนี้จะทำให้การทดสอบ Robo รอให้องค์ประกอบปรากฏบนหน้าจอจนกว่าจะถึงระยะหมดเวลาที่ระบุ

ตารางต่อไปนี้แสดงแอตทริบิวต์ที่จำเป็น

แอตทริบิวต์ คำอธิบาย
"eventType": "WAIT_FOR_ELEMENT" --
delayTime ระบุระยะหมดเวลาในการรอเป็นมิลลิวินาที
elementDescriptors ระบุวิดเจ็ต UI ที่รอโดยใช้ลำดับชั้น UI ของ Android

ต่อไปนี้เป็นตัวอย่างการดำเนินการของสคริปต์ Robo ที่รอวิดเจ็ต UI ที่มีรหัสทรัพยากร "my.app.package:id/confirmation_button" ปรากฏบนหน้าจอเป็นเวลาสูงสุด 30 วินาที

{
  "eventType": "WAIT_FOR_ELEMENT",
  "delayTime": 30000,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/confirmation_button"
    }
  ]
}

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