Für eine Java EE Anwendung, bei der für das Presentation-Layer JSF und PrimeFaces verwendet werden, habe ich für die Durchführung der UI-Tests Selenium, Arquillian, Drone und Graphene verwendet und für jede Oberfläche eine Page- und eine Testklasse geschrieben. Die verschiedenen Elemente können bei UI-Test in der Page-Klasse i.d.R. über ihre id angesprochen werden, was dann wie folgt aussieht:
Der Zugriff auf manche Elemente kann jedoch Schwierigkeiten bereiten, weil z.B. die id nicht verwendet werden kann. Ein typisches Beispiel ist die selectManyCheckbox von PrimeFaces.
Ich habe auf meiner startpage.xhtml eine selectManyCheckbox mit drei Auswählmöglichkeiten. Bei der Zuordnung der selectItems war ich zunächst von der id der selectManyCheckbox ausgegangen:
Mein Code sah daher wie folgt aus:
Dies führte jedoch zu einer NoSuchElementExceptionbzw. einer ElementNotVisibleException.
Das Problem dabei ist, dass sich die id des Input-Elements innerhalb eines div befindet, das auf der Oberfläche nicht angezeigt wird:
Das selectItem ist daher für den Test nur über ein span erreichbar:
Der Aufruf im Test kann daher am besten über den xPath, der die id und die CSS-Klasse enthält, erfolgen.
Um den korrekten xPath zunächst zu prüfen, kann im Firefox die Konsole, die über die Taste F12 aufgerufen wird, mit dem Befehl $x(„xPath“) verwendet werden.
Der Aufruf des xPath erfolgt daher wie folgt: $x(“//*[@id=’tableFormForAllContacts:contactsTable:businessUnitsForContacts’]//div[contains(@class, ‘ui-chkbox-box’)]”)
Hierbei wird über // nach allen untergeordneten Hierachie-Ebenen gesucht und anschließend über * nach der nächstunteren Ebene und zwar nach der id der selectManyCheckbox und anschließend über // nach allen untergeordneten Hierachie-Ebenen, die die CSS-Klasse ui-chckbox-box enthalten.
In der Page-Klasse erfolgt die Auswahl der seltectItems der selectManyCheckbox daher wie folgt:
Auf diesem Weg ist es mit dem xPath möglich ein Element anzusprechen, dass über die id nicht zu erreichen ist.
Der xPath kann weiterhin verwendet werden, wenn z.B. generierte Inhalte einer bestimmten Zelle einer Tabelle abgefragt werden sollen, die sich über AJAX-Requests verändern.
In der Testklasse löst nachfolgende Testmethode einen AJAX-Request aus:
Der Screenshot zeigt zwar die geänderte Checkbox korrekt an, nicht aber die Daten in der Tabelle, da diese über AJAX geupdatet werden, so dass der Test fehlschlägt.
Die Testmethode wird daher um eine waitUntil()-Methode ergänzt, die auf der Graphene.waitGui() basiert. Diese prüft über eine definierte Zeitspanne hinweg, ob ein bestimmter Wert auf der Seite erscheint. Im nachfolgenden Code wird gewartet bis auf der Seite der angegebene Inhalt erscheint, ohne ein bestimmtes Element direkt anzusprechen:
Sofern nicht nur auf der gesamten Seite, sondern in einer bestimmten Zelle der Wert abgefragt werden soll, kann auch hier wieder der Weg über den xPath gewählt werden.
Für die Ermittlung der korrekten Zelle kann man sich als Hilfestellung den xPath generieren lassen:
Anschließend kann man die generierte Endung an den bereits erstellten xPath mit der id ergänzen und zunächst über die Konsole testen:
Der xPath setzt sich daher aus der id der Tabelle sowie der Spalte und Zeile zusammen, so dass ganz gezielt einzelne Zellen abgefragt werden können. Der Code in der Testklasse hierzu sieht daher wie folgt aus:
Der xPath kann daher auch in der Test-Klasse zum Ansprechen von Elementen verwendet werden, die generiert werden und daher nicht direkt über eine id erreichbar sind.