Einmal Selenium mit Session 0, bitte!

Seit einiger Zeit setze ich erfolgreich Selenium zur Testautomatisierung ein. In Verbindung mit Approval Tests eine sehr feine Sache. Um Selenium selbst soll es aber nur am Rande gehen. Stattdessen um die mysteriöse Session 0 von Windows.

Der Selenium-Server ist effektiv eine Java-Kommendozeilenanwendung, die z.B. so gestartet werden kann:

java -jar "C:\Selenium\selenium-server-standalone-2.53.0.jar"

Startet man den Server so manuell über die Kommendozeile, kann der Server remote angesprochen werden und lokal wird z.B. ein Firefox-Fenster vom Selenium-Server geöffnet. Einwandfrei!

Gehen wir davon aus, dass der Host-Rechner ab und zu einmal neu gestartet wird. Klar ist, dass ein manuelles Starten des Selenium-Servers wohl kaum in Frage kommt. Nun ist aber zu klären, wie man Selenium automatisch startet.

Starten via Windows-Task?

Zunächst dachte ich, dass es sich um ein triviales Problem handelt, was mit einem Task im Windows-Scheduler leicht erledigt wäre. Gesagt getan, habe ich eine Aufgabe erstellt, die beim Starten des Computers ausgeführt wird und zwar unter dem Account des lokalen Nutzers, mit dem ich Selenium manuell erfolgreich gestartet habe.

Zunächst einmal funktionierte das prima. Der Selenium-Server wurde gestartet und Tests konnten damit erfolgreich ausgeführt werden. Das erste kleine Warnzeichen stellte sich ein, als ich feststellte, dass der Browser-Inhalt unter einem Background-Task minimal anders aussah als bei der manuell gestarteten Variante. Ich muss dazu sagen, dass ich die Approval Tests benutze, um den kompletten Fensterinhalt des Browsers abzufotografieren und mit einer genehmigten Version zu vergleichen. Ist auch nur ein Pixel anders, muss manuell nachgeprüft werden.

Nun dachte ich zunächst, es ist zwar ärgerlich, dass Selenium via Background-Task von der manuell gestarteten Variante abweicht, aber sei es drum, wenn es immer im Hintergrund läuft, dann passt es wieder.

So habe ich nun frohen Mutes hunderte von Approval Tests erzeugt, nur um an einer Stelle festzustellen, dass die Scrollbar merkwürdig aussieht. So wie unter Windows 2000.

Nun geht es in dem Projekt um Pixelperfektheit. Langsam dämmerte es mir, dass hier was faul war. Zu dem Zeitpunkt war noch nicht klar was. Ich hatte noch die Hoffnung, dass irgendwo eine Firefox-Einstellung “Classic Mode” gesetzt war, die man vielleicht irgendwo ändern konnte. Doch ich fand nichts. Vorerst musste erst einmal wieder das manuelle Starten und Überwachen des Selenium-Servers herhalten.

Starten via Windows-Service?

Nun versuchte ich als nächsten Ansatz Selenium als Windows Service zu starten. Da java.exe selbst kein Windows-Service ist, musste erstmal ein Wrapper gefunden werden. NSSM tat da seinen Dienst. Aber auch hier exakt das selbe Verhalten wie bei dem Background-Task. Die Scrollbar sah merkwürdig aus. So wie unter Windows 2000.

Unter dem Schlagwort Windows Service + GUI bin ich schnell auf Artikel gestoßen, die erklären, warum das eine schlechte Idee ist.

Moderne Windows und Session 0

In Windows gibt es eine mysteriöse Session 0. Unter dieser Session laufen alle Services, aber auch Background-Tasks. Rein theoretisch ist Session 0 eine ganz normale Sitzung und unter alten Windows wurde der erste Nutzer sogar unter der Session 0 eingeloggt. Hatte ein Dienstprozess in Session 0 einen Dialog geöffnet, dann wurde dieser dem Nutzer effektiv angezeigt!

Aus Sicherheitsgründen wurde aber ab Windows Vista die Isolierung von Session 0 eingeführt. D.h. Nutzer können nicht mit der Session 0 GUI interagieren.

Eine ausführlicher Erklärung findet sich hier und hier.

Gegen Isolierung selbst hätte ich nichts, nun sagt aber Microsoft, dass man sich in Session 0 nicht einmal sicher sein kann, welche Bildschirmauflösung intern definiert ist. Session 0 lädt scheinbar gewisse Treiber nicht. Jedenfalls wird die GUI nicht im Aero-Stil (oder wie auch immer das mittlerweile in Windows 10 heißt) dargestellt, sondern eben “klassisch”.

Man kann unter dieser Session 0 GUIs ausführen und im Fall von Firefox ist das Resultat gar nicht so schlecht (wenn man z.B. keine Scrollbars hat). Aber davon sollte man sich nicht irreführen lassen. Zumindest im Fall von Selenium-Tests gilt: man darf keine GUIs in Session 0 ausführen!

Alternativ und einfach richtig

Die einzige und richtige Alternative, um den Selenium-Server zu starten, basiert auf einem weiteren, etwas versteckten Windows-Feature. Dem Automatischen Login.

Alle Windowssysteme unterstützen als Bequemlichkeitsfeature die Möglichkeit einen User mit einem bestimmtem Passwort automatisch einzuloggen. Kiosk-Systeme benutzen so etwas häufig. Normalerweise muss man das in der Registry einstellen. Am einfachsten geht dies mit dem Tool AutoLogon von Sysinternals.

Hat man dies eingestellt, muss man nur noch mit dem Windows-Scheduler einen Task erstellen, der beim Anmelden ausgeführt wird und Selenium startet.

Einwandfrei! Nun wird Selenium automatisch in Session 1 gestartet!

Eigentlich eine ziemlich einfache Sache.

Liebes Selenium…

Dank dir habe ich sehr viel über Windows gelernt, sogar was mit dem guten alten Windows XP noch alles ging! Lieber wäre es mir natürlich gewesen, die Lösung mit dem automatischen Login wäre einfach in der Anleitung gestanden (oder zumindest in irgendeinem Forum diskutiert worden). Aber wahrscheinlich ist das Automatisieren von Browsern unter Windows exotisch. Mein Fehler.