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

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

Auparavant, l'interface utilisateur de ChromeOS était automatisée lors de tests de bout en bout sur l'ensemble d'appareils s'est révélée difficile. Dans Tast, une nouvelle bibliothèque d'UI a été qui utilise l'arborescence d'accessibilité (accessibilité) Chrome pour contrôler l'UI de ChromeOS. Ce permet aux développeurs de créer facilement des tests de bout en bout Surface de l'interface utilisateur (UI de bureau ChromeOS, applications natives, applications Web, interface utilisateur du navigateur Chrome)

La bibliothèque propose un moyen simple et chaînable de décrire comment trouver un élément d'UI. 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, vous pouvez interagir avec de nombreuses façons. Qu'il s'agisse de simples clics ou d'attentes de sélection, l'UI offre un accès stable à de nombreuses opérations. Par exemple, vers la droite cliquez sur le dossier Téléchargements, puis effectuez un clic gauche sur le bouton "Copier". Vous pouvez alors écrire ceci:

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 des enveloppes autour des zones d'interface utilisateur courantes (paramètres, le lanceur d'applications, l'application Fichiers, etc.).

La fonction uiauto.Run utilisée ci-dessus exécute une liste d'actions. Dans ce un contexte, une action n'est qu'un func(context.Context) error. Avec un tel API simple, d'autres types d'actions peuvent être mélangés aux actions d'interface utilisateur. Par exemple, l'utilisation du clavier est très simple:

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 un guide plus détaillé, consultez Tast Codelab: Chrome UI Automation (Atelier de programmation test : 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 tast en tant que faillog/ui_tree.txt

Si vous avez des questions, contactez le groupe "tast-users".