The Chromium Chronicle n. 21: automazione end-to-end dell'interfaccia utente di ChromeOS

Puntata 21: di Brendan Hansknecht a Mountain View, CA (maggio 2021)
Puntate precedenti

Storicamente, l'automazione dell'interfaccia utente di ChromeOS nei test end-to-end (E2E) sull'intero parco dispositivi è stato difficile. In Tast, è stata creata una nuova libreria dell'interfaccia utente che utilizza la struttura ad albero (accessibilità) di Chrome per controllare l'interfaccia utente di ChromeOS. Questa libreria consente agli sviluppatori di creare facilmente test E2E su qualsiasi piattaforma UI visibile (UI desktop di ChromeOS, app native, app web, UI del browser Chrome).

La libreria offre un modo semplice e concatenato per descrivere come trovare un elemento UI. Ad esempio, la cartella Download dell'app File potrebbe essere definita come:

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

Una volta definito uno strumento di ricerca nodi, è possibile interagire con il nodo in molti modi. Dai semplici clic all'attesa dell'elemento attivo, la libreria UI fornisce un accesso stabile a molte operazioni. Ad esempio, se fai clic con il pulsante destro del mouse sulla cartella Download e poi sul pulsante Copia, puoi scrivere:

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

Sono già presenti wrapper nelle aree dell'interfaccia utente comuni (impostazioni, Avvio app, app File e così via).

La funzione uiauto.Run utilizzata in precedenza esegue un elenco di azioni. In questo contesto, un'azione è semplicemente un func(context.Context) error. Con un'API così semplice, è possibile combinare altri tipi di azioni con azioni dell'interfaccia utente. Ad esempio, usare la tastiera è semplice come:

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

Per una guida più approfondita, consulta Tast Codelab: Chrome UI Automation.

Durante la scrittura di questi test, è molto utile eseguire il dump dell'albero di Chrome per il debug. Per farlo, basta aggiungere il seguente codice:

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

L'albero a11y verrà ora memorizzato insieme ad altri log del gusto come faillog/ui_tree.txt

Per qualsiasi domanda, contatta il gruppo di utenti del assaggio.