Praktische Möglichkeit zum Erstellen einer verteilten Selenium-Grid-Umgebung mit Docker

Praktische Möglichkeit zum Erstellen einer verteilten Selenium-Grid-Umgebung mit Docker

Vor Kurzem musste ich die Zoom-Videokonferenz testen und simulieren, dass 100 Personen gleichzeitig an dem Meeting teilnehmen. Nachdem ich davon erfahren hatte, fand ich heraus, dass Zoom eine Möglichkeit bietet, dem Meeting direkt über einen URL-Link beizutreten (nur über den Chrome- oder FireFox-Browser, da das verwendete Protokoll WebRTC ist).

Wenn wir diesem Gedanken folgen, können wir die Selenium-Automatisierung nutzen, um mehrere Browserprozesse gleichzeitig zu starten, wobei jeder Prozess einen Videokonferenzbenutzer darstellt, um den Effekt der Simulation einer Mehrparteienkonferenz zu erzielen. Es gibt jedoch zwei Schwierigkeiten:

  • Es müssen mehrere Chrome-Browserprozesse gleichzeitig aktiv sein. Das Starten eines Chrome-Browserprozesses auf einem Computer verbraucht etwa 220 MB.
  • Probleme mit den Audio- und Videoquellen für Videokonferenzen.

Der Chrome-Browser bietet eine bessere Unterstützung für Audio- und Videoquellen von Videokonferenzen. In den Parametern zur Initialisierung des Chrome-Browsers im Selenium-Skript müssen Sie nur die folgende Konfiguration hinzufügen:

chrome_options.add_argument("--use-fake-ui-for-media-stream")
chrome_options.add_argument("--use-fake-device-for-media-stream")

Sie können virtuelles Video und Audio verwenden, nachdem Sie der Videokonferenz beigetreten sind. Es gibt jedoch ein Problem, das berücksichtigt werden muss. Es scheint eine Lücke in der Videoqualität zwischen diesem virtuellen Video und der realen Videokonferenz zu geben. Wird dies die Testergebnisse beeinflussen? Dieses Thema werden wir hier vorerst nicht diskutieren.

Das einzige Problem ist jetzt, wie 100 Chrome-Browserprozesse implementiert werden sollen. Sie denken vielleicht: Ist das nicht nur ein Ressourcenproblem? Wäre das Problem nicht durch das Hinzufügen eines Servers zu lösen? ! Aber wie planen wir Aufgaben, wenn wir über Serverressourcen verfügen? Glücklicherweise gibt es Selenium Grid, eine der drei Hauptkomponenten von Selenium, die speziell für die Durchführung verteilter Tests entwickelt wurde.

Daher wurde ein Testplan auf Basis von Selenium Grid entworfen:

  • Verwenden Sie einen Server als Hub, also als Master
  • Registrieren Sie die verbleibenden Maschinen als Knoten für die Hub-Maschine.
  • Verwenden Sie Multiprozess, um Selenium-Automatisierungsskripte lokal auszuführen (ich habe es in Python implementiert).

Gemäß den oben genannten Designideen ist es theoretisch möglich, die gleichzeitige Teilnahme von 100 Personen an einem Meeting zu simulieren. Als Nächstes beginnen wir offiziell damit, zu erkunden, wie man mit Docker eine verteilte Selenium Grid-Umgebung erstellt.

Das Selenium-JAR-Paket startet den Knoten direkt

Tatsächlich habe ich am Anfang das JAR-Paket verwendet, um den Knoten direkt zu starten. Bei einigen Knoten war das akzeptabel, aber bei zu vielen Knoten wäre es sehr problematisch gewesen. Wenn ich beispielsweise die Knoten neu starten wollte, musste ich sie alle manuell beenden und dann einen nach dem anderen starten.

Jede manuelle, sich wiederholende Arbeit kann per Skript ausgeführt werden. Also habe ich zwei Shell-Skripte geschrieben, ein Skript startet die entsprechende Anzahl von Knoten gemäß den übergebenen Parametern; das andere Skript beendet alle Knotenprozesse. Das Hauptskript wird unten angezeigt:

Obwohl es mithilfe von Skripten problemlos ausgeführt werden kann, ist es dennoch umständlich. Erstens werden nach dem Starten des Knotens viele Java-Prozesse hinzugefügt, und es ist unmöglich, die Protokolle eines einzelnen Knotens anzuzeigen, da die Protokolle aller Knoten gleichzeitig auf der Konsole gedruckt werden. Daher habe ich überlegt, Docker zur Verwaltung von Selenium-Grid-Knoten zu verwenden.

Starten Sie direkt mit dem Docker-Befehl

Auf GitHub gibt es ein fertiges Image: https://github.com/SeleniumHQ/docker-selenium. Anschließend listet das Beschreibungsdokument auch alle verfügbaren Image-Namen auf. Da ich hauptsächlich den Chrome-Browser verwende, habe ich die folgenden drei Images installiert: selenium/hub, selenium/node-chrome und selenium/node-chrome-debug. Das Image selenium/node-chrome-debug startet einen VNC-Server. Während der Skriptausführung können Sie sich lokal mit dem VNC-Server verbinden und den Skriptausführungsstatus des Servers über die Schnittstelle anzeigen. Verwenden Sie den Befehl:

$ Docker-Pull Selenium/Hub
$ Docker-Pull Selenium/Node-Chrome
$ Docker Pull Selenium/Node-Chrome-Debug

Der Befehl zum Starten des Hubs lautet wie folgt:

$ docker run -d -p 4444:4444 -e GRID_MAX_SESSION=100 --name hub selenium/hub

Der Befehl zum Starten des lokalen Knotens (Hub und Knoten befinden sich auf derselben Maschine) lautet wie folgt:

$ docker run -d -p 5555:5555 -e NODE_MAX_INSTANCES=5 -e NODE_MAX_SESSION=5 --shm-size=2g --link hub:hub --name node1 selenium/node-chrome

Der Befehl zum Starten eines Remote-Knotens (Hub und Knoten befinden sich nicht auf derselben Maschine) lautet wie folgt:

$ docker run -d -p port:5555 -e HUB_HOST=Remote-IP -e HUB_PORT=Remote-Port -e REMOTE_HOST=http://IP:Port -e NODE_MAX_INSTANCES=5 -e NODE_MAX_SESSION=5 --shm-size=2g --name node1 selenium/node-chrome

Hierbei ist zu beachten, dass die Startbefehle vieler Online-Tutorials alle darauf abzielen, dass sich Hub und Knoten auf derselben Maschine befinden. Wenn sich Hub und Knoten auf unterschiedlichen Maschinen befinden müssen, wird nach Befolgen des Online-Tutorials zwar beim Start kein Fehler auftreten, das Netzwerk zwischen Knoten und Hub wird jedoch getrennt.

Obwohl Sie die Protokolle eines einzelnen Knotens direkt mit dem Docker-Befehl anzeigen können, besteht dabei dasselbe Problem wie bei der Verwendung des JAR-Pakets: Das Starten mehrerer Knoten ist sehr umständlich und erfordert mehrere manuelle Befehle. Gibt es eine bessere Lösung? Natürlich können Sie Docker-Compose verwenden, um Docker-Container zu integrieren.

Docker-Compose starten

Docker Compose ist ein Befehlszeilentool von Docker, das zum Definieren und Ausführen von Anwendungen verwendet wird, die aus mehreren Containern bestehen. Dies entspricht dem Einfügen mehrerer Docker-Befehle in eine Datei und deren anschließende Ausführung mit einem Klick mithilfe von Docker-Compose.

Ebenso gibt es zwei Situationen:

Hub und Knoten befinden sich auf derselben Maschine

Sie können die folgende Konfigurationsdatei docker-compose.yml verwenden

Version: "3"
Leistungen:
 Selenium-Hub:
  Bild: Selenium/Hub
  Containername: Selenium-Hub
  Häfen:
   - „4444:4444“
  Umfeld:
   – GRID_MAX_SESSION=50
   -GRID_TIMEOUT=900
   - START_XVFB=false
 Chrom:
  Bild: Selenium/Node-Chrome
  Bände:
   - /dev/shm:/dev/shm
  hängt ab von:
   - Selen-Hub
  Umfeld:
   – HUB_HOST=Selenium-Hub
   – HUB_PORT=4444
   – NODE_MAX_INSTANCES = 5
   – NODE_MAX_SESSION=5

Führen Sie dann den Befehl in der Konsole aus:

$ docker-compose up -d //-d bedeutet, dass es im Hintergrund ausgeführt wird

Was ist, wenn Sie mehrere Knoten gleichzeitig starten möchten? Ganz einfach:

$ docker-compose up -d --scale chrome=num //num ist die Anzahl der zu startenden Knoten

Wenn Sie den Knoten herunterfahren möchten, können Sie den folgenden Befehl ausführen:

$ Docker-Compose nach unten

Hub und Knoten befinden sich nicht auf derselben Maschine

Sie können die folgende Konfigurationsdatei docker-compose.yml verwenden

Version: "3"
Leistungen:
 # Selen-Chrom-1
 Selenium-Chrome-Knoten-1:
  Bild: Selenium/Node-Chrome
  Bände:
   - /dev/shm:/dev/shm
  Häfen:
   - „5556:5555“
  Neustart: immer
  stdin_open: wahr
  Umfeld:
   HUB_HOST: hub_ip
   HUB_PORT: 4444
   NODE_MAX_INSTANCES: 5
   NODE_MAX_SESSION: 5
   REMOTE_HOST: http://nodeip:5556
   GRID_TIMEOUT: 60000
  shm_size: "2 GB"
 # Selen-Chrom-2
 Selenium-Chrome-Knoten-2:
  Bild: Selenium/Node-Chrome
  Bände:
   - /dev/shm:/dev/shm
  Häfen:
   - „5555:5555“
  Neustart: immer
  stdin_open: wahr
  Containername: Knoten1
  Umfeld:
   HUB_HOST: hub_ip
   HUB_PORT: 4444
   NODE_MAX_INSTANCES: 5
   NODE_MAX_SESSION: 5
   REMOTE_HOST: http://nodeip:5555
   GRID_TIMEOUT: 60000
  shm_size: "2 GB"
 # Selen-Chrom-3
 Selenium-Chrome-Knoten-3:
  Bild: Selenium/Node-Chrome
  Bände:
   - /dev/shm:/dev/shm
  Häfen:
   - „5557:5555“
  Neustart: immer
  stdin_open: wahr
  Umfeld:
   HUB_HOST: hub_ip
   HUB_PORT: 4444
   NODE_MAX_INSTANCES: 5
   NODE_MAX_SESSION: 5
   REMOTE_HOST: http://nodeip:5557
   GRID_TIMEOUT: 60000
  shm_size: "2 GB"
 # Selen-Chrom-4
 Selenium-Chrome-Knoten-4:
  Bild: Selenium/Node-Chrome
  Bände:
   - /dev/shm:/dev/shm
  Häfen:
   - „5558:5555“
  Neustart: immer
  stdin_open: wahr
  Umfeld:
   HUB_HOST: hub_ip
   HUB_PORT: 4444
   NODE_MAX_INSTANCES: 5
   NODE_MAX_SESSION: 5
   REMOTE_HOST: http://nodeip:5558
   GRID_TIMEOUT: 60000
  shm_size: "2 GB"

 # Selen-Chrom-5
 Selenium-Chrome-Knoten-5:
  Bild: Selenium/Node-Chrome
  Bände:
   - /dev/shm:/dev/shm
  Häfen:
   - „5559:5555“
  Neustart: immer
  stdin_open: wahr
  Umfeld:
   HUB_HOST: hub_ip
   HUB_PORT: 4444
   NODE_MAX_INSTANCES: 5
   NODE_MAX_SESSION: 5
   REMOTE_HOST: http://nodeip:5559
   GRID_TIMEOUT: 60000
  shm_size: "2 GB"

Der Befehl zum Starten des Knotens lautet (Voraussetzung ist, dass der Hub vorher gestartet werden muss):

$ docker-compose up -d

Der Befehl zum Herunterfahren eines Knotens lautet:

$ Docker-Compose nach unten

Vermächtnis

Wenn ich die Selenium Grid-Umgebung auf diese Weise aufbaue, kann der lokale Knoten normal ausgeführt werden, aber beim Remoteknoten tritt häufig eine Zeitüberschreitung auf. Das Knotennetzwerk, das über die Schnittstelle http://hub_ip:4444/grid/console angezeigt wird, ist jedoch vollständig verbunden.

Ich habe vorher einige Informationen überprüft und es scheint, dass ich Docker Swarm verwenden muss, ein Docker-Cluster-Verwaltungstool. Es abstrahiert mehrere Docker-Hosts zu einem Ganzen und verwaltet verschiedene Docker-Ressourcen auf diesen Docker-Hosts über einen einheitlichen Eingang. Ich habe es jedoch noch nicht untersucht. Wenn ich zu einer Schlussfolgerung über die Verwendung von Docker Swarm komme, werde ich einen Artikel schreiben und ihn mit Ihnen teilen.

Zusammenfassen

Es ist sehr praktisch, Docker zum Erstellen einer verteilten Selenium Grid-Umgebung zu verwenden. Grundsätzlich können Sie einen Knoten mit nur einer Befehlszeile starten oder herunterfahren. Ich hoffe, dieser Artikel kann Ihnen einige Ideen liefern und Ihnen bei der Lösung einiger Probleme in Ihrer täglichen Arbeit helfen.

Dies ist das Ende dieses Artikels über den praktischen Weg zum Aufbau einer verteilten Selenium-Grid-Umgebung mit Docker. Weitere relevante Inhalte zum Aufbau einer verteilten Selenium-Grid-Umgebung mit Docker finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Docker+Selenium-Methode zur Realisierung automatischer Gesundheitsberichte
  • Erstellen einer verteilten Selenium-Umgebung basierend auf Docker
  • So verwenden Sie Selenium + Testng, um Webautomatisierung in Docker zu realisieren
  • Beispielcode zum Testen einer Technologieanwendung basierend auf Docker+Selenium Grid

<<:  Fallstudie zum Zusammenführen von JavaScript-Arrays

>>:  Erweiterte Verwendung von Ansichten, Transaktionen, Indizes, Selbstverbindungen und Benutzerverwaltung in der MySQL-Datenbank – Beispielanalyse

Artikel    

Artikel empfehlen

Tutorial zum Herunterladen und Installieren von MySQL 8.0.12 WinX64

MySQL 8.0.12 Download- und Installations-Tutorial...

Zusammenfassung der häufigsten Fehler im Webdesign

Bei der Gestaltung einer Webseite passieren Desig...

Einführung, Installation und Verwendung von Hyper-V (detaillierte Abbildungen)

Vorwort: Als Gigant in der IT-Branche ist Microso...

So ändern Sie die Server-UUID in MySQL

Quelle des Problems: Wenn der Slave-Server der ge...

Detaillierte Beschreibung der HTML-Tabellenrahmensteuerung

Nur den oberen Rand anzeigen <table frame=above...