In der heutigen Web­ent­wick­lung ist es von ent­schei­den­der Bedeutung, dass Sie eine Anwendung für die ver­schie­de­nen Dis­play­grö­ßen der Besucher bzw. Nutzer auf­be­rei­ten. Der re­spon­si­ve Ansatz, bei dem sich das ver­öf­fent­lich­te Web­pro­jekt au­to­ma­tisch an die tech­ni­schen Vor­aus­set­zun­gen des je­wei­li­gen Geräts anpasst, hat sich dabei als un­an­ge­foch­te­ne Stan­dard­lö­sung her­aus­kris­tal­li­siert. Ebenso wichtig wie eine hohe Fle­xi­bi­li­tät in Sachen Dis­play­grö­ße ist für eine moderne Website aber eine best­mög­li­che Brow­ser­kom­pa­ti­bi­li­tät: Für User sollte es nämlich keinen Un­ter­schied spielen, ob sie eine Seite mit Firefox, Chrome, Safari oder einem anderen Webclient aufrufen.

Das so­ge­nann­te Cross-Browser-Testing spielt aus diesem Grund bei der Pro­gram­mie­rung von Web­pro­jek­ten seit Jahren eine wichtige Rolle. Eines der be­lieb­tes­ten Tools für die Durch­füh­rung solcher Tests ist das von Thought­Works ver­öf­fent­lich­te Framework Selenium, das wir in diesem Tutorial genauer in den Blick nehmen.

Was ist Selenium bzw. Selenium WebDriver?

Um den Ent­wick­lungs­pro­zess einer Zeit- und Kosten-Ap­pli­ka­ti­on in Python zu op­ti­mie­ren, kreierte Jason Huggins 2004 mit dem Ja­va­Script­TestRun­ner das Kernstück des heute als Selenium bekannten Web-Testing-Frame­works. Zunächst kam das Tool aus­schließ­lich intern in der Software-Firma Thought­Works zum Einsatz, bei der Huggins zu diesem Zeitpunkt arbeitete. Nach seinem Wechsel zu Google (2007) trieb er dort die Wei­ter­ent­wick­lung und Feh­ler­aus­bes­se­rung der Software voran, die mitt­ler­wei­le quell­of­fen (Apache-2.0-Lizenz) und somit für die breite Masse verfügbar war. Infolge eines Zu­sam­men­schlus­ses mit der API WebDriver erhielt das Testing-Framework den bis heute aktuellen Namen Selenium bzw. Selenium WebDriver.

Die heutige Version von Selenium basiert aus­schließ­lich auf HTML und Ja­va­Script und erlaubt es Ent­wick­lern, In­ter­ak­tio­nen mit einer Web­an­wen­dung zu testen und auf­zu­neh­men, um diese an­schlie­ßend beliebig oft – und voll­stän­dig au­to­ma­ti­siert – zu wie­der­ho­len. Die ent­schei­den­den Kom­po­nen­ten, die diesen Testing-Prozess möglich machen, sind folgende:

  • Selenium Core: Das Kernmodul enthält die Ba­sis­funk­tio­na­li­tät des Frame­works, also u. a. den Ja­va­Script­TestRun­ner sowie die grund­le­gen­de Test­be­fehls-API.
  • Selenium IDE: Bei Selenium IDE handelt es sich um die Ent­wick­lungs­um­ge­bung des Testing-Frame­works, die u. a. als Basis der IDE-Er­wei­te­rung für Chrome und Firefox dient. Diese wird für das Aufnehmen und Abspielen von Tests benötigt.
  • Selenium WebDriver: WebDriver ist die ent­schei­den­de Schnitt­stel­le für die Si­mu­la­ti­on von Nut­zer­inter­ak­tio­nen in jedem be­lie­bi­gen Browser – ob Firefox, Chrome, Edge, Safari oder Internet Explorer. Seit 2018 ist die API ein of­fi­zi­el­ler W3C-Standard.
  • Selenium Grid: Selenium Grid ist eine Er­wei­te­rung von WebDriver bzw. dessen Vorgänger Selenium Remote Control (RC), die das parallele Ausführen von Tests auf mehreren Servern er­mög­licht. Auf diese Weise lässt sich die Testdauer erheblich verkürzen.

Wo kommt Selenium WebDriver zum Einsatz?

Selenium ist im Testing-Umfeld eine feste Größe und ins­be­son­de­re als Grund­ge­rüst ver­schie­dens­ter Programme in diesem Spektrum gefragt. Zu den be­kann­tes­ten Bei­spie­len zählt etwa das Ende-zu-Ende-Framework Pro­tra­c­tor, das speziell für das Testen von Angular- und AngularJS-Ap­pli­ka­tio­nen entworfen wurde und zur Si­mu­la­ti­on von Nut­zer­inter­ak­tio­nen auf die WebDriver-API zu­rück­greift. Auch die Test­au­to­ma­ti­sie­rungs­soft­ware Appium, die für native und hybride Mobile Apps kon­zi­piert ist, nutzt die stan­dar­di­sier­te Schnitt­stel­le, um einfach und bequem Tests in der fa­vo­ri­sier­ten Pro­gram­mier­spra­che durch­füh­ren zu können.

Auch der sehr bekannte, cloud­ba­sier­te Web­ser­vice Brow­ser­Stack setzt auf Selenium: Der in Indien ent­wi­ckel­te Dienst, der nach einer kos­ten­frei­en Testphase in ver­schie­de­nen kos­ten­pflich­ti­gen Abon­ne­ments genutzt werden kann, nutzt das Testing-Framework als Basis für seine au­to­ma­ti­sier­ten Desktop- und Mobile-Tests.

Hinweis

Als Open-Source-Software lässt sich Selenium bzw. Selenium WebDrive natürlich auch un­ab­hän­gig von bereits exis­tie­ren­den Pro­gram­men wie den oben genannten Lösungen einsetzen. Mit den ver­schie­de­nen Kom­po­nen­ten, die mitt­ler­wei­le in dem Framework kom­bi­niert werden, ist dies – ent­spre­chen­des Know-how vor­aus­ge­setzt – pro­blem­los möglich.

Selenium-WebDriver-Tutorial: So nutzen Sie das Framework für Ihre Webtests

Wer eigene Testfälle mit Selenium erstellen möchte, ohne von einem externen Service bzw. Software-Her­stel­ler abhängig zu sein, benötigt hierfür keine spe­zi­el­len Pro­gram­mier­kennt­nis­se. Browser-Testing mithilfe des Frame­works ist nämlich auch deshalb so un­kom­pli­ziert, weil Sie die Test­skrip­te in diversen Sprachen schreiben können – u. a. in Ja­va­Script, Java, C#, Ruby und Python. Im nun folgenden Selenium-Tutorial sollen die Ein­rich­tung und Nutzung des Frame­works ex­em­pla­risch am Beispiel von Python de­mons­triert werden.

Hinweis

Die nach­fol­gen­den Schritte dieses Selenium-WebDriver-Tutorials setzen voraus, dass eine aktuelle Version von Python in­stal­liert ist.

Schritt 1: In­stal­la­ti­on von Selenium

Für den Einsatz von Selenium WebDriver stehen Clients sowie eine Reihe von Bi­blio­the­ken zur Verfügung, die zusammen als „Language Bindings“ (dt. „Sprach­bin­dun­gen“) be­zeich­net werden und die Basis des Frame­works bzw. des Testing-Ver­fah­rens bilden. Sie müssen al­ler­dings nur die Client-Treiber und Bi­blio­the­ken für die Sprache in­stal­lie­ren, in der Sie Ihre Skripte schreiben möchten.

In unserem Selenium-WebDriver-Tutorial benötigen wir die Language Bindings für Python, die sich stan­dard­mä­ßig mit dem Python-Pa­ket­ma­na­ger pip und dem folgenden Befehl in­stal­lie­ren lassen:

pip install selenium

Al­ter­na­tiv laden Sie das Source-Paket unter dem zuvor aus­ge­zeich­ne­ten Link herunter, entpacken das tar.gz-Archiv und verwenden die setup.py-Datei, um die In­stal­la­ti­on durch­zu­füh­ren. In diesem Fall lautet der er­for­der­li­che Befehl:

python setup.py install

Im zweiten Schritt gilt es, den Treiber des Browsers her­un­ter­zu­la­den und zu in­stal­lie­ren, mit dem sich Selenium verbinden soll. Firefox setzt bei­spiels­wei­se den Treiber ge­ckodri­ver voraus, dessen of­fi­zi­el­le Releases Sie in folgendem GitHub-Re­po­si­to­ry finden. Eine komplette Auf­lis­tung der Treiber für die wich­tigs­ten Browser (Chrome, Edge, Internet Explorer, Safari etc.) finden Sie in den of­fi­zi­el­len Selenium-Online-Do­ku­men­ta­tio­nen.

Hinweis

Wenn Sie Selenium per Remote-Ver­bin­dung verwenden möchten, müssen Sie außerdem die Selenium-Ser­ver­kom­po­nen­te in­stal­lie­ren. Ent­spre­chen­de In­stal­la­ti­ons­pa­ke­te finden Sie auf der of­fi­zi­el­len Down­load­sei­te des Frame­works (unter der Sparte „Selenium Server (Grid)“). Beachten Sie dabei, dass die Aus­füh­rung der Ser­ver­an­wen­dung eine aktuelle Version der Java-Lauf­zeit­um­ge­bung (JRE) vor­aus­setzt.

Schritt 2: Wahl der passenden Ent­wick­lungs­um­ge­bung (IDE)

Nachdem Sie die Vor­aus­set­zun­gen ge­schaf­fen haben, um Selenium WebDriver zu nutzen, können Sie mit dem Schreiben von Testing-Skripten für Ihr Web­pro­jekt beginnen. Zu diesem Zweck genügt prin­zi­pi­ell der fa­vo­ri­sier­te Code-Editor – emp­feh­lens­wert ist in diesem Fall aber die Ver­wen­dung einer Python-IDE (bzw. einer Ent­wick­lungs­um­ge­bung für die Sprache, mit der Sie arbeiten möchten), um Ihre Pro­duk­ti­vi­tät zu ma­xi­mie­ren. Bekannte und beliebte Lösungen sind bei­spiels­wei­se folgende Vertreter:

  • PyCharm: Die Python-IDE PyCharm erhalten Sie wahlweise in einer kos­ten­frei­en, quell­of­fe­nen Community- oder einer kos­ten­pflich­ti­gen Pro­fes­sio­nal-Edition. Skripte für Selenium-Tests können Sie aber in jedem Fall mit beiden Varianten schreiben. Als Be­triebs­sys­te­me werden Windows, Linux und macOS un­ter­stützt.
  • PyDev: PyDev ist ein Python-Plug-in für die Ent­wick­lungs­um­ge­bung Eclipse, die grund­sätz­lich für die Ent­wick­lung von Java-Ap­pli­ka­tio­nen kon­zi­piert ist. Die Er­wei­te­rung lässt sich entweder über die Pro­jekt­sei­te oder direkt über den Update-Manager her­un­ter­la­den und in­stal­lie­ren. PyDev bzw. Eclipse läuft auf allen gängigen Windows-, macOS- und Linux-Systemen.

Schritt 3: Python-Skript für das Browser-Testing (Firefox) mit Selenium erstellen

Haben Sie die ge­wünsch­te Lösung parat, können Sie damit beginnen, in­di­vi­du­el­le Skripte für die Au­to­ma­ti­sie­rung von Brow­ser­in­ter­ak­tio­nen unter Zu­hil­fe­nah­me von Selenium-Klassen und -Funk­tio­nen zu schreiben. In diesem Selenium-Tutorial kreieren wir ex­em­pla­risch ein Python-Skript für Firefox, das – im Mozilla-Browser – au­to­ma­tisch die Such­ma­schi­ne Google aufruft, einen Such­be­griff eintippt und die Er­geb­nis­se im Anschluss auswertet bzw. auf­zeich­net. In Code-Form über­tra­gen, sehen diese au­to­ma­ti­sier­ten Schritte wie folgt aus:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# Firefox-Sitzung erstellen
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.maximize_window()
# Webanwendung aufrufen
driver.get("http://www.google.de")
# Textbox lokalisieren
search_field = driver.find_element_by_id("lst-ib")
search_field.clear()
# Suchbegriff eingeben und bestätigen
search_field.send_keys("Suchbegriff")
search_field.submit()
# Liste der Suchergebnisse abrufen, die infolge der Suche angezeigt werden
# unter Zuhilfenahme der Methode find_elements_by_class_name
lists= driver.find_elements_by_class_name("_Rm")
# Alle Elemente durchlaufen und individuellen Text wiedergeben
i=0
for listitem in lists:
    print (listitem.get_attribute("innerHTML"))
    i=i+1
    if(i>10):
        break
# Browserfenster schließen
driver.quit()

Die Bedeutung der einzelnen Kom­po­nen­ten des Skripts fasst die folgende Tabelle über­sicht­lich zusammen:

Codezeile(n) Bedeutung
from selenium import web­dri­ver­from selenium.webdriver.common.keys import Keys Zunächst wird das WebDriver-Modul geladen, um die Klassen und Methoden für den Support der ver­schie­de­nen Browser zu im­ple­men­tie­ren. Gleich im Anschluss lädt das Skript das Setup für die virtuelle Tastatur, um im späteren Verlauf Tas­ta­tur­ein­ga­ben si­mu­lie­ren zu können.
driver = webdriver.Firefox()driver.im­pli­cit­ly_wait(30)driver.maximize_window() Im zweiten Schritt wird eine Firefox-Instanz erstellt, die sich später mit Selenium-Befehlen steuern lässt. Für den Start des Browsers ist ein Timeout von 30 Sekunden vor­ge­se­hen, zudem soll das Brow­ser­fens­ter maximiert werden.
driver.get("http://www.google.de") Nun ruft das Skript die deutsch­spra­chi­ge Google-Seite auf, die hier als Basis für die au­to­ma­ti­sier­ten Nut­zer­inter­ak­tio­nen dient.
search_field = driver.find_element_by_id("lst-ib")search_field.clear() Ist die Such­ma­schi­ne auf­ge­ru­fen, sucht das Skript nach der Text-Box der Google-Suche, die durch das ID-Attribut "lst-ib" ge­kenn­zeich­net ist. Sobald es lo­ka­li­siert ist, wird das Suchfeld zunächst mit der clear()-Methode geleert.
search_field.send_keys("Such­be­griff")search_field.submit() Es folgt die Eingabe des Textes „Such­be­griff“ und deren Be­stä­ti­gung per submit()-Methode.
lists= driver.find_elements_by_class_name("_Rm") Die einzelnen Such­re­sul­ta­te werden in der Folge als <a>-Elemente auf­ge­lis­tet. Damit sie sich durch die Methode find_elements_by_class_name ansteuern lassen, wird diese an dieser Stelle im Skript ein­ge­führt.
i=0for listitem in lists: print (listitem.get_attribute("innerHTML")) i=i+1 if(i>10): break Im letzten aktiven Schritt gibt das Skript die Liste der erzielten Treffer wieder, wobei es sich auf die ersten zehn Einträge mit <a>-Tag be­schränkt.
driver.quit() Die ab­schlie­ßen­de Codezeile sorgt dafür, dass die Browser-Instanz wieder beendet wird.
Hinweis

Das in diesem Selenium-Tutorial ver­wen­de­te Beispiel zeigt ein­drucks­voll, wie gut das Framework für das Browser-Testing geeignet ist. Es zeigt aber auch, dass Selenium WebDrive ebenso in­ter­es­sant für das Web Scraping mit Python ist, das ebenfalls zu den viel­fäl­ti­gen Nut­zungs­mög­lich­kei­ten der Test­in­Goog­le Workspace zählt. Aus­führ­li­che­re In­for­ma­tio­nen darüber, was es mit dieser Da­ten­samm­lung aus dem Web auf sich hat, erhalten Sie in unserem Artikel „Was ist Web Scraping?“.

Selenium WebDriver: Nicht für alle Szenarien geeignet

Selenium bzw. Selenium WebDriver gibt Ihnen erst­klas­si­ge Tools an die Hand, um wichtige Website-Daten zu sammeln und Nut­zer­inter­ak­tio­nen zu si­mu­lie­ren. Al­ler­dings ist auch das Open-Source-Framework nicht für alle Ein­satz­be­rei­che geeignet, wie die Ent­wick­ler in ihrer Auf­stel­lung der „Worst Cases“ deutlich machen. Zu den Fällen bzw. Website-Inhalten, die Sie mit Selenium nicht testen bzw. erfassen können, zählen demnach folgende:

  • Captchas: Die bestens bekannten und weit ver­brei­te­ten Captchas sind speziell zum Schutz vor Bots und Spam ent­wi­ckelt worden und damit auch nicht für Au­to­ma­ti­sie­rungs­pro­zes­se mit Selenium verfügbar. Die Eingabe-Tests sollten Sie daher während des Testings bzw. Scrapings de­ak­ti­vie­ren oder vor­über­ge­hend durch ein al­ter­na­ti­ves Element ersetzen.
  • Datei-Downloads: Den Download von Dateien können Sie in Selenium-Instanzen zwar per si­mu­lier­tem Link-Klick starten, den Fort­schritt des Down­load­pro­zes­ses zeigt die API aber nicht an.
  • HTTP-Antwort-Codes: Selenium birgt gewisse Schwächen im Umgang mit HTTP-Status-Codes. Diese Nachteile lassen sich al­ler­dings im Be­darfs­fall durch den Einsatz eines zu­sätz­li­chen Proxys aus­glei­chen.
  • Log-in bei Dritt­an­bie­ter-Services: Ob Social-Media-Plattform, Cloud-Service oder E-Mail-Konto – eine Anmeldung bei Dritt­an­bie­tern über eine Selenium-Sitzung ist nicht zu empfehlen. Zum einen stellen die Anbieter solcher Services eigene APIs zu Test­zwe­cken zur Verfügung, zum anderen ist das Testing mit dem Framework in solchen Fällen sehr schwer­fäl­lig.
  • Per­for­mance-Testing: Für reine Leis­tungs­tests ist Selenium WebDrive nicht geeignet, da das Framework hierfür schlicht nicht kon­zi­piert ist.
Zum Hauptmenü