Chromium Chronicle #21: ChromeOS 엔드 투 엔드 UI 자동화

에피소드 21: 작성자: Brendan Hansknecht, 캘리포니아주 마운틴뷰 (2021년 5월)
이전 에피소드

이전에는 전체의 엔드 투 엔드 (E2E) 테스트에서 ChromeOS UI를 자동화했습니다. 많은 기기가 쉽지 않았습니다 Tast에서는 새로운 UI 라이브러리가 만든 Chrome a11y (접근성) 트리를 사용하여 ChromeOS UI를 제어합니다. 이 라이브러리를 사용하면 개발자는 눈에 보이는 모든 대상의 E2E 테스트를 쉽게 UI 노출 영역 (ChromeOS 데스크톱 UI, 네이티브 앱, 웹 앱, Chrome 브라우저 UI)

라이브러리에는 UI 요소를 찾는 방법을 설명하는 간단하고 체이닝 가능한 방법이 있습니다. 예를 들어 Files 앱의 Downloads 폴더는 다음과 같이 정의할 수 있습니다.

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

자세한 가이드는 Tast 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 트리가 다른 tast 로그와 함께 faillog/ui_tree.txt로 저장됩니다.

궁금한 사항은 tast-users 그룹에 문의하세요.