Beliebte Suchanfragen
//

Remote Screenshots mit Selenium und dem Robot Framework

10.2.2010 | 8 Minuten Lesezeit

Screenshots sind bei Oberflächentests sehr hilfreich, um schnell visuelles Feedback zu bekommen, warum ein Test fehlgeschlagen ist. Selenium bietet hierzu einige gute Möglichkeiten. Diese stoßen Momentan allerdings an viele Grenzen, von denen einige hier im Blogpost diskutiert und sogar gelöst werden sollen

Achtung (2010-02-15): Dieser Artikel bezieht sich auf die SeleniumLibrary 2.2. Die weiter unten vorgeschlagene Änderung hat mittlerweile Eingang in die SeleniumLibrary 2.3 gefunden (Release Notes ). Vielen Dank an das Robot Framework Team!

Unsere bevorzugte Art und Weise, Selenium in die automatischen Fachtests zu integrieren ist das Robot Framework. Dadurch ist es möglich Tests über alle Schichten zu fahren, von der Datenbank bis hin zur UI. Und das sogar täglich (bzw. nächtlich) oder bei jedem commit. Hier begegnet uns auch schon das erste Problem. Unser CI-Server (Hudson) läuft unter Linux … und ohne XServer. D.h. der Selenium Server kann nicht auf dem Server laufen, von dem aus die automatischen Fachtests angestoßen werden. Ein weiterer Grund, den Selenium-Server woanders laufen zu lassen, ist auch dass es schwierig wird, unter Linux den Internet Explorer zum testen zu benutzen; trotz aller Sicherheitslücken und Wechselempfehlungen ein in Intranets immer noch ein häufig genutzter Browser.

Viele Screenshot-Funktionen des Selenium-Servers nehmen als Argument die Datei, in welche der Screenshot gespeichert werden soll; ungünstig, wenn man dann nur wieder über Umwege (scp, fileshares, …) an die Screenshots kommt. Gerade im Fehlerfall sollte die Analyse ja so einfach, wie möglich sein. Es gibt allerdings auch zwei Funktionen in Selenium , die den Screenshot als String (base64 encodiertes PNG) an den Client zurückgeben. Das scheint doch ein guter Hebel zu sein 🙂

Die bestehende SeleniumLibrary für das Robot Framework, stellt allerdings leider die beiden Selenium-Server-Methoden nicht als Keyword bereit, hier heißt es also noch manuell Hand anlegen, bis das offiziell supported wird (Issue 89 ). Dazu lädt man sich die aktuelle Source-Distribution der Robot SeleniumLibrary 2.2.2 herunter, und editiert die Datei __init__.py. Man verzeihe mir hoffentlich meine stümperhaften Python-Gehversuche:

Die Funktionen _absnorm und _write_to_file habe ich mir aus der OperatingSystem Robot Library geborgt (und etwas modifiziert). Um die modifizierte Selenium Library zu installieren reicht ein aufruf von „setup.py install“ auf.

Wie kann man nun das neue Keyword am besten in seinen Robot Testcases benutzen? Ich finde es sehr hilfreich bei einem fehlschlagenden Test einen Screenshot vom Browser zu machen, um schnell sehen zu können, was das Problem ist. Dazu kann das Teardown des Testcases genutzt werden, das im Falle eines Fehlschlags das neue Keyword aufruft:

Testing

SettingValue
LibrarySeleniumLibrary10localhost4444
LibraryOperatingSystem
VariableValue
${BROWSER}ff
Test CaseActionArguments
TestSelenium PASS Open Browserhttp://www.google.de ${BROWSER}
[Teardown]Selenium Teardown
TestSelenium FAIL Open Browserhttp://www.google.de ${BROWSER}
Page Should ContainAAAAAAAAAAAAA-IMPOSSIBLETEXT
[Teardown]Selenium Teardown
KeywordActionArguments
SeleniumTeardown Run Keyword If Test FailedTake Screenshot
Close Browser
Take Screenshot Run Keyword If‚${BROWSER}‘ != ‚*iexplore‘ and ‚${BROWSER}‘ != *’ie‘ and ‚${BROWSER}‘ != ‚*internetexplorer‘ and ‚${BROWSER}‘ != ‚*iehta‘Capture Remote Screenshot

So wird in jedem Teardown geprüft ob der Test fehlgeschlagen ist. Ist dies der Fall wird das Keyword „Take Screenshot“ aufgerufen. Diesen prüft noch den Browser, und nur wenn dieser nicht der Internet Explorer ist, wird das neue Keyword „Capture Remote Screenshot“ aufgerufen, welchen den Screenshot dann auch sofort ins Logfile einbettet:

Um die Screenshots auch noch mit dem IE hinzubekommen waren ein paar Klimmzüge notwendig. Zuerst muss man feststellen, dass man die richtige Methode in selenium aufrufen muss, ansonsten bekommt man nämlich nur einen komplett schwarzen Screenshot. Benutzt man die Methode selenium.capture_screenshot_to_string() bleibt der Screenshot schwarz. Diese Methode benutzt Java um vom kompletten Bildschirm einen Screenshot zu machen (also nicht nur vom Browserinhalt). Das funktioniert zwar auch mit dem Internet Explorer, allerdings überhaupt nicht, wenn der Selenium Server in Hintergrund läuft. Bei uns läuft der Selenium Server auf einem Remote Desktop, und um von ganzen Bildschirm nicht-schwarze Screenshots zu bekommen muss man eingeloggt sein – unpraktisch. Eine Alternative war ein Setup über VNC, was uns aber nicht weniger unpraktisch erschien (von stackoverflow ):

What we do is launch everything from under the context of a VNC session. On Windows, configure VNC to launch a session upon startup. Then make sure the user auto-logs in. Then place a .bat file in Program Files->Startup that launches Selenium RC. It’s kind of a pain, but it’s the most reliable way I’ve found for ensuring that Selenium RC starts in an environment that supports screenshots, launching IE, interacting with native events, etc.

Die Alternative ist, nicht den gesamten Bildschirm zu fotografieren, sondern nur den Browserinhalt. Dies hat auch den Vorteil, dass man die komplette Webseite sieht, wenn sie größer als der Bildschirm ist 😉 Diese Methode benutzt Javascript um an den gerenderten Browserinhalt zu kommen. Nun das Problem: Funktioniert wunderbar mit dem Firefox, aber überhaupt nicht mit dem Internet Explorer. Noch nicht. Hier ist was zu tun ist — so dachte ich. Das folgende hat sich als Sackgasse entpuppt, falls da jemand mehr Erfolg hat, als ich wäre ich sehr daran interessiert, wie.

WIN: Screenshots mit dem IE

Die für mich einzige funktionierende Methode, um auch mit dem IE Screenshots zu machen, ist den Selenium Server im „singleWindow“ Modus laufen zu lassen. Dazu startet man diesen folgendermaßen:

java -jar selenium-server.jar -singleWindow

Zudem muss Selenium als Browserprofil „*iexploreproxy“ benutzen, deshalb filtert der Testcase oben auch alle anderen IE-Profile aus.

Achtung: Vielleicht muss man trotzdem die neueste Snapsie-Bibliothek installieren (siehe unten). Ob das funktioniert, wenn ich diese wieder deinstalliere habe ich jetzt nicht getestet.

Achtung (2010-02-15): SnapsIE 0.2 muss auf jeden Fall installiert werden, damit Screenshots auch mit dem IE funktionieren!

FAIL: Screenshots mit dem IE

Das hier hat leider nicht funktioniert. Wie gesagt, wenn jemand weiß warum, bitte melden 🙂

  1. SnapsIE 0.2 herunterladen und installieren
  2. Das selenium-server-1.0.1.jar aus packen und
    • das core\lib\snapsie.js mit der version von SnapsIE 0.2 ersetzen
    • Die Datei core\scripts\selenium-api.js nach dem Vorschlag von Elf aus dem Selenium-Forum abändern. Ich hab die Änderung noch etwas erweitert, deshalb hier die kompette Methode:
//

Weitere Artikel in diesem Themenbereich

Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.

//
Jetzt für unseren Newsletter anmelden

Alles Wissenswerte auf einen Klick:
Unser Newsletter bietet dir die Möglichkeit, dich ohne großen Aufwand über die aktuellen Themen bei codecentric zu informieren.