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

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

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

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

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

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

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 מסביב לאזורים משותפים בממשק המשתמש (הגדרות, מרכז האפליקציות, אפליקציות קבצים וכו').

הפונקציה 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

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

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

יש לך שאלות? אפשר לפנות לקבוצת משתמשי הניסוי.