Chromium Chronicle Nr. 21: End-to-End-UI-Automatisierung unter ChromeOS

Folge 21:von Brendan Hansknecht in Mountain View, CA, USA (Mai 2021)
Vorherige Folgen

In der Vergangenheit war es schwierig, die ChromeOS-UI in End-to-End-Tests (E2E) auf allen Geräten zu automatisieren. In Tast wurde eine neue UI-Bibliothek erstellt, die die ChromeOS-UI mithilfe der Chrome-A11y-Struktur (Barrierefreiheit) steuert. Mit dieser Bibliothek können Entwickler ganz einfach E2E-Tests für jede sichtbare Benutzeroberfläche (ChromeOS-Desktop-UI, native Apps, Webanwendungen, Chrome-Benutzeroberfläche) erstellen.

Die Bibliothek bietet eine einfache, verkettbare Methode, um zu beschreiben, wie ein UI-Element zu finden ist. Der Ordner Downloads in der App „Dateien“ könnte beispielsweise so definiert werden:

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

Nachdem Sie einen Knotensucher definiert haben, können Sie auf verschiedene Arten mit dem Knoten interagieren. Von einfachen Klicks bis hin zum Warten auf den Fokus – die UI-Bibliothek bietet stabilen Zugriff auf viele Vorgänge. Wenn Sie beispielsweise mit der rechten Maustaste auf den Ordner Downloads und mit der linken Maustaste auf die Schaltfläche „Kopieren“ klicken, könnten Sie Folgendes schreiben:

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

Es gibt Wrapper um gemeinsame UI-Bereiche (Einstellungen, Launcher, Datei-App usw.).

Für die oben verwendete uiauto.Run-Funktion wird eine Liste von Aktionen ausgeführt. In diesem Kontext ist eine Aktion nur ein func(context.Context) error. Mit einer so einfachen API können andere Arten von Aktionen in UI-Aktionen vermischt werden. So einfach ist die Verwendung der Tastatur:

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

Eine ausführliche Anleitung finden Sie im Hilfeartikel Tast Codelab: Chrome-UI-Automatisierung.

Beim Schreiben dieser Tests ist es sehr hilfreich, den Chrome-A11y-Baum zur Fehlerbehebung auszugeben. Fügen Sie dazu einfach den folgenden Code hinzu:

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

Die A11y-Baumstruktur wird jetzt zusammen mit anderen Tast-Logs als faillog/ui_tree.txt gespeichert

Bei Fragen wenden Sie sich bitte an die Gruppe „tast-users“.