Web49.4
Web – Pseudoattribute

Pseudoattribute sind dafür gedacht, Resolver zu vereinfachen, die über JavaScript Werte aus dem Browser ermitteln. Ein Pseudoattribut wird in QF-Test registriert und erhält seinen Wert aus dem Ergebnis einer Javascript-Code-Ausführung.

Attribute von HTML-Elementen können in einem SUT Skript mit der Methode getAttribute() ausgelesen werden (Auf diese Weise wertet auch der CustomWebResolver (siehe Abschnitt 49.1.2) die genericClasses-Kategorie aus). Pseudoattribute werden über den gleichen Mechanismus ausgelesen, verhalten sich also aus der Sicht von QF-Test wie normale Attribute. Sie sind jedoch nicht über den HTML-Quelltext definiert oder mit node.setAttribute() explizit zugewiesen, sondern werden über den nachfolgend beschriebenen Mechanismus gesetzt.

Bei der Definition eines Pseudoattributes wird angegeben, ob es gecached werden soll. In diesem Fall wird der Wert, den Javascript beim ersten Zugriff auf die Komponente ermittelt hat, bis zum nächsten Komplett-Scan der Seite zwischengespeichert. Das kann die Ausführung insgesamt beschleunigen. Bei veränderbaren Werten, beispielsweise dem Check-Status einer Checkbox, sollte das Pseudoattribut aber nicht gecached werden, da diese Werteänderung sonst nicht für QF-Test "sichtbar" ist. Bei "ungecachten" Pseudoattributen findet keine längere Zwischenspeicherung des Wertes statt, sondern dieser wird jedes Mal neu ausgelesen (und dann für die Verarbeitung kurzzeitig gespeichert), wenn ein Event aufgenommen wird, wie zum Beispiel bei einem Mausklick die Einzelevents "moved", "pressed", "released" und "clicked", oder wenn eine Komponente gesucht wird.

Im nachfolgenden Beispiel wird ein Pseudoattribut für alle HTML-Elemente mit dem Tag "ICON" oder "IMAGE" definiert, das mittels JavaScript den Wert von iconname ermittelt (Technisch wird hier dazu die beispielhafte Methode inspect, die vom Framework für das HTML-Element definiert wurde, aufgerufen).

import de.qfs.apps.qftest.client.web.dom.DomNodeAttributes
import de.qfs.apps.qftest.client.web.dom.FunctionalPseudoAttribute

def attr = new FunctionalPseudoAttribute("js_icon",
                       "try {return _qf_node.inspect('iconname')} catch(e){}", true)
DomNodeAttributes.registerPseudoAttributes("ICON", attr)
DomNodeAttributes.registerPseudoAttributes("IMAGE", attr)
Beispiel 49.32:  Groovy SUT Skript zum Registrieren eines Pseudoattributs

Dieses Pseudoattribut kann dann zum Beispiel in einem Merkmal-Resolver genutzt werden, wobei im Gegensatz zu einem direkten Aufruf von node.callJS() im Resolver automatisch die internen Caching-Mechanismen von QF-Test genutzt werden:

def getFeature(node, feature):
    iconname = node.getAttribute("js_icon")
    return iconname

resolvers.addResolver("iconFeature", getFeature, "ICON", "IMAGE")
Beispiel 49.33:  Nutzung eines Pseudoattributs im Resolver (Jython SUT-Skript)

Im folgenden Skript wird das Pseudoattribut wieder deregistriert.

import de.qfs.apps.qftest.client.web.dom.DomNodeAttributes

DomNodeAttributes.unregisterPseudoAttributes("ICON", "js_icon")
DomNodeAttributes.unregisterPseudoAttributes("IMAGE", "js_icon")
Beispiel 49.34:  Deregistrierung eines Pseudoattributs (Groovy SUT-Skript)

Ein Pseudoattribut wird über einen der folgenden Konstruktoren von de.qfs.apps.qftest.client.web.dom.FunctionalPseudoAttribute oder de.qfs.apps.qftest.client.web.dom.PseudoAttribute definiert:

 
 
PseudoAttribute FunctionalPseudoAttribute(String name, String javaScriptFunction, Boolean cached)
Definiert ein Pseudoattribut.
Parameter
name Der Name für das Pseudoattribut.
javaScriptFunction Der JavaScript Code, der beim Zugriff auf das Pseudoattribut in einer Funktion ausgeführt werden soll. _qf_node ist dabei das Objekt, worüber auf das HTML-Element zugegriffen werden kann. Die Auswertung erfolgt analog zur DomNode.callJS-Methode.
cachedtrue, wenn der Wert nach dem ersten Zugriff auf das Pseudoattribut behalten werden soll, andernfalls false.
Rückgabewert Ein Pseudoattribut, das anschließend registriert werden kann.
 
PseudoAttribute PseudoAttribute(String name, String javaScriptCode, Boolean cached)
Definiert ein Pseudoattribut.
Parameter
name Der Name für das Pseudoattribut.
javaScriptCode Der JavaScript Code, der beim Zugriff auf das Pseudoattribut ausgeführt werden soll. _qf_node ist dabei das Objekt, worüber auf das HTML-Element zugegriffen werden kann. Die Auswertung erfolgt analog zur DomNode.evalJS-Methode.
cachedtrue, wenn der Wert nach dem ersten Zugriff auf das Pseudoattribut behalten werden soll, andernfalls false.
Rückgabewert Ein Pseudoattribut, das anschließend registriert werden kann.
 
 

Anschließend muss das Pseudoattribut über die folgende Methode aus de.qfs.apps.qftest.client.web.dom.DomNodeAttributes registriert werden:

 
 
void registerPseudoAttributes(String tag, PseudoAttribute pseudoAttribute)
Registriert das Pseudoattribut für HTML-Elemente mit dem angegebenen Tag.
Parameter
tag Das Tag der HTML-Elemente, für die das Pseudoattribut registriert werden soll. Wenn das Pseudoattribut für HTML-Elemente mit unterschiedlichen Tags registriert werden soll, muss der Aufruf für die einzelnen Tags durchgeführt werden. Wenn es für alle HTML-Elemente registriert werden soll, lautet das Tag "<QF_ALL>".
pseudoAttribute Das zuvor definierte Pseudoattribut.
 
 
 
 
void unregisterPseudoAttributes(String tag, String name)
Deregistriert das Pseudoattribut für HTML-Elemente mit dem angegebenen Tag. Die Deregistrierung ist nicht zwingend notwendig. Mit der Beendigung von QF-Test geschieht dies automatisch.
Parameter
tag Der Tag-Name der HTML-Elemente, für die das Pseudoattribut deregistriert werden soll.
name Der Name des Pseudoattributs.