Chromium Chronicle n°21: automatisation de l'interface utilisateur de bout en bout avec ChromeOS

Épisode 21:de Brendan Hansknecht à Mountain View, en Californie (mai 2021)
Épisodes précédents

Historiquement, il était difficile d'automatiser l'interface utilisateur de ChromeOS dans les tests de bout en bout sur l'ensemble du parc d'appareils. Dans Tast, une bibliothèque d'UI a été créée. Elle utilise l'arborescence d'accessibilité (accessibilité) de Chrome pour contrôler l'interface utilisateur de ChromeOS. Cette bibliothèque permet aux développeurs de créer facilement des tests de bout en bout sur n'importe quelle surface d'interface utilisateur visible (interface utilisateur de bureau ChromeOS, applications natives, applications Web, interface utilisateur du navigateur Chrome).

La bibliothèque dispose d'un moyen simple et enchaîné de décrire comment trouver un élément d'interface utilisateur. Par exemple, le dossier Téléchargements de l'application Fichiers peut être défini comme suit:

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

Une fois que vous avez défini un outil de recherche de nœuds, il est possible d'interagir avec le nœud de différentes manières. Des clics simples à l'attente de sélection, la bibliothèque de l'UI offre un accès stable à de nombreuses opérations. Par exemple, pour effectuer un clic droit sur le dossier Downloads (Téléchargements) et effectuer un clic gauche sur le bouton "Copy" (Copier), vous pouvez saisir:

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

Il existe déjà des wrappers autour des zones d'interface utilisateur communes (paramètres, lanceur d'applications, application Fichiers, etc.).

La fonction uiauto.Run utilisée ci-dessus effectue une liste d'actions. Dans ce contexte, une action n'est qu'un func(context.Context) error. Avec une API aussi simple, d'autres types d'actions peuvent être mélangés à des actions de l'interface utilisateur. Par exemple, utiliser le clavier est aussi simple que:

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

Pour en savoir plus, consultez Atelier de programmation Tast: Automatisation de l'interface utilisateur Chrome.

Lors de l'écriture de ces tests, il est très utile de vider l'arborescence d'accessibilité de Chrome pour le débogage. Pour ce faire, il vous suffit d'ajouter le code suivant:

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

L'arborescence a11y sera désormais stockée avec d'autres journaux de tast en tant que faillog/ui_tree.txt

Pour toute question, contactez le groupe des utilisateurs de tast.