Chromium Chronicle #21: ChromeOS のエンドツーエンドの UI 自動化

エピソード 21: ブレンダン ハンスクネヒト、カリフォルニア州マウンテンビュー(2021 年 5 月)
前のエピソード

これまでは、エンドツーエンド(E2E)テストで ChromeOS の UI を自動化して、 使用が難しくなっていました。Tast では新しい UI ライブラリが Chrome a11y(アクセシビリティ)ツリーを使用して ChromeOS UI を制御する、この ライブラリを使用することで、デベロッパーは、 UI サーフェス(ChromeOS デスクトップ UI、ネイティブ アプリ、ウェブアプリ、Chrome ブラウザ UI)。

このライブラリには、UI 要素を見つける方法を記述するためのシンプルで連鎖可能な方法が用意されています。 たとえば、ファイルアプリの [ダウンロード] フォルダは次のように定義できます。

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

ノード ファインダーを定義したら、そのノードを 使用できます。単純なクリックからフォーカスの待機まで、UI は 多くのオペレーションに安定してアクセスできます。たとえば、 [Downloads] フォルダをクリックし、コピーボタンを左クリックすると、次のように作成できます。

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

既存の共通の UI 領域のラッパー(設定、 ランチャー、ファイルアプリなど)。

上記の uiauto.Run 関数は、アクションのリストを受け取ります。この アクションは単なる func(context.Context) error です。このような 単純な API では、他の種類のアクションを UI アクションに混在させることができます。 たとえば、次のように簡単にキーボードを使用できます。

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

詳しくは、Codelab の例: Chrome UI オートメーションをご覧ください。

これらのテストを作成する場合は、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 グループにお問い合わせください。