Powershell: Einführung in die Webbrowser Automation mit Selenium WebDriver

Mitglied: colinardo

back-to-topEinleitung


Diese Anleitung soll eine Einführung in den Einsatz der Browser Automatisierung mittels Selenium WebDriver und Powershell geben und anhand von kleinen Beispielen den Einsatz der gebotenen Funktionen aufzeigen. Mit der Selenium WebDriver Technik ist das Automatisieren von unterschiedlichen Browsern möglich darunter auch die drei Schwergewichte Google Chrome, Microsoft Edge, Mozilla Firefox auf die ich mich hier primär beziehen werde. Selenium Webdriver gibt es für die Nutzung unter diversen Skript- und Programmiersprachen darunter auch als .NET Bibliothek die in diesem Beitrag Verwendung findet.

back-to-topGründe für die Nutzung einer Browserautomatisierung


back-to-topExtrahieren von Daten

In der Regel ist es ja so das man Aufgaben wie das Extrahieren von Daten auf Webseiten schneller und einfacher mittels der CMDLets Invoke-WebRequest oder Invoke-Restmethod extrahieren lassen. Aber es gibt immer mehr Webseiten die Ihre Daten dynamisch zusammenstellen und diese bspw. nur mit aktivem JavaScript Ihre Inhalte auch preisgeben. Wenn es also weder eine API zum Abfragen von Daten gibt, oder man keine direkten Ajax-Pfade mit den Developer-Tools der Browser ausfindig machen kann, oder sich deren Umgang schwierig bis unmöglich gestaltet, bleibt einem oft nur noch die Browser-Automatisierung bei der der Browser quasi mit Befehlen ferngesteuert wird.
Lange benutzte man dazu unter Windows den Internet-Explorer, da dieser ein COM-Objekt zur Verfügung stellt mit dem sich der Browser mit etlichen Skript- und Programmiersprachen fernsteuern lässt. Da aber mittlerweile viele Webseiten einfach keine vernünftige Unterstützung mehr für den IE bieten, dieser nicht mehr alle aktuellen Techniken einsetzt und der IE in naher Zukunft sowieso abgekündigt (R.I.P) ist, sollte nun wirklich die Zeit gekommen sein das man diesbezüglich auf aktuellere Pferde setzen sollte. Das war auch einer der Gründe dafür das ich diesen Beitrag hier schreibe, es soll den Umstieg von der IE Automation hin zu Selenium etwas erleichtern.

back-to-topSimulieren von realen Usern

Ein anderes Feld ist das Simulieren von realen Usern und das automatisierte Testen von Webseiten. Das kann bspw. dazu dienen ob die eigene Webseite auch unter der Last von vielen Usern noch so funktioniert wie vorgesehen, wie das UI reagiert, etc. pp. Dafür bietet sich Selenium Webdriver ebenfalls an.

back-to-topVoraussetzungen und benötigte Komponenten für die Nutzung in der Powershell

Selenium Webdriver besteht aus mehreren Komponenten. Einmal benötigen wir die Selenium.WebDriver .NET Bibliothek als DLL und dazu den passenden Driver (eine EXE) abhängig von dem zu automatisierenden Browser. Der Driver ist oftmals versionsspezifisch, so dass ein Driver der für Chrome 92 geschaffen wurde kein installiertes Chrome 94 fernsteuern kann.

Die in diesem Beitrag verwendeten Driver sind: ChromeDriver, MSEdgeDriver, FirefoxDriver

Der Browser den man fernsteuern möchte muss zudem auf dem System installiert sein.

Um euch das Herunterladen und laden der Assemblies für den Anfang zu erleichtern habe ich all das in eine Funktion Namens Create-Browser gepackt welche je nachdem welchen Browser man nutzen möchte die benötigten DLLs bei der ersten Verwendung entweder in das Skriptverzeichnis (wenn das Skript schon gespeichert ist) oder in das TEMP-Verzeichnis (wenn z.B. in der ISE nur ausprobiert wird) herunterlädt und die Bibliothek via Add-Type in die Session importiert. Sind die Driver und die DLL bereits im Skript- oder TEMP-Verzeichnis wird natürlich kein erneuter Download angestoßen!

back-to-topCreate-Browser: Grundfunktion zum Erzeugen einer Browser-Instanz


Für den Anfang müssen wir ein WebDriver-Objekt des jeweiligen Browsers erzeugen auf dem anschließend alles andere aufbaut. Das ist für alle Browser ähnlich, es gibt aber ein paar kleine Detailunterschiede. (Mit den Details will ich euch jetzt nicht behelligen, das lässt sich im folgenden CMDLet selbst nachlesen.)
Die Erzeugung des Webdriver-Services und des Driver-Objekts stelle ich euch mittels folgender Funktion zur Verfügung. Sie unterstützt die zum Zeitpunkt der Erstellung dieses Beitrags aktuellen Major Versionen der o.g. Browser. Sollte eine ältere oder neuere Version zum Einsatz kommen die nicht in der Funktion hinterlegt ist kann der Funktion die zu nutzende Driver-Version die auf Nuget unter den oben genannte Links zu den Drivern als verfügbar gelistet wird mit dem Parameter -driverversion <Versionstring> mitgegeben werden.

back-to-topErzeugen eines Browser-Objekts


Der erste Schritt ist nun das Erzeugen des jeweiligen Browser-Objekts. Man muss das obige CMDLet immer als erstes im Skript platzieren damit man sie nutzen kann. Um nun den jeweiligen Browser anzugeben besitzt die Create-Browser]] Funktion den Parameter -browser.
Eingebaut sind die folgenden Browser Google Chrome, Microsoft Edge (chromium based) und Mozilla Firefox.
Valide Parameter-Werte für den Parameter lauten: {{Chrome, Edge, Firefox
.

Beispiel für das Erzeugen eines Chrome-Browsers:

Hat das geklappt war das eigentlich schon die halbe Miete und das Browser-Fenster sollte auf dem Desktop erscheinen.

Die Funktion hat noch einen weiteren Boolean-Parameter namens -HideCommandPrompt, welcher das normalerweise erscheinende Kommandozeilenfenster des Webdrivers per Default unterdrückt, möchte man es sehen wenn man bspw. Debug-Ausgaben sehen möchte setzt man diesen Parameter auf $false mittels -HideCommandPrompt $false.
Ebenso kann eine spezielle WebDriver-Version mittel -driverversion <Versionstring> angeben werden die genutzt werden soll, sollte das nötig sein, siehe Hinweis weiter oben.

In den nun folgenden Code-Schnippseln werde ich der Verständlichkeit halber die Variable $browser weiterhin beibehalten und das Erzeugen des Browser-Objekts nicht erneut wiederholen, ich gehe also davon aus das Ihr das $browser Objekt in euren Skripten bereits vor dem Ausprobieren der folgenden Funktionen bereits erzeugt habt.

back-to-topBrowser-Fenster anpassen


Die Anpassung des Browser-Fensters lässt sich mit den folgenden Funktionen und Eigenschaften steuern:

back-to-topx/y Position festlegen



back-to-topGröße des Fensters in Pixeln festlegen (Breite,Höhe)



back-to-topFenster maximieren, minimieren, Fullscreen



back-to-topNavigieren zu URLs


Das Öffnen von Webseiten bzw. URLs lässt sich nun folgendermaßen erledigen:


Man legt die URL in der Eigenschaft URL fest. Das zurückgegebene Objekt der Navigate() Funktion bietet seinerseits weitere Funktionen um im Fenster zu vor und zurück zu navigieren oder die aktuelle Seite zu aktualisieren, es ist also meist eine gute Idee das Ergebnis einer Variablen zuzuweisen wenn man es später wieder benötigt.
Alternativ geht also auch so ein Konstrukt um zu einer neuen Seite zu navigieren

back-to-topSchließen/Beenden des Browsers


Das Beenden der Browser-Session erledigt sich mit der für sich sprechenden Funktion

Wichtig! Das sollte man am Ende einer Session nicht vergessen auszuführen, da ansonsten der WebDriver im Hintergrund (unsichtbar) weiter läuft auch wenn die Powershell-Session beendet wird. Lässt sich die heruntergeladenen EXE des WebDriver nicht manuell löschen weil sie noch im Zugriff ist ist das ein Zeichen dafür das eine Instanz des WebDrivers noch im Hintergrund läuft oder die PS Session nicht richtig abgeschlossen wurde oder hängt.

back-to-topSeitenquelltext extrahieren



back-to-topInformationen über Cookies


Cookies der aktuell aufgerufenen Seite erhält man mittels

back-to-topScreenshot des aktuell sichtbaren Seiteninhalts erzeugen


Von dem aktuell sichtbaren Fenster lässt sich ein Screenshot erstellen, und lässt sich entweder direkt als Datei in diversen Dateiformaten (.NET Standardformate) speichern ...
oder wenn man das Bild direkt als weiterverarbeiten möchte als ByteArray ...
oder Base64 enkodiert ...

back-to-topAusführen von JavaScript-Funktionen oder eigenem JavaScript-Code


Möchte man eine Funktion oder eigenen JavaScript Code im Kontext der Seite aufrufen lässt sich dies so erreichen

back-to-topSuchen/Finden von bestimmten Elementen auf Webseiten


Ein wichtiges Thema ist natürlich das referenzieren von bestimmten Elementen auf Webseiten. Bevor man etwas mit einem Objekt macht muss man es erst mal anhand unterschiedlicher Kriterien finden. Dazu bietet Selenium eine große Vielfalt an Funktionen mit der sich wirklich alles effektiv finden lässt.

Hier eine kleine Übersicht jeweils für das Finden von einem oder mehreren Elementen

Die Funktionen sollten in der Regel für sich sprechen und man übergibt ihnen jeweils einen String von dem Element und dem Typ das man sucht. Daher fasse ich diese hier in Beispielen zusammen


Tipp: Bei der Entwicklung seiner Skripte sind die DeveloperTools der Browser (meist erreichbar mittel F12) ein fast unverzichtbares Werkzeug um die Elemente im Quellcode der Seite ausfindig zu machen. Ein pratisches Tool dabei ist das "Locate" Tool das man in den Developer Tools oben ganz links in der Ecke findet:

screenshot

Dieses klickt man an und dann fährt man mit dem Mauszeiger auf das Element auf das man sich beziehen möchte. Daraufhin wird automatisch die Stelle des Elements im Quellcode markiert. Man braucht die Elemente also nicht lanngwierig manuell suchen.

FindElementByXPath

Nicht jeder wird wohl etwas mit der Funktion FindElementsByXPath() anfangen können. Wer aber schon mal mit XPath gearbeitet hat weiß die Selektionssprachensyntax zu schätzen.
Das sieht dann bspw. so aus:
Der Filterstring sucht in dem Beispiel einen DIV Element mit dem Klassennamen teaser-question-list-row und sucht dann darauf folgend SPAN Elemente egal wie tief sie verschachtelt sind dessen Klassenname teaser-question-autor lautet. Von diesen gefundenen Elementen (sofern es welche gibt) wird dann der enthaltene Text ausgegeben. Damit lassen sich sehr effektiv verschachtelte Elemente sehr detailliert filtern.
Wer mehr über die XPath Syntax erfahren möchte kann sich z.B. auf folgender Seite schlau machen
https://www.w3schools.com/xml/xpath_syntax.asp

back-to-topEine Serie von Befehlen zusammenhängend ausführen


Oftmals müssen eine Reihe von Aktionen zusammenhängend oder auch wiederholend durchgeführt werden. Dafür bietet Selenium ein Objekt Namens Action an mit dem sich so eine Sequenz erstellen lässt und dann mit einem einzigen Befehl ausführen lässt, ähnlich wie eine Function in Powershell.
Das sieht dann bspw. so aus


Um noch zu verdeutlichen was das Actions-Objekt selbst an möglichen Aktionen bietet, nachfolgend eine Auflistung der verfügbaren Methoden der Klasse



back-to-topPraxis-Beispiel: Einloggen auf einer Webseite


Oftmals liegen Inhalte hinter Logins versteckt, es ist also oftmals eine der ersten Aufgaben dies abzuarbeiten. Da jeder Login anders aufgebaut ist kann es hier natürlich kein Rezept für alle Logins sein. Als Beispiel verwende hier der Einfachheit den Login in unserem Administrator Forum. Dies sähe dann etwa so aus (Funktionsfähig zum aktuellen Zeitpunkt beim Schreiben des Artikels):

back-to-topPraxis-Beispiel: Extrahieren von sich wiederholenden Elementen


Um die Nutzung der Funktionen zum Suchen von Elementen zu demonstieren und wie man damit sich wiederholende Elemente wie bspw. die hier im Forum gelisteten Posts extrahiert, nehme ich mal die Seite unter Aktuell hier im Forum als Demonstrationsobjekt]


Das Ergebnis ist dann ein Array aus Objekten das sich dann sehr gut weiterverarbeiten lässt

back-to-topAnhang


back-to-topEigenschaften welche Objekte haben die sich mit den "Find*" Funktionen referenzieren lassen


Das Ergebnis einer der oben aufgeführten Suchaktionen für Elemente auf einer Webseite ist/sind eines oder mehrere Objekte der Klasse OpenQA.Selenium.Remote.RemoteWebElement.

Übersicht welche Eigenschaften und Funktionen solche Elemente bieten:

Jedes Element bietet also unter anderem erneut die oben aufgeführten "Find*" Funktionen um die Suche auf die Elemente zu beschränken die sich innerhalb des/der gefundenen Elemente befinden. Weitere wichtige Funktionen sind GetAttribute() mit der sich der Inhalt von Element-Attributen wie bspw. den Link aus dem "href" Attribut zu extrahieren lässt:
Oder auch Submit() zum übermitteln von Formularinhalten um nur zwei davon zu nennen.

back-to-topWeiterführende Links



Für Powershell Neulinge ein Powershell Link-Leitfaden für Anfänger


So, das war es für's erste. Sollte jemandem noch ein Topic zum Thema ins Gedächtnis rücken das er hier behandelt haben möchte kann er das gerne in den Kommentaren kund tun. Ich werden dann wenn die Zeit es zulässt, gerne Ergänzungen im Beitrag vornehmen.

Ich wünsche euch nun viel Spaß bei den ersten Ausflügen in die Browser-Automatisierung mit Selenium.

Gruß @colinardo

Content-Key: 1197173647

Url: https://administrator.de/contentid/1197173647

Ausgedruckt am: 23.09.2021 um 11:09 Uhr

Mitglied: notmyjob
notmyjob 27.08.2021 um 06:00:42 Uhr
Goto Top
Hi colinardo,

Aktuell verwende ich Selenium um vorher ausgezeichnete Tests automatisch per Pipeline nach jedem Commit auszuführen, um beispielsweise zu testen ob bestimmte Funktionen im UI beschädigt wurden. Aber die Verwendung mit der Powershell sieht sehr interessant aus, danke.

Wirst du in Zukunft noch etwas auf die Lasttests mit Selenium eingehen? Aktuell verwende ich dafür eine Kombination aus k6 (simulieren von virtuellen Usern z.B. 1000 User) und Selenium (z.B. automatisches einloggen in die Anwendung und messen wie lange dies dauert).


VG
Mitglied: colinardo
colinardo 27.08.2021 aktualisiert um 07:23:11 Uhr
Goto Top
Servus @notmyjob,
könnte man machen, mal sehen ob noch in diesem Beitrag, vielleicht doch ein Thema für einen neuen.

VG
Heiß diskutierte Beiträge
question
Unternehmensnetzwerk aufbauenbluelightVor 1 TagFrageNetzwerke12 Kommentare

Moin zusammen, erstmal vielen Dank an der Stelle, dass mir beim letzten mal so super geholfen wurde! Aktuelle Situation: -> 5 VMs bei Netcup -> ...

question
Netzwerkdosen verbindenR3nN1979Vor 1 TagFrageInternet7 Kommentare

Hallo, Ich ziehe bald um, und benötige dabei Hilfe, wie ich Netzwerkdosen miteinander verbinden kann. Habe überhaupt keine Ahnung davon, aber mir kann jemand von ...

general
Endpoint AV für FirmenumgebungKauzigVor 1 TagAllgemeinErkennung und -Abwehr18 Kommentare

Hallo, aktuell bin ich am Suchen einer Endpoint AV für meine Firmenumgebung wichtig wäre mir ein zentrales Management sowie ggf. sogar ein Patch System. Aktuell ...

question
Ein Domänenbenutzer für alle MitarbeiterMarabuntaVor 18 StundenFrageWindows Userverwaltung6 Kommentare

Hi, ist es möglich/sinnvoll bzw. wie ist es lizenztechnisch, wenn es einen Domänen-Benutzer für alle Mitarbeiter(10) gibt, diese Benutzen eine Branchensoftware in der jeder eigene ...

question
Einarbeitung VPN und entsprechende RouterFrankNVor 1 TagFrageRouter & Routing8 Kommentare

Hallo zusammen, ich bin am Einarbeiten in das Thema VPN-Router. Ich suche ein Gerät, das es ermöglicht, ca. 50 VPN-Tunnel zu verwalten für eine Zentrale ...

question
Powershell Logon Script Problematikjoe2017Vor 1 TagFrageBatch & Shell19 Kommentare

Schönen guten Morgen, ich habe eine Frage an die Spezialisten hier. Denn ich bin gerade ratlos und am verzweifeln. Ich habe in meinem Domain Controler ...

question
Bewertung von Rechnern (Gewichtung von CPU, RAM und Festspeicher)SarekHLVor 1 TagFrageBenchmarks11 Kommentare

Hallo zusammen, ich habe hier eine Aufstellung verschiedener Rechner mit - Leistungsbewertung der CPU mit CPUMark (Quelle: - Größe Arbeitsspeicher - SSD oder HDD Wie ...

question
Was ist die beste Lösung für servergespeicherte Profile für 10 Rechner?Yan2021Vor 12 StundenFrageNetzwerke9 Kommentare

Hallo liebe Admin-User, in einem anderen Thread ging es um die Sicherung von Dienst-PCs per Image. Daraus entstand dann eine Diskussion über servergespeicherte Profile. Da ...