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

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

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

La biblioteca tiene una forma simple y encadenable de describir cómo encontrar un elemento de la IU. Por ejemplo, la carpeta Downloads en la app de Archivos podría definirse 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 el el nodo de muchas formas. Desde unos simples clics hasta la espera del enfoque, la IU proporciona acceso estable a muchas operaciones. Por ejemplo, a la derecha haz clic en la carpeta Downloads y, luego, en el botón de copia, 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 */ }

Existen contenedores en las áreas comunes de la IU (configuración, selector, aplicación de archivos, etc.).

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

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 la IU de Chrome.

Al escribir estas pruebas, es muy útil volcar el árbol de accesibilidad de Chrome. para la depuración. 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 de sabor como faillog/ui_tree.txt

Si tienes alguna pregunta, comunícate con el grupo de usuarios de prueba.