Chromium Chronicle #21: Комплексная автоматизация пользовательского интерфейса ChromeOS

Эпизод 21: Брендан Ханскнехт, Маунтин-Вью, Калифорния (май 2021 г.)
Предыдущие серии

Исторически автоматизировать пользовательский интерфейс ChromeOS в сквозных (E2E) тестах на всем парке устройств было сложно. В Tast создана новая библиотека пользовательского интерфейса, которая использует дерево Chrome a11y (доступность) для управления пользовательским интерфейсом ChromeOS. Эта библиотека позволяет разработчикам легко создавать тесты E2E для любой видимой поверхности пользовательского интерфейса (пользовательский интерфейс ChromeOS для ПК, собственные приложения, веб-приложения, пользовательский интерфейс браузера Chrome).

В библиотеке есть простой, цепочный способ описания того, как найти элемент пользовательского интерфейса. Например, папка «Загрузки» в приложении «Файлы» может быть определена как:

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

После того как вы определили средство поиска узлов, с ним можно взаимодействовать разными способами. Библиотека пользовательского интерфейса обеспечивает стабильный доступ ко многим операциям — от простых кликов до ожидания фокусировки . Например, чтобы щелкнуть правой кнопкой мыши папку «Загрузки» и левой кнопкой мыши кнопку «Копировать», вы можете написать:

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

Существуют оболочки для общих областей пользовательского интерфейса (настройки, панель запуска, файловое приложение и т. д.).

Функция uiauto.Run , использованная выше, выполняет список действий. В этом контексте действие — это просто func(context.Context) error . С помощью такого простого API другие виды действий можно смешивать с действиями пользовательского интерфейса . Например, использовать клавиатуру так же просто, как:

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

Более подробное руководство можно найти в разделе Tast Codelab: Автоматизация пользовательского интерфейса Chrome.

При написании этих тестов очень полезно создать дамп дерева Chrome a11y для отладки. Для этого просто добавьте следующий код:

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

Дерево a11y теперь будет храниться вместе с другими журналами тестирования faillog/ui_tree.txt

Если у вас есть вопросы, обращайтесь в группу tast-users .