Chromium Chronicle #21:ChromeOS 端到端界面自动化

第 21 集:作者:Brendan Hansknecht,地点:加利福尼亚州山景城(2021 年 5 月)
上一集

过去,在整个设备群中自动执行 ChromeOS 界面的端到端 (E2E) 测试并非易事。在 Tast 中,我们创建了一个新的界面库,该库使用 Chrome a11y(无障碍功能)树来控制 ChromeOS 界面。借助此库,开发者可以针对任何可见界面界面(ChromeOS 桌面界面、原生应用、Web 应用、Chrome 浏览器界面)轻松创建端到端测试。

该库提供了一种简单的可链接方式来描述如何查找界面元素。例如,“文件”应用中的 Downloads 文件夹可定义为:

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

定义节点查找程序后,您可以通过多种方式与该节点进行交互。从简单的点击到等待焦点,界面库可让您稳定地访问许多操作。例如,要右键点击 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 */ }

通用界面区域(设置、启动器、文件应用等)已经有了封装容器。

上面使用的 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 网上论坛