WinAppDriver - Teil 1

Testautomation mit Windows Application Driver Teil 1 - Einleitung/Vorbereitung

Für GUI-Tests von Webanwendungen hat sich Selenium WebDriver in der Entwicklerwelt etabliert. Für das Testen von Apps steht das Automations-Framework Appium zur Verfügung. Microsoft hat nun nachgezogen und seine eigene Variante eines Automationsservers entwickelt: den Windows Application Driver (WinAppDriver).

Er nutzt Microsoft UI Automation, um Windows-Anwendungen aller wesentlichen Technologien (UWP, WPF, Windows Forms, MFC sowie klassisches WinAPI) programmatisch anzusteuern.

WinAppDriver ist quelloffen und mit dem Appium-Protokoll kompatibel, d.h. es kann mithilfe des Appium Windows Driver nahtlos in eine bestehende Appium-Testumgebung integriert werden. Wegen dieser Vorteile hat Microsoft WinAppDriver als offiziellen Nachfolger der Coded-UI-Test-Technologie angekündigt.

In diesem Artikel zeige ich anhand eines einfachen Beispiels, wie Sie WinAppDriver für automatisierte GUI-Tests mit und ohne Appium einsetzen können. Dazu führe ich auf der UWP-App „Rechner“ von Windows 10 (Abb. 1) eine simple Rechenoperation aus und prüfe dann, ob das Ergebnis stimmt.

Abb. 1: GUI der Rechner-App

Einen ausführlichen Artikel zum Thema habe ich in der dotnetpro 06/2019 veröffentlicht – Sie können den Artikel auch herunterladen.

Installation

Wenn Sie Appium bereits einsetzen oder zukünftig einsetzen wollen, dann sollten Sie möglichst die WinAppDriver-Version nutzen, die mit Appium ausgeliefert wird; andernfalls bekommen Sie die aktuelle Version auf github. Für die Test-Entwicklung benötigen Sie zudem die .NET-Client-Bibliotheken für Appium, die Sie am besten per NuGet in Ihr Softwareprojekt einbinden. Legen Sie in Visual Studio ein Projekt vom Typ Komponententestprojekt (.NET Framework) an und wählen Sie Projekt | NuGet-Pakete verwalten. Von dort installieren Sie das Paket Appium.WebDriver.

Vorbereitung der zu testenden Anwendung

Das Vorgehen ist bei allen Windows-Technologien gleich – Sie müssen lediglich im Vorfeld ermitteln, wie Sie die Anwendung programmatisch starten und die GUI-Steuerelemente der Anwendung ansprechen können:

Um eine UWP-App programmatisch starten zu können, muss deren ID (Application User Model ID = AUMID) bekannt sein. Hierzu können Sie das Power Shell-Skript aus Listing 1 nutzen (mit Administratorrechten ausführen!). Das Skript listet die IDs aller installierten Apps auf, und die gesuchte ID lässt sich in der Regel am Namen erkennen.

Listing 1: PowerShell-Skript zur Ausgabe aller AUMIDs

$installedApps = get-AppxPackage -allusers
$aumidList = @()
foreach ($app in $installedApps)
{
    foreach ($id in (Get-AppxPackageManifest $app).package.applications.application.id)
    {
        $aumidList += $app.packagefamilyname + "!" + $id
    }
}
$aumidList | Sort-Object

Um ein GUI-Element in einer laufenden Anwendung ansprechen können, muss das Element eindeutig identifiziert werden. Dazu stellt WinAppDriver einige Lokator-Methoden (Selektoren) zur Verfügung (siehe Tabelle 1).

Mithilfe des Windows-SDK-Tools Inspect, das nach der Installation von Visual Studio mittels

C:\Program Files (x86)\Windows Kits\10\bin\(Version)\(Plattform)\inspect.exe

gestartet werden kann, lassen sich die konkreten Werte aus der Anwendungssitzung auslesen. Dazu müssen Sie das gewünschte GUI-Element mit der Maus in den Fokus nehmen. Daraufhin werden die Attribute des Elements angezeigt. Tabelle 1 zeigt, welche Lokator-Methode welches Attribut erkennt.

Wenn das gesuchte GUI-Element ein AutomationId-Attribut besitzt, sollte dieses möglichst zur Identifikation genutzt werden, da es speziell für solche Automationszwecke vorgesehen ist – siehe Abb. 2.

Nützlich ist auch der UIRecorder, der ähnlich wie Inspect arbeitet. Nachdem Sie ein GUI-Element der laufenden Anwendung in den Fokus genommen haben, werden in diesem Fall nicht die Attribute des Elements, sondern der Pfad zum Element im XPath-Format ausgegeben. Im Aufnahmemodus können Sie zudem C#-Code generieren, den Sie über die entsprechende Registerkarte herauskopieren können (Abb. 3). Starten Sie Inspect und UIRecorder aber nicht gleichzeitig – sie kommen sich in die Quere.

Methode Beispiel Attribut in Inspect
FindElementByAccessibilityId plusButton AutomationId
FindElementByClassName ClassName Button
FindElementById RuntimeId (dezimal) 42.656828.4.8
FindElementByTagName ControlType (Textfragment zwischen UIA_... und …ControlTypeId). (Referenz Button
FindElementByXPath (Alle) //Button[@Name='Plus']
Abb. 2: Inspect zeigt die Attribute der Rechner-App an (WindowsApplicationDriver-Abb2.png)
Abb. 3: Der UIRecorder zeigt oben einen XPath-Wert, unten C#-Code an (WindowsApplicationDriver-Abb3.png)

Wenn Sie alle benötigten Werte ermittelt haben, können Sie mit Teil 2 dieses Artikels fortfahren, um Ihre Tests zu schreiben.


Artikelserie "WinAppDriver"

Jetzt teilen: