Chromium Chronicle n.o 21: Automatización de la IU de extremo a extremo de ChromeOS

Episodio 21: de Brendan Hansknecht en Mountain View, California (mayo de 2021)
Episodios anteriores

Históricamente, la automatización de la IU de ChromeOS en pruebas de extremo a extremo (E2E) en toda la flota de dispositivos ha sido difícil. En Tast, se creó una nueva biblioteca de IU que usa el árbol de accesibilidad (accesibilidad) de Chrome para controlar la IU de ChromeOS. Esta biblioteca permite a los desarrolladores crear fácilmente pruebas E2E en cualquier superficie visible de la IU (IU de escritorio de ChromeOS, apps nativas, apps web y la IU del navegador Chrome).

La biblioteca tiene una manera simple y encadenable de describir cómo encontrar un elemento de la IU. Por ejemplo, la carpeta Descargas en la app de Archivos se podría definir de la siguiente manera:

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

Una vez que hayas definido un buscador de nodos, es posible interactuar con él de muchas maneras. Desde simples clics hasta la espera de enfoque, la biblioteca de IU brinda acceso estable a muchas operaciones. Por ejemplo, para hacer clic con el botón derecho en la carpeta Downloads y, luego, hacer clic con el botón izquierdo en el botón de copiar, puedes escribir lo siguiente:

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

Hay wrappers existentes alrededor de áreas comunes de la IU (configuración, selector, app de archivos, etcétera).

La función uiauto.Run que se usó anteriormente toma una lista de acciones. En este contexto, una acción es solo un func(context.Context) error. Con una API tan simple, se pueden combinar otros tipos de acciones con las de la IU. Por ejemplo, usar el teclado es tan fácil como lo siguiente:

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

Para obtener una guía más detallada, consulta Codelab de Tast: Automatización de IU de Chrome.

Cuando escribes estas pruebas, es muy útil volcar el árbol de a11y de Chrome para depurar. Para ello, simplemente agrega el siguiente código:

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

El árbol de a11y ahora se almacenará con otros registros tast como faillog/ui_tree.txt.

Si tiene alguna pregunta, comuníquese con el grupo de usuarios finales.