Chronicle 21 של Chromium: אוטומציה של ממשק המשתמש מקצה לקצה ב-ChromeOS

פרק 21: מאת Brendan Hansknecht במאונטיין ויו, קליפורניה (מאי 2021)
הפרקים הקודמים

בעבר הייתה אוטומציה של ממשק המשתמש של ChromeOS בבדיקות מקצה לקצה (E2E) בכל רחבי היה קשה. ב-Tast, ספרייה חדשה של ממשק משתמש שנוצר באמצעות עץ a11y (נגישות) של Chrome כדי לשלוט בממשק המשתמש של ChromeOS. זה שמאפשרת למפתחים ליצור בקלות בדיקות E2E מול כל פלטפורמת ממשק המשתמש (ממשק המשתמש של ChromeOS למחשב, אפליקציות נייטיב, אפליקציות אינטרנט, ממשק המשתמש של דפדפן Chrome).

בספרייה יש שיטה פשוטה שאפשר לקשר אליה כדי לתאר איך למצוא רכיב בממשק המשתמש. לדוגמה, התיקייה Downloads באפליקציה 'קבצים' יכולה להיות מוגדרת כך:

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

אחרי שמגדירים מאתר צמתים, אפשר ליצור אינטראקציה עם בהרבה דרכים. מקליקים פשוטים ועד להמתנה למיקוד, ממשק המשתמש מעניקה גישה יציבה לפעולות רבות. לדוגמה, מימין לוחצים על התיקייה הורדות ואז לוחצים לחיצה שמאלית על לחצן ההעתקה, ואז אפשר לכתוב:

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 */ }

יש wrappers קיימים סביב אזורים נפוצים בממשק המשתמש (הגדרות, מרכז האפליקציות, אפליקציית הקבצים וכו').

הפונקציה uiauto.Run שבה נעשה שימוש למעלה מבצעת רשימה של פעולות. כאן הקשר, פעולה היא רק func(context.Context) error. עם API פשוט, אפשר לשלב סוגים אחרים של פעולות עם פעולות בממשק המשתמש. לדוגמה, השימוש במקלדת הוא קל כמו:

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

בזמן כתיבת הבדיקות האלה, מומלץ מאוד להשליך את עץ a11y של Chrome לניפוי באגים. כדי לעשות זאת, פשוט מוסיפים את הקוד הבא:

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

יש לכם שאלות? תוכלו לפנות לקבוצת המשתמשים המובילים.