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

Folge 21: von Brendan Hansknecht aus Mountain View, Kalifornien (Mai 2021)
Vorherige Folgen

Früher wurde die ChromeOS-Benutzeroberfläche in End-to-End-Tests (E2E) über die gesamte war schwierig. In Tast wurde eine neue UI-Bibliothek die die Chrome OS-Benutzeroberfläche über den Baum für Barrierefreiheit bei Chrome-Apps gesteuert hat. Dieses können Entwickler ganz einfach End-to-End-Tests für alle sichtbaren Benutzeroberfläche (ChromeOS-Desktop-UI, native Apps, Web-Apps, Chrome-Browser-UI)

Die Bibliothek bietet eine einfache, verkettete Möglichkeit, um zu beschreiben, wie ein UI-Element gefunden wird. 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 Knoten-Finder definiert haben, können Sie mit dem Knoten auf viele verschiedene Arten. Von einfachen Klicks bis hin zu Warten auf den Fokus – die Benutzeroberfläche bietet stabilen Zugriff auf viele Vorgänge. Zum Beispiel nach rechts auf den Ordner Downloads und dann mit der linken Maustaste auf die Schaltfläche "Kopieren". In diesem Fall 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 vorhandene Wrapper um allgemeine UI-Bereiche (Einstellungen, Launcher, App „Dateien“ usw.).

Die oben verwendete uiauto.Run-Funktion erstellt eine Liste von Aktionen. In dieser Kontext, ist eine Aktion nur ein func(context.Context) error. Bei einer solchen einfachen API können andere Arten von Aktionen mit UI-Aktionen kombiniert werden. Zum Beispiel ist die Verwendung der Tastatur so einfach wie:

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 findest du im Tast-Codelab: Chrome-UI-Automatisierung.

Beim Schreiben dieser Tests ist es sehr hilfreich, den Chrome A11y-Baum auszulesen. zur Fehlerbehebung. 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")

Der a11y-Baum wird jetzt zusammen mit anderen tast-Logs als faillog/ui_tree.txt gespeichert

Bei Fragen kannst du dich an die Gruppe „tast-users“ wenden.