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 .