Logo QF-Test

Komplett in zwei Sprachen dokumentiert.
Handbuch = Das QF-Test-Nachschlagewerk

 

Gratis Testen  Download  Kaufen

Hilfe gibt's direkt in der QF-Test Anwendung

Auf die gesamte Dokumentation können Sie auch über das Hilfe Menü direkt in QF-Test zugreifen.

Uwe Klüh, Senior Sales Manager, QFS

Durchsuchen Sie die gesamte Dokumentation (Handbuch, Tutorial, Mailingliste, Standardbibliothek), indem Sie die Suchfunktion der Homepage nutzen.

Uwe Klüh, Sr. Sales Manager, QFS

Handbuch

6
Unterelemente komplexer GUI Komponenten

In typischen GUIs gibt es häufiger Komponenten wie Bäume und Tabellen. Diese GUI-Elemente können meist beliebig kompliziert verschachtelt werden und eine beliebige Zahl von Unterelementen wie Baumknoten oder Tabellenfelder enthalten. Diese Unterelemente sind meist selbst keine echten GUI Komponenten, sondern nur eine grafische Darstellung der zugrunde liegenden Daten. Insofern ist die Unterscheidung zwischen einer Komponente und einer Unterkomponente rein technischer Natur. Es macht allerdings aus Sicht eines Testers durchaus Sinn, Unterelemente als eigenständige Komponenten darzustellen, um diese als mögliche Ziele für Events anbieten zu können. Hierfür bietet QF-Test die Möglichkeit an Unterelement durch einen 'Element' Knoten zu repräsentiert.

6.1
'Elemente'

Ein 'Element' wird durch zwei Dinge definiert: die Komponente, zu der es gehört, sowie einen Index innerhalb dieser Komponente. Der Parentknoten des 'Elements' legt die Komponente fest. Der Index kann entweder eine Zahl sein, oder ein Text. Numerische Indizes starten mit 0. So entspricht z.B. in einer JList Komponente das Element mit Index 1 dem zweiten Listeneintrag. Für Bäume sind einfache numerische Indizes nahezu unbrauchbar, da durch das Ein- und Ausklappen von Ästen die Indizes aller darunter liegenden Knoten verändert werden.

Ein Textindex definiert ein Element durch den Text, den es an der Oberfläche anzeigt. Ein Listenelement namens "Eintrag1" in einer JList Komponente würde z.B. mit dem Textindex "Eintrag1" aufgezeichnet. Die Textform ist flexibler als die numerische, kann aber Probleme bereiten, wenn die angezeigten Texte der Elemente in einer Komponente nicht eindeutig sind. In diesem Fall wird das erste passende Element angesprochen. Ein Textindex kann auch als regulärer Ausdruck (vgl. Abschnitt 39.4) angegeben werden. Auch in diesem Fall ist das Ziel das erste Element, das auf den regulären Ausdruck passt.

Die Option Format für Unterelemente legt fest, welches Format beim Aufzeichnen von Elementen verwendet wird.

Beinahe alle Arten von 'Elementen' haben nur einen Index. Dies reicht für die Zelle einer JTable Komponente nicht, da Tabellen zweidimensionale Strukturen sind. Entsprechend sind zwei Indizes nötig, um eine Zelle exakt zu beschreiben. Der erste, der 'Primärindex', legt die Tabellenspalte fest, der 'Sekundärindex' die Zeile.

Ein Element für ein Tabellenfeld
Abbildung 6.1:  Ein 'Element' für ein Tabellenfeld

Auch Baumknoten nehmen eine Sonderstellung ein. Wie oben beschrieben lässt sich die hierarchische Struktur nicht so leicht auf eine lineare Struktur abbilden. Außerdem treten in Bäumen oft Baumknoten mit den gleichen Namen auf. Wenn man dagegen die direkten und indirekten Parentknoten mit in den Namen einbezieht, lässt sich meistens Eindeutigkeit erreichen.

QF-Test verwendet eine besondere Syntax um Baumknoten darzustellen. Ein Index, der mit einem '/' Zeichen beginnt, wird als Pfadindex interpretiert. Denken Sie dabei einfach an ein Dateisystem: Die Datei namens "/tmp/file1" kann entweder flach als "file1" dargestellt werden, was zu Konflikten mit anderen Dateien namens "file1" in anderen Verzeichnissen führen kann. Alternativ kann der volle und eindeutige Pfad "/tmp/file1" verwendet werden. QF-Test unterstützt auch numerische Indizes mit dieser Syntax: Ein numerischer Index der Form "/2/3" bezeichnet den vierten Kindknoten des dritten Kindknotens des Wurzelknotens. Eine kombinierte Form um z.B. mittels "/tmp/2" den dritten Knoten im "tmp" Knoten anzusprechen, ist derzeit nicht möglich.

Hinweis Diese spezielle Syntax macht das '/' Zeichen zu einem Sonderzeichen für 'Elemente' in einer Baumkomponente. Taucht dieses Zeichen selbst in einem Namen auf, muss es daher geschützt werden. Näheres zu diesem Thema finden Sie in Abschnitt 39.6.

6.2
Die 'QF-Test ID' eines 'Elements'

Alles was in Abschnitt 5.3 zum 'QF-Test ID' Attribut von 'Komponenten' gesagt wurde, trifft auch auf das 'QF-Test ID' Attribut eines 'Elements' zu. Dieses Attribut muss eindeutig sein und wird von Events und Checks referenziert.

Wenn QF-Test die 'QF-Test ID' eines 'Elements' automatisch zuweist, erzeugt es diese indem es die 'QF-Test ID' der 'Komponente' des Parentknotens nimmt und den Index (oder die Indizes) anhängt. Diese Art von 'QF-Test ID' ist normalerweise gut zu lesen und zu verstehen. Leider ist sie aber auch die Quelle eines häufigen Missverständnisses: Wenn Sie den Index eines aufgezeichneten 'Elements' ändern wollen, um auf ein anderes Element zu verweisen, dürfen Sie nicht das Attribut 'QF-Test ID der Komponente' des Knotens ändern, der darauf verweist (es sei denn Sie verwenden die besondere Syntax, die im folgenden Abschnitt beschrieben wird). Stattdessen müssen Sie den 'Primärindex' des 'Element' Knotens ändern.

6.3
Besondere 'QF-Test ID'-Syntax für direkten Zugriff auf Elemente
6.3.1
Zugriff auf einfache Unterelemente

Es gibt noch weitere Möglichkeiten um auf Unterelemente von komplexen Komponenten zuzugreifen. Bei diesen wird dann auf zusätzliche 'Element' Knoten verzichtet und das Unterelement wird über eine entsprechende Zeichenkettenfolge mithilfe eines speziellen Syntax beschrieben. Die Zeichenkette wird hierbei direkt im Attribut 'QF-Test ID der Komponente' des entsprechenden Event-Knotens spezifiziert. An Stelle der 'QF-Test ID' eines 'Elements' geben Sie hier die 'QF-Test ID' des 'Komponente' Knotens an, der die komplexe Komponente (Baum, Tabelle, etc.) repräsentiert. Diese 'QF-Test ID' wird dann mit einem speziellen Trennzeichen um den Index des Unterelements erweitert. Das Trennzeichen legt dabei fest, ob es sich um einen numerischen Index, einen Textindex oder einen regulären Ausdruck handelt:

Trennzeichen Index Format
@ Textindex
& Numerischer Index
% Regulärer Ausdruck
Tabelle 6.1:  Trennzeichen und Indexformat für den Zugriff auf Unterelemente

Um auf eine Zelle in einer Tabelle mit 'Primärindex' und 'Sekundärindex' zuzugreifen, hängen Sie einfach ein weiteres Trennzeichen an, gefolgt vom 'Sekundärindex'. Die beiden Indizes dürfen dabei durchaus verschiedenen Formaten angehören.

Ein Beispiel: Wenn Ihre Testsuite einen 'Komponente' Knoten für eine JTable Komponente mit der 'QF-Test ID' table hat und Sie einen Mausklick auf die Zelle in der 6. Zeile und in der Spalte mit der Überschrift "Name" simulieren wollen, legen Sie einen 'Mausevent' an und setzen Sie sein 'QF-Test ID der Komponente' Attribut auf den Wert table@Name&5.

3.3+

Beinahe alle internen ItemResolver Implementierungen (vgl. Abschnitt 42.4) erlauben die Verwendung negativer Indizes um die Zählung von hinten beginnen zu lassen. So adressiert etwa table&-1&-1 die unterste Zelle in der rechten Tabellenspalte.

Es hängt von der jeweiligen Situation ab, ob ein 'Element' Knoten oder die spezielle Syntax sinnvoller ist. Sie können beide Methoden nach belieben verwenden und auch mischen. Als Faustregel gilt, dass 'Element' Knoten besser für Komponenten mit wenigen, konstanten Elementen geeignet sind, wie z.B. die Spalten einer Tabelle oder die Reiter einer JTabbedPane. Die Syntax ist vorzuziehen, wenn QF-Test Variablen in Indizes verwendet werden oder wenn die Namen von Elementen variieren oder editierbar sind. Die Option Art der Unterelemente legt fest, ob QF-Test beim Aufzeichnen 'Element' Knoten anlegt oder die 'QF-Test ID'-Syntax verwendet. Mit der Standardeinstellung "Intelligent" folgt QF-Test obigen Regeln.

Hinweis Die besondere Bedeutung der Trennzeichen '@', '&' und '%' macht diese zu Sonderzeichen, die geschützt werden müssen, wenn sie selbst in einem Namen auftauchen. Näheres zu diesem Thema finden Sie in Abschnitt 39.6.

4.0+6.3.2
Mehrstufige Unterelemente und deren Adressierung

In komplexeren GUIs ist es möglich, dass Unterelemente wie zum Beispiel die Zellen einer Tabelle selbst noch weitere Komponenten enthalten. Typische Beispiele hierfür sind z.B. Checkboxen oder Textfelder, die in Tabellenzellen eingebettet wurden. Es ist allerdings durchaus auch möglich, dass Tabellen ineinander verschachtelt werden. Solche inneren Komponenten können mit einer speziellen, mehrstufigen Syntax für Unterelemente adressiert werden.

6.3.2.1
Adressierung mit QPath

Jedem 'QF-Test ID der Komponente' Attribut (mit oder ohne Unterelement) in einem Event oder Check Knoten können ein oder mehrere Indizes der Form @:ClassName<idx> angehängt werden, wobei <idx> optional ist. Dies weist QF-Test an, zunächst die Zielkomponente (und ggf. das Unterelement) für den Teil des 'QF-Test ID der Komponente' Attributs vor dem '@:' zu ermitteln und anschließend darin nach sichtbaren Komponenten der Klasse ClassName zu suchen. Ist <idx> angegeben, wird dies als 0-basierter Index in die Liste der sichtbaren Kandidaten interpretiert. Kein <idx> ist äquivalent zu <0>.

Web6.3.2.2
Adressierung mit XPath und/oder CSS-Selektoren
4.1+

XPath und CSS-Selektoren sind standardisierte Beschreibungen um Komponenten in Webbrowsern anzusprechen. (Offizielle Spezifikationen: https://www.w3.org/TR/xpath/ und https://www.w3.org/TR/css3-selectors/).

Seit QF-Test 4.1 unterstützt QF-Test offiziell die Komponentenbeschreibung via XPaths und CSS-Selektoren für Web-Elemente um eine leichtere Migration bestehender Webtests anderer Tools nach QF-Test zu ermöglichen.

Das Internet bietet bereits eine Vielzahl von Tutorials an, die die Komponentenerkennung mithilfe von CSS-Selektoren (z.B.: https://www.w3schools.com/cssref/css_selectors.asp) sowie die Komponentenerkennung mithilfe von XPaths (z.B.: https://www.w3schools.com/xml/xpath_syntax.asp) beschreiben. Insofern wird auf die Eigenheiten dieser Komponentenerkennung hier nicht mehr explizit eingegangen.

Verwendung in der QF-Test ID

Angenommen in QF-Test soll eine Web-Komponente anhand des XPath's "$(xpath)" oder eines CSS-Selektors "$(css)" erkannt werden, so kann dies prinzipiell über mehrere Wege geschehen. Am einfachsten/schnellsten ist es meist, den XPath bzw. den CSS-Selektor im "QF-Test ID der Komponente"-Attribut eines beliebigen Event-Knotens zu spezifizieren. Hierzu wird der folgende Syntax benutzt:

genericHtml@:xpath=${quoteitem:$(xpath)}
genericHtml@:css=${quoteitem:$(css)}

bzw. gleichwertig:

genericDocument@:xpath=${quoteitem:$(xpath)}
genericDocument@:css=${quoteitem:$(css)}

Die Syntax kann hierbei beliebig verschachtelt werden. Zum Beispiel kann man mithilfe von:

genericDocument@:xpath=${quoteitem:$(xpath)}@:css=${quoteitem:$(css)}

QF-Test dazu anweisen zuerst mithilfe eines XPath nach einer Komponente zu suchen und dann anschließend mithilfe eines CSS-Selektors nach einer Unterkomponente.

Hinweis Bitte beachten Sie, dass die @:xpath/@:css-Syntax aus nachvollziehbaren Gründen erwartet, dass der verwendete XPath/CSS-Syntax eine einzelne Komponente zurückliefert. Die Verwendung einer XPath-Syntax die keine einzelne Komponente, sondern zum Beispiel eine Zahl (Beispiel: "count(.//input[@id!='Google'])") oder einen Boolean (Beispiel: "nilled($in-xml//child[1])") zurückliefert, kann deshalb unter Umständen zu unerwartetem Verhalten führen.

Verwendung in Skripten

Das rc-Modul erlaubt in SUT Skripten ebenfalls Web-Komponenten via XPath bzw. CSS-Selektoren zu finden.

com = rc.getComponent("genericHtml") # or rc.getComponent("genericDocument")
res = com.getByXPath(rc.lookup("xpath"))    # find subcomponent via xpath
res = com.getByCSS(rc.lookup("css"))        # find subcomponent via css
res = com.getAllByXPath(rc.lookup("xpath")) # find all subcomponent via xpath
res = com.getAllByCSS(rc.lookup("css"))     # find all subcomponent via css
Beispiel 6.1:  Finden von Komponenten anhand von XPath / CSS-Selektoren in Skripten

Und um einen XPath zu benutzen, der keine Komponente(n) zurückliefert benutzen Sie bitte die evalJS-Funktion:

node = rc.getComponent('genericDocument')
print node.evalJS("""document.evaluate("count(.//input[@id='Google'])",
    document, null, 0, null).numberValue;""")
Beispiel 6.2:  Beispiel für den Aufruf von XPath-Selektoren, der keine Komponente zurückliefert

Verwendung in Komponentenknoten

Innerhalb eines Komponente-Knotens kann QF-Test des weiteren ebenfalls angewiesen werden, dass für die Komponentenerkennung ein XPath bzw. CSS-Selektor verwendet werden soll. Hierzu spezifiziert man ein wie folgt aussehendes Erkennungsmerkmal unter "Weitere Merkmale":

StatusMuss übereinstimmen
RegexpNein
NegierenNein
Nameqfs:item
Wert@:xpath=${quoteitem:$(xpath)} oder @:css=${quoteitem:$(css)}
Abbildung 6.2:  Extra Feature Attribute für die Komponentenerkennung anhand von XPath oder CSS-Selektoren.
Web6.4
Element-Aufnahme für Web-Tabellen aktivieren

In Webseiten werden Tabellen sowohl für 'richtige', sichtbare Tabellen genutzt als auch für Layout-Zwecke. Darüber hinaus sind verschachtelte Tabellen möglich. QF-Test kann im Regelfall nicht feststellen wo eine reale Tabelle beginnt und deshalb ist Element-basiertes Aufnehmen nicht ohne Zusatzinformation möglich.

Diese Information kann jedoch vom Benutzer geliefert werden. Mit Hilfe der Prozedur qfs.web.table.recording.activateItemRecording aus der Standardbibliothek kann Element-Aufnahme für die angegebene Webtabelle aktiviert werden.

Wenn nicht klar ist, welche QF-Test ID an die Prozedur übergeben werden soll, hilft folgendes Vorgehen. Nehmen Sie einfach einen Mausklick auf eine beliebige Tabellenzelle auf. Dann springen Sie von diesem Knoten zum zugehörigen Komponentenknoten durch Drücken von [Strg-W] oder mittels Rechtsklick und Auswahl von »Komponente finden« und suchen aufwärts in der Komponentenhierarchie nach dem nächsten Elternknoten der Klasse TABLE. Dessen QF-Test ID sollte die richtige sein.

HinweisWenn ein AJAX Toolkit Resolver zum Einsatz kommt, ist eine getrennte Aktivierung i.d.R. nicht notwendig. AJAX Tabellen werden vom Resolver behandelt.

Videos Downloads Dokumentation Kaufen Gratis Testen