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

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

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

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

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

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

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

บทนำ

สคริปต์ Robo มีไว้สำหรับการทดสอบ Robo พร้อมกับอินพุตอื่นๆ เช่น app-under-test Android Application Package (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"
      }
    ]
  }
]

รองรับสคริปต์ Robo บน iOS+

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

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

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

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

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

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

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

โครงสร้าง

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

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

ไฟล์หนึ่งจะมีคอลเล็กชันสคริปต์ Robo อย่างน้อย 1 รายการ

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

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

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

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

แอตทริบิวต์ คำอธิบาย
"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 ตรวจพบข้อความบนหน้าจอโดยใช้การรู้จำอักขระด้วยภาพ (OCR) API 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" ตรวจพบโดย Optical Character Recognition (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" : "DELAYED_MESSAGE_POSTED",
      "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": "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)

ตัวอย่างเช่น โดยทั่วไปแล้ว การแยกความแตกต่างระหว่างรายการต่างๆ ของรายการสามารถทำได้เฉพาะ โดยใช้ตำแหน่งย่อยต่างๆ ภายในวิดเจ็ตหลัก ซึ่งหมายความว่า การใช้ข้อบ่งชี้องค์ประกอบเพียง 1 อย่างเพื่อระบุวิดเจ็ต 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 โดยไม่มี การแจ้งเตือนบนหน้าจอที่เข้าสู่โหมดสลีปเป็นเวลาสามวินาที หลังจากการรวบรวมข้อมูล แวะพัก:

"roboscript": {
  "executionMode": {
    "strict": true,
    "notify": false
  },
  "postscript": {
    "terminate": true
  }
}
[
  {
    "eventType": "DELAYED_MESSAGE_POSTED",
    "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 แล้ว สคริปต์จะทริกเกอร์ไม่ได้อีกต่อไป ในการรวบรวมข้อมูลหนึ่งๆ หากสคริปต์ Robo สามารถทริกเกอร์สคริปต์ Robo ได้มากกว่า 1 รายการ บริบท ระบบจะกำหนดลำดับความสำคัญโดยเลือกตามลำดับต่อไปนี้ สคริปต์ Robo ซึ่ง:

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

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

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

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

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

การเรียกใช้ซ้ำ

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

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

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

ขั้นตอนการ Crawl

สคริปต์ Robo ใช้งานได้ในขั้นตอนต่างๆ ของการรวบรวมข้อมูล Robo ที่ระบุ:

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

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

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

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

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

{
  "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 จำนวนครั้งที่สามารถดำเนินการแบบมีเงื่อนไขนี้ได้ใน 1 ครั้ง ของสคริปต์ Robo ที่มีสคริปต์ โดยค่าเริ่มต้น ทุกเงื่อนไข สามารถดำเนินการได้มากที่สุดในครั้งเดียว ที่มีสคริปต์ Robo
contextDescriptor บริบท/เงื่อนไขที่ทริกเกอร์การดำเนินการตามเงื่อนไขนี้ โดยมี โครงสร้างเดียวกันและมีความสามารถที่คล้ายกัน ContextDescriptor ของสคริปต์ Robo

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

ต่อไปนี้เป็นตัวอย่างของสคริปต์ 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": "DELAYED_MESSAGE_POSTED",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "DELAYED_MESSAGE_POSTED",
      "delayTime": 10000
    }
}

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

สคริปต์ 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 ที่สองทำให้ 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" คลิกองค์ประกอบเป้าหมายของ App-under-test
"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
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",
  "visionText": "Privacy Policy"
}

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

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

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

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

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

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

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

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

{
  "eventType": "DISABLE_KEYBOARD"
}

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

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

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

คุณจะระบุแอตทริบิวต์ต่อไปนี้หรือไม่ก็ได้

  • delayTime - ระบุระยะเวลาการกดค้างของการคลิกนานเป็น มิลลิวินาที

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

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

สิ้นสุดการรวบรวมข้อมูล

การดำเนินการนี้จะหยุดการทดสอบ 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 ที่รอโดยใช้ลำดับชั้น UI ของ Android

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

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

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