Interaktive Browser-Automatisierung mit Geb und der Groovy-Shell

von Benjamin Kretschmann

Dieser Blog-Post beschreibt die Entstehung eines einfachen Werkzeugs zur interaktiven Benutzung von Geb und zeigt die Verwendung des Werkzeugs anhand eines Beispiels.

Problemstellung und Motivation

Geb ist eine Lösung zur Browser-Automatisierung auf Basis der Selenium Webdriver und der Programmiersprache Groovy. Die Programm-Bibliothek bietet einfache und elegante Möglichkeiten für das automatisierte Testen von Webanwendungen, lässt sich aber auch für das Scraping von Webseiten einsetzen. Zusammen mit dem Testframework Spock setzen wir Geb für funktionale Tests ein. 

Um einzelne Elemente einer Seite zu selektieren, bietet Geb eine jQuery-ähnliche Syntax. Die auf diese Weise selektierten Elemente einer Seite lassen sich in Geb zu einer logischen Einheit zusammenfassen.
Bevor ich einen neuen funktionalen Test schreibe, wähle ich zunächst die daran beteiligten Elemente einer Seite (Buttons, Eingabefelder etc.) aus und erstelle entsprechende Selektoren - also Ausdrücke, die ein bestimmtes Element oder eine Gruppe von Elementen adressieren und für weitere Aktionen zugänglich machen. Auf Grundlage dieser Selektoren erstelle ich die oben beschriebene Einheit, auch PageObject genannt und verwende diese dann im funktionalen Test. 

Als ich erste Erfahrungen mit Geb sammelte, um funktionale Tests zu schreiben, verhielt sich mein Programmcode nicht immer so, wie ich es erwartet hätte. Ich passte die entsprechenden Stellen an und startete den funktionalen Test erneut. Dieses Vorgehen ist aber sehr zeitintensiv, da die zu testende Applikation neu gestartet und Testdaten neu geladen werden müssen. Daher suchte ich nach einer einfachen Lösung, um die Selektoren vor ihrer Verwendung ausprobieren zu können. Als ich keine fertige Lösung für dieses Problem fand, erstellte ich ein kleines Werkzeug auf Basis der Groovy-Shell und dem Build-Tool Gradle. Die Groovy-Shell implementiert einen REPL (read-eval-print-loop), wie man ihn von vielen Scriptsprachen (wie beispielsweise Python oder Javascript) kennt. In Kombination mit Geb lassen sich so Webseiten interaktiv untersuchen. 

Im folgenden Szenario möchten wir die Überschriften der zuletzt veröffentlichten Blog-Posts von der exensio-Homepage extrahieren.

Wir laden uns den Quellcode des Projektes von GitHub herunter oder checken das Projekt mittels git aus. Um das Tool starten zu können, wird das Java Development Kit in der Version 8 und der Firefox Browser benötigt. Außerdem sollte die Umgebungsvariable „JAVA_HOME“ korrekt gesetzt sein.
Nach dem wir auf der Kommandozeile in das Projektverzeichnis gewechselt sind, wird folgender Befehl eingegeben, um die Groovy-Shell und Geb zu initialisieren:

gradlew.bat geb-groovyshell -q

Zunächst wird Gradle und die benötigten Abhängigkeiten (die Geb-Bibliothek, der Selenium-Webdriver etc.) heruntergeladen. Dann sollte sich automatisch eine neue Firefox-Instanz öffnen. Mittels des Browser-Objekts können wir nun diese Instanz ansteuern. Das folgende Beispiel sucht vom exensio-Blog die letzten Posts heraus und zeigt diese mit Hilfe des inspect-Befehls der Groovy-Shell in einem Dialog an.

browser.go('http://blog.exensio.de')
def blog = browser.find('#Blog1')
def posts = blog.find('div.date-outer')
Map result = posts.collectEntries {
	String date = it.find('h2.date-header').text()
	String topic = it.find('div.date-posts').find('h3.post-title.entry-title').text()
	return [(date):topic]
}
:inspect result

Um die Groovy-Shell zu beenden, müssen folgende Befehle eingegeben werden:

:load src/main/groovy/stopGeb.groovy
:exit

Fazit

„Probieren geht über Studieren“ – ersetzt sicherlich nicht das Lesen der Dokumentation, doch gerade, wenn man eine neue Technologie kennenlernt, ist es von großem Vorteil, über eine Möglichkeit zu verfügen, einfach und unkompliziert etwas ausprobieren zu können. Die Groovy-Shell ist hierfür ein gutes Werkzeug. In diesem Beispiel haben wir sie mit Geb kombiniert, doch lässt sich dieses Prinzip auch auf andere Java bzw. Groovy-Bibliotheken übertragen. Auf der Projektseite des Gradle-Groovy-Shell-Plugins finden sich weitere Beispiele, u.a. zur Kombination mit Spring-Boot.

Kategorien: GebGroovySeleniumSpockTesting

Zurück