Vorgehensweise

Die Microsoft UI Automation ist ein Accessibility- und Test-Framework, das den programmatischen Zugriff auf GUI Elemente von nativen Windows-Anwendungen erlaubt. In QF-Test kann dieses Framework in Skriptknoten über das Jython Modul uiauto angesprochen werden (alternativ de.qfs.UIAuto für Groovy, uiauto für Javascript).

Zur direkten und einfachen Nutzung für die Testerstellung bietet QF-Test in der Standardbibliothek ein Package, das QF-Test Prozeduren für häufig benötigte Interaktionen mit GUI-Elementen zur Verfügung stellt. Dieses wird im Folgenden beschrieben.

Die für die Ansteuerung von nativen Windows Elementen relevanten Prozeduren befinden sich im Package qfs.autowin. Sie sehen in dem Package etliche Prozeduren, die als überholt (deprecated) gekennzeichnet sind. Diese sind durch normale Knoten der win Engine von QF-Test abgelöst worden und werden nicht mehr weiterentwickelt. Dies bezieht sich zum Beispiel auf Themen bei der Bildschirmskalierung. Prinzipiell können Sie die Prozeduren so wie sie sind weiter verwenden. Wenn es aber zu Problemen kommt, dann ist es empfehlenswert auf die win Engine umzusteigen.

Abbildung 50.1:  UI Automation Prozeduren in der Standardbibliothek

Die grundsätzliche Vorgehensweise bei der Erstellung von Tests für native Windows-Anwendungen ist folgende:

  • Start der Anwendung
  • Identifikation der Zugriffsparameter für die GUI-Elemente
  • Erstellung von Tests unter Verwendung der ermittelten Zugriffsparameter

Start der Anwendung

Die zu testende Anwendung kann, muss aber nicht, über QF-Test gestartet werden.

Wenn die Anwendung über QF-Test gestartet wird, erscheint der gestartete Prozess in der Liste der QF-Test Clients im Menü »Clients« und auch die Beendigung des Prozesses durch QF-Test ist möglich.

Zur Prüfung, ob die zu testende Anwendung gestartet ist, wird die Prozedur qfs.autowin.checkForExistence verwendet.

Ein Beispiel zum Anwendungsstart finden Sie in Abschnitt 50.2.1.

Auflistung aller GUI-Elemente eines Fensters

Bevor Tests erstellt werden können, ist es notwendig, sich einen Überblick über die in der Anwendung vorhandenen GUI-Elemente zu verschaffen. Hierzu stehen die Prozeduren qfs.autowin.helpers.dumpComponents und qfs.autowin.helpers.dumpComponentsToFile zur Verfügung. Diese listen die GUI-Elemente für das angegebene Fenster auf. Erstere gibt das Ergebnis im QF-Test Terminal, letztere in eine Datei aus.

Mit der Prozedur qfs.autowin.helpers.dumpDesktopWindows können die Titel der aktuell geöffneten Windows Fenster ausgegeben werden.

qfs.autowin.helpers.dumpComponents gibt den Namen (Name), die Klasse (ClassName), den Komponententyp (ControlType) und die Id (AutomationId) des GUI-Elements aus, soweit diese für das GUI-Element implementiert wurden.

Alle auf dem Desktop sichtbaren GUI-Elemente sind in einer Baumstruktur organisiert, mit dem Desktop als Wurzelelement. Im Aufruf der Dump-Prozedur wird das gewünschte Fenster angegeben. Die Verschachtelung der GUI-Elemente wird in der Ausgabe mittels Einrückungen dargestellt.

Hinweis Die Ausgabe der Prozedur dumpComponents() wird im QF-Test Terminal, das standardmäßig unten im QF-Test Fenster angezeigt wird, ausgegeben. Im Client-Terminal und den Skript-Konsolen, die separat geöffnet werden können, wird das Ergebnis dieses Dump-Befehls nicht angezeigt.

Ein Beispiel finden Sie in Abschnitt 50.2.2.

Informationen zu einzelnen GUI-Elementen

In der Standardbibliothek steht die Prozedur qfs.autowin.helpers.dumpComponent zur Verfügung, um sich zu einem einzelnen GUI-Element weitere Informationen ausgeben zu lassen. Dies umfasst die Liste der zur Verfügung stehenden Methoden sowie einzelne Attributwerte.

Zugriff auf GUI Elemente

Alle in der Standardbibliothek für die Ausführung von Aktionen auf nativen Windows-Anwendungen zur Verfügung gestellten Prozeduren ermitteln im ersten Schritt das jeweilige GUI-Element und führen dann die entsprechende Aktion darauf aus. Diese sind im Package qfs.autowin.component zusammengefasst. Das GUI-Element wird über die Prozedur qfs.autowin.component.getControl ermittelt. Die Parameter dieser Hilfsprozedur gelten daher für alle Prozeduren, die eine Aktion auf einem GUI-Element ausführen.

Folgende Parameter(-kombinationen) sind möglich (in der Reihenfolge der Auswertung):

  • AutomationId
  • ControlType und Name
  • ControlType und Index
  • ClassName und Name
  • ClassName und Index
  • Name
AutomationId
Über die AutomationId ist die eindeutige Identifikation eines GUI-Elements innerhalb eines Fensters möglich. Sie muss jedoch bei der Anwendungsentwicklung explizit vergeben werden und ist deshalb in vielen Fällen leider nicht verfügbar.
Name
Der Name entspricht in der Regel dem angezeigten Text. Namen müssen nicht eindeutig sein. Daher kann es notwendig sein, zusätzlich zum Namen den ControlType oder ClassName anzugeben.
Namen werden als reguläre Ausdrücke ausgewertet. Nähere Infomationen zu regulären Ausdrücken finden Sie in Reguläre Ausdrücke - Regexps.
ControlType
Der ControlType ist ein Wert aus einer vordefinierten Liste von Komponententypen, zum Beispiel : Button, CheckBox, ComboBox, DataGrid, Edit, List, Tab, Text. Die Prozedur qfs.autowin.helpers.dumpComponent zeigt den Namen und den numerischen Wert des jeweiligen ControlTypes an. Um ein GUI-Element an Hand seines ControlTypes zu identifizieren, muss entweder der Name oder der Index, bezogen auf den ControlType, zusätzlich angegeben werden, außer es gibt im Fenster nur ein GUI-Element dieses ControlTypes.
ClassName
Der ClassName eines GUI-Elements ist Framework-spezifisch. Zusätzlich zu dem ClassName kann auch der Name oder der Index, bezogen auf die Klasse, des GUI-Elements angegeben werden.

Ausführen von Aktionen auf GUI-Elementen

Für die häufigsten Aktionen finden Sie vorgefertigte Prozeduren in der Standard-Bibliothek qfs.qft im Package qfs.autowin.component. Sie können das Package nach Belieben unter Verwendung des Jython-Moduls "uiauto" erweitern. Hierbei empfiehlt es sich, die Erweiterungen nicht direkt in der qfs.qft vorzunehmen, da wir die Standardbibliothek kontinuierlich weiterentwickeln und mit jeder QF-Test Version neu ausliefern.

Mausklick
Prozedur: qfs.autowin.component.click

Zunächst versucht die Prozedur ein Klick-Event auszulösen. Dies ist jedoch häufig nicht implementiert. Falls dies nicht möglich ist, wird ein harter Mausklick auf die Position des GUI-Elements abgespielt.
Warten auf Komponente
Prozedur: qfs.autowin.component.waitForComponent

Die Prozedur wartet auf die angegebene Komponente und sobald diese gefunden wurde, wird die Kontrolle an den rufenden Knoten zurückgegeben. Die angegebene Wartezeit (in Millisekunden) ist die maximale Zeit, die gewartet wird. Die Prozedur wirft eine Exception, wenn die Komponente nicht innerhalb der angegeben Zeit gefunden wird.
Warten auf Fenster
Prozedur: qfs.autowin.checkForExistence

Die Prozedur wartet auf das angegebene Fenster und sobald dieses gefunden wurde, wird die Kontrolle an den rufenden Knoten zurückgegeben. Die angegebene Wartezeit (in Millisekunden) ist die maximale Zeit, die gewartet wird. Die Prozedur wirft eine Exception, wenn das Fenster nicht innerhalb der angegeben Zeit gefunden wird.
Texteingabe
Prozedur: qfs.autowin.component.setText

Häufig ist setText() für die jeweilige Komponente nicht implementiert. In diesem Fall steht meistens setValue() zur Verfügung.
Tastatur-Events
Im Package qfs.autowin.keyevents stehen Prozeduren für das Abspielen der Tastatur-Events ENTER, TAB und DELETE zur Verfügung. Über die Prozedur qfs.autowin.keyevents.sendKey können einzelne Tastatureingaben, auch in Kombination mit Strg, Alt und der Umschalttaste, erfolgen, z.B. einzelne Buchstaben, Ziffern, Funktionstasten. Die Eingabe geht auf die Komponente, die im angegebenen Fenster den Fokus hat.
Text auslesen
Prozedur: qfs.autowin.component.getText

Einen direkten Zugriff auf den Text eines GUI-Elements gibt es nicht. Viele GUI-Elemente haben einen Namen, der in der Regel dem angezeigten Text entspricht. Manchmal hat der Name nur einen Bezug zum angezeigten Text, entspricht ihm aber nicht wörtlich. Manche Elemente haben unabhängig vom Namen einen Wert, der den Text widergibt. Die Prozedur getText() versucht zunächst, den Wert des Elements zu ermitteln und, falls dies fehlschlägt oder der Wert leer ist, den Namen des Elements.

Die Prozeduren getName() und getValue() stehen zusätzlich zur Verfügung.
Geometrie auslesen
Prozedur: qfs.autowin.component.getGeometry

Text prüfen
Prozedur: qfs.autowin.component.checkText

Die Prozedur holt sich den Text des GUI-Elements über die Prozedur getText() und prüft den erhaltenen Wert mit dem übergebenen Sollwert.

Die Prozeduren checkName() und checkValue() stehen zusätzlich zur Verfügung.
Geometrie prüfen
Prozedur: qfs.autowin.component.getGeometry

Die ermittelten Geometriedaten werden mit den übergebenen Sollwerten verglichen.
Bildvergleich
Prozedur: qfs.autowin.component.checkImage

Für das Prüfen des Abbilds wird ein Referenzbild benötigt. Dieses muss in einer Datei im png-Format bereitsgestellt werden. Über qfs.autowin.component.getGeometry werden die Bildschirmkoordinaten des zu prüfenden Bereichs ermittelt. Die eigentliche Prüfung wird über die Prozedur getPositionOfImage() aus dem Package qfs.autoscreen der Standardbibliothek durchgeführt.

Menüeintrag auswählen
Procedure: qfs.autowin.menu.selectItem

Beim Debuggen eines Tests über Einzelschritte ist es häufig sehr störend, wenn vor dem Klick auf einen Eintrag das zugehörige Menü zuklappt, weil der Fokus an QF-Test übergeben wurde. Hier hilft die Prozedur selectItem(), mit der das Öffnen des Menüs und der Klick auf den Eintrag in einem Debug-Schritt ausgeführt werden kann.