Chromium Chronicle #21: kompleksowa automatyzacja UI w ChromeOS

Odcinek 21: Brendan Hansknecht w Mountain View, Kalifornia (maj 2021 r.)
Poprzednie odcinki

W przeszłości automatyzacja interfejsu ChromeOS pod kątem kompleksowych testów (E2E) w całej flocie urządzeń była trudna. W Tast utworzyliśmy nową bibliotekę interfejsu, która do sterowania interfejsem ChromeOS wykorzystuje drzewo ułatwień dostępu (A11y) w Chrome. Ta biblioteka umożliwia deweloperom łatwe tworzenie testów E2E względem dowolnej widocznej platformy interfejsu (interfejsu użytkownika na komputery ChromeOS, aplikacji natywnych, aplikacji internetowych i interfejsu przeglądarki Chrome).

W bibliotece dostępny jest prosty, łańcuchowy sposób opisania sposobu znajdowania elementu interfejsu. Na przykład folder Pobrane w aplikacji Pliki można zdefiniować jako:

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

Po zdefiniowaniu wyszukiwarki węzłów można korzystać z węzła na wiele sposobów. Biblioteka UI zapewnia stabilny dostęp do wielu operacji – od prostych kliknięć po czekanie na Ciebie. Na przykład, aby kliknąć prawym przyciskiem myszy folder Pobrane, a potem kliknąć lewym przyciskiem myszy przycisk kopiowania, możesz napisać:

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

Istnieją już opakowania związane z częstymi obszarami interfejsu (ustawienia, program uruchamiający, aplikacja do obsługi plików itp.).

Użyta powyżej funkcja uiauto.Run wykonuje listę działań. W tym kontekście działaniem jest tylko func(context.Context) error. Przy tak prostym interfejsie API można łączyć inne działania z działaniami interfejsu. Na przykład używanie klawiatury jest tak proste, jak:

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

Bardziej szczegółowy przewodnik znajdziesz w części Tast Codelab: Chrome UI Automation.

Przy pisaniu tych testów przydaje się zrzut drzewa Chrome na potrzeby debugowania. W tym celu wystarczy dodać ten kod:

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

Drzewo a11y będzie teraz przechowywane razem z innymi zapisami danych jako faillog/ui_tree.txt

Jeśli masz pytania, skontaktuj się z grupą tast-users.