De Chromium Chronicle #21: ChromeOS end-to-end UI-automatisering

Aflevering 21: door Brendan Hansknecht in Mountain View, CA (mei 2021)
Vorige afleveringen

Historisch gezien was het lastig om de gebruikersinterface van ChromeOS te automatiseren in end-to-end (E2E)-tests op het hele apparatenpark. In Tast is een nieuwe UI-bibliotheek gemaakt die de Chrome a11y-boom (toegankelijkheid) gebruikt om de ChromeOS-gebruikersinterface te beheren. Met deze bibliotheek kunnen ontwikkelaars eenvoudig E2E-tests maken op elk zichtbaar UI-oppervlak (ChromeOS desktop UI, native apps, webapps, Chrome Browser UI).

De bibliotheek heeft een eenvoudige, aan elkaar gekoppelde manier om te beschrijven hoe u een UI-element kunt vinden. De map Downloads in de app Bestanden kan bijvoorbeeld als volgt worden gedefinieerd:

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

Nadat u een knooppuntzoeker hebt gedefinieerd, kunt u op vele manieren met het knooppunt communiceren. Van eenvoudige klikken tot wachten op focus: de UI-bibliotheek biedt stabiele toegang tot veel bewerkingen . Als u bijvoorbeeld met de rechtermuisknop op de map Downloads klikt en met de linkermuisknop op de knop Kopiëren klikt, kunt u het volgende schrijven:

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

Er zijn bestaande wrappers rond algemene UI-gebieden (instellingen, opstartprogramma, bestanden-app, enz.).

De hierboven gebruikte uiauto.Run functie gebruikt een lijst met acties. In deze context is een actie slechts een func(context.Context) error . Met zo'n eenvoudige API kunnen andere soorten acties worden gecombineerd met UI-acties . Het toetsenbord gebruiken is bijvoorbeeld net zo eenvoudig als:

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

Zie Tast Codelab: Chrome UI Automation voor een uitgebreidere handleiding

Bij het schrijven van deze tests is het erg handig om de Chrome a11y-boom te dumpen voor foutopsporing. Voeg hiervoor eenvoudig de volgende code toe:

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

De a11y-boom wordt nu samen met andere tastlogboeken opgeslagen als faillog/ui_tree.txt

Als u vragen heeft, neem dan contact op met de smaakgebruikersgroep .