The Chromium Chronicle #21: การทำงานอัตโนมัติของ UI จากต้นทางถึงปลายทางใน ChromeOS

ตอนที่ 21: โดย Brendan Hansknecht ในเมาน์เทนวิว รัฐแคลิฟอร์เนีย (พฤษภาคม 2021)
ตอนก่อนหน้า

ที่ผ่านมา การทำให้ UI ของ ChromeOS เป็นอัตโนมัติในการทดสอบจากต้นทางถึงปลายทาง (E2E) ทั้งหมด กลุ่มอุปกรณ์ส่วนใหญ่จึงเป็นเรื่องยาก ใน Tast เราได้สร้างไลบรารี UI ใหม่ ที่สร้างขึ้นซึ่งใช้โครงสร้าง A11y (การช่วยเหลือพิเศษ) ของ Chrome เพื่อควบคุม UI ของ ChromeOS ไลบรารีช่วยให้นักพัฒนาซอฟต์แวร์สร้างการทดสอบ E2E เทียบกับ แพลตฟอร์ม UI (UI บนเดสก์ท็อปของ ChromeOS, แอปที่มาพร้อมเครื่อง, เว็บแอป, UI ของเบราว์เซอร์ Chrome)

ไลบรารีมีวิธีที่เรียบง่ายและเชื่อมโยงได้เพื่ออธิบายวิธีค้นหาองค์ประกอบ UI ตัวอย่างเช่น โฟลเดอร์ดาวน์โหลดในแอป Files อาจมีลักษณะดังนี้

filesWindow := nodewith.NameStartingWith("Files")
  .ClassName("RootView").Role(role.Window)
downloadsButton := nodewith.Name("Downloads")
  .Role(role.TreeItem).Ancestor(filesWindow)

เมื่อคุณกำหนดตัวค้นหาโหนดแล้ว คุณสามารถโต้ตอบกับ โหนดได้หลายแบบ ตั้งแต่การคลิกง่ายๆ ไปจนถึงการรอโฟกัสนั้น UI สามารถให้สิทธิ์เข้าถึงการดำเนินการหลายอย่างได้อย่างราบรื่น เช่น ทางขวา คลิกโฟลเดอร์ดาวน์โหลด และคลิกที่ปุ่มคัดลอก คุณสามารถเขียนข้อความต่อไปนี้

ui := uiauto.New(tconn)
if err := uiauto.Combine("copy downloads",
  ui.RightClick(downloadsButton),
  ui.LeftClick(nodewith.Name("Copy").Role(role.MenuItem)),
)(ctx); err != nil { /* do error handling */ }

มี Wrapper ของส่วน UI ทั่วไป (การตั้งค่า, Launcher, แอปไฟล์ เป็นต้น)

ฟังก์ชัน uiauto.Run ที่ใช้ด้านบนจะสร้างรายการการดำเนินการ ด้วยวิธีนี้ บริบท การดำเนินการจะเป็นเพียง func(context.Context) error ด้วย API แบบง่าย การดำเนินการประเภทอื่นๆ รวมกับการดำเนินการ UI ได้ ตัวอย่างเช่น การใช้แป้นพิมพ์นั้นง่ายมาก

if err := uiauto.Combine("do some random stuff",
  ui.FocusAndWait( /* some text field */ ),
  kb.TypeAction("Hello, world!"),
  kb.AccelAction("Enter"),
  func(ctx context.Context) error {
    // My custom action!
  },
)(ctx); err != nil { /* do error handling */ }

ดูคำแนะนำแบบเจาะลึกเพิ่มเติมได้ที่ Tast Codelab: Chrome UI Automation

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

defer faillog.DumpUITreeOnError(ctx, s.OutDir(), s.HasError, tconn)
s.Fatal("I would like to see the ui tree here")

ตอนนี้ระบบจะจัดเก็บต้นไม้ A11y พร้อมกับบันทึกการทดสอบอื่นๆ เป็น faillog/ui_tree.txt

หากมีข้อสงสัยประการใด โปรดติดต่อกลุ่มผู้ทดสอบ