Beispielcode zum Testen einer Technologieanwendung basierend auf Docker+Selenium Grid

Beispielcode zum Testen einer Technologieanwendung basierend auf Docker+Selenium Grid

Einführung in Selenium Grid

Obwohl einige neue Funktionen von Selenium Grid in der zukünftig erscheinenden Version von Selenium 4.0 beschrieben werden, gibt es derzeit nicht viel offizielle, ausführliche Dokumentation als Referenz. Daher wird in diesem Buch zur Erklärung immer noch die derzeit weit verbreitete Version von Selenium Grid kombiniert.

Wie auf der offiziellen Website beschrieben, handelt es sich bei Selenium Grid um einen intelligenten Proxyserver, der es Selenium-Tests ermöglicht, Befehle an Remote-Webbrowser-Instanzen weiterzuleiten. Sein Zweck besteht darin, eine einfache Möglichkeit bereitzustellen, Tests parallel auf mehreren Maschinen auszuführen. Bei Selenium Grid fungiert ein Server als Hub, der JSON-formatierte Testbefehle an einen oder mehrere registrierte Grid-Knoten weiterleitet, um Zugriff auf Remote-Browserinstanzen zu erhalten. Der Hub verfügt über eine Liste registrierter Server, auf die er Zugriff hat, und ermöglicht die Steuerung dieser Instanzen. Selenium Grid ermöglicht es uns, Tests parallel auf mehreren Maschinen auszuführen und verschiedene Browserversionen und Browserkonfigurationen zentral zu verwalten.

Abbildung 1 Selenium Grid-Komponentenstrukturdiagramm

Wie in Abbildung 1 dargestellt, besteht Selenium Grid hauptsächlich aus zwei Teilen, nämlich: Hub und Nodes. Sie können Python, Java, C# und andere Sprachen verwenden, um Selenium-Testskripte zu schreiben. Jedes Selenium Grid hat nur einen Hub. Das Client-Skript kann angeben, dass eine Verbindung zum Hub (Masterknoten oder Hub) hergestellt werden soll. Der Hub empfängt die Testlaufanforderung des Client-Skripts und verteilt diese Testanforderungen an einen oder mehrere registrierte Knoten, um die Laufergebnisse auszuführen und zu erfassen. Im Selenium Grid können ein oder mehrere Knoten vorhanden sein. Die Maschinen, die als Knoten fungieren, müssen nicht über dasselbe Betriebssystem oder denselben Browser wie der Hub oder andere Knoten verfügen. Das heißt, auf einem Node-Knoten kann das Windows-Betriebssystem ausgeführt werden und Internet Explorer ist auf dem System installiert. Auf einem anderen Node-Knoten kann das Linux- oder Mac-Betriebssystem ausgeführt werden und die darauf installierten Browser können Firefox, Safari, Chrome usw. sein. Die Konfiguration und Prüfung dieser Knotenknoten hängt von den Kompatibilitätstests der Betriebssysteme und Browserversionen ab, die Sie durchführen möchten. Treffen Sie bei der tatsächlichen Arbeit Ihre Wahl basierend auf dem Testausführungsplan und der Teststrategie.

Selenium Grid-Konfiguration basierend auf Docker

Die relevanten Image-Dateien von Selenium Grid sind im Docker Hub verfügbar, wie in Abbildung 2 dargestellt.

Abbildung 2 Selenium Grid-bezogene Bildressourcen

Hier verwenden wir den Befehl „docker pull“, um diese drei Bilder jeweils herunterzuladen. Die entsprechenden Pull-Befehle lauten wie folgt:

Docker-Pull Selenium/Hub
Docker-Pull Selenium/Node-Chrome
Docker-Pull Selenium/Node-Firefox

Nachdem die Image-Datei lokal abgerufen wurde, können Sie den Befehl „Docker Images“ verwenden, um die Informationen des zugehörigen Images anzuzeigen, wie in Abbildung 3 dargestellt.

Abbildung 3 Selenium Grid-bezogene Bildinformationen

Lassen Sie uns hier die Konnektivität zwischen dem Hub und den Node-Knoten testen.

Starten Sie den Hub, wie in Abbildung 4 gezeigt.

Abbildung 4 Erstellen und Starten des Hub-Containers

Erstellen und starten Sie den Chromenode-Containerknoten, wie in Abbildung 5 dargestellt.

Abbildung 5 Erstellen und Starten des Chromenode-Containerknotens

Erstellen und starten Sie den Firefoxnode-Containerknoten, wie in Abbildung 6 dargestellt.

Abbildung 6 Erstellen und Starten des Firefoxnode-Containerknotens

Geben Sie als Nächstes "http://localhost:4444/grid/console" in die Adressleiste des lokalen Browsers ein, d. h. öffnen Sie die Selenium Grid-Konsole. Die in Abbildung 7 gezeigte Seite wird angezeigt.

Abbildung 7 Grid-Konsoleninformationen

Wie in Abbildung 7 dargestellt, ist die aktuelle Version von Selenium Grid 3.141.59. Die beiden mit dem Hub verbundenen Knoten sind das Linux-Betriebssystem mit IP 172.17.0.4 unter Verwendung des Browsers Firefox 75.0 und das Linux-Betriebssystem mit IP 172.17.0.3 unter Verwendung des Browsers Chrome 81.0.4044.92. Standardmäßig verwendet der Hub-Knoten Port 4444 und der Node-Knoten in diesem Beispiel Port 5555. Wenn im selben Container Portkonflikte auftreten, müssen Sie andere Ports entsprechend der tatsächlichen Situation anpassen und festlegen, um Portkonflikte zu vermeiden.

Falldemonstration basierend auf Docker+Selenium Grid

Als Nächstes werde ich den Bing-Suchfall verwenden, um Kompatibilitätstests in den Browsern Chrome und Firefox durchzuführen. Was denken Sie, nachdem Sie etwas über Selenium, Docker und Selenium Grid gelernt haben? Ist es möglich, mithilfe von Docker+Selenium Grid Kompatibilitätstests auf Basis verschiedener Browser durchzuführen? Ja, das ist tatsächlich eine gute Idee.

Aber was müssen Sie tun, damit Ihre Selenium-Testskripte in verschiedenen Browsern ausgeführt werden?

Sie müssen einige Änderungen am Skriptdesign vornehmen. Normalerweise müssen Sie beim Ausführen des Skripts den Host und den Port angeben. Das Skript sieht dann folgendermaßen aus:

Importzeit
von Selenium importiere Webtreiber
von selenium.webdriver.common.desired_capabilities importiere DesiredCapabilities
 
Treiber = Webtreiber.Remote(
    command_executor = 'http://192.168.1.102:4444/wd/hub',
    gewünschte_Funktionen = GewünschteFunktionen.CHROME)
 
Basis-URL = "https://cn.bing.com"
Treiber.get(Basis-URL)
Treiber.save_screenshot('chrome.png')
Treiber.schließen()

Normalerweise müssen Sie bei der Ausführung nur die Adresse des Hubs angeben (z. B.: http://192.168.1.102:4444/wd/hub). Die IP-Adresse des Hostcomputers wird in Abbildung 8 angezeigt. Der Hub weist das Skript zur Ausführung automatisch dem Node-Knoten zu.

Abbildung 8 IP-Adressinformationen des Hostcomputers

- command_executor-Parameter: Dieser Parameter ist optional und kann eine Remote-Server-URL-Zeichenfolge oder eine benutzerdefinierte Remote-Verbindung angeben. Der Standardwert ist „http://127.0.0.1:4444/wd/hub“.

- Parameter „wanted_capabilities“: Dieser Parameter ist erforderlich und kann verwendet werden, um beim Starten einer Browser-Sitzung ein Wörterbuch der angeforderten Funktionen zu konfigurieren. Hier wenden wir „DesiredCapabilities.CHROME“ an. Sie können den entsprechenden Quellcode wie unten gezeigt anzeigen.

Klasse DesiredCapabilities (Objekt):
    """
    Satz standardmäßig unterstützter gewünschter Funktionen.
    Verwenden Sie dies als Ausgangspunkt für die Erstellung eines gewünschten Fähigkeitenobjekts für
    Anfordern von Remote-Webtreibern zum Herstellen einer Verbindung zum Selenium-Server oder Selenium-Grid.
    Anwendungsbeispiel:
        von Selenium importiere Webtreiber
        selenium_grid_url = "http://198.0.0.1:4444/wd/hub"
        # Erstellen Sie als Ausgangspunkt ein gewünschtes Fähigkeitenobjekt.
        Fähigkeiten = Gewünschte Fähigkeiten.FIREFOX.copy()
        Fähigkeiten['Plattform'] = "WINDOWS"
        Fähigkeiten['Version'] = "10"
        # Instanziieren Sie eine Instanz von Remote WebDriver mit den gewünschten Funktionen.
        Treiber = Webtreiber.Remote(gewünschte_Funktionen=Funktionen,
                                  Befehlszeilenschnittstelle = Selenium_Grid_URL)
    Hinweis: Verwenden Sie immer '.copy()' für das DesiredCapabilities-Objekt, um die Seiten
    Auswirkungen der Änderung der globalen Klasseninstanz.
    """
 
    FIREFOX = {
        "Browsername": "Firefox",
        "acceptInsecureCerts": Wahr,
    }
 
    INTERNETEXPLORER = {
        "Browsername": "Internet Explorer",
        "version": "",
        "Plattform": "WINDOWS",
    }
 
    RAND = {
        "browserName": "MicrosoftEdge",
        "version": "",
        "Plattform": "JEDE"
    }
 
    CHROME = {
        "Browsername": "Chrome",
        "version": "",
        "Plattform": "JEDE",
    }
 
    OPER = {
        "Browsername": "Opera",
        "version": "",
        "Plattform": "JEDE",
    }
 
    SAFARI = {
        "Browsername": "Safari",
        "version": "",
        "Plattform": "MAC",
    }
 
    HTMLUNIT = {
        "Browsername": "htmlunit",
        "version": "",
        "Plattform": "JEDE",
    }
 
    HTMLUNITWITHJS = {
        "Browsername": "htmlunit",
        "Version": "Firefox",
        "Plattform": "JEDE",
        "javascriptEnabled": Wahr,
    }
 
    IPHONE = {
        "browserName": "iPhone",
        "version": "",
        "Plattform": "MAC",
    }
 
    IPAD = {
        "browserName": "iPad",
        "version": "",
        "Plattform": "MAC",
    }
 
    ANDROID = {
        "Browsername": "Android",
        "version": "",
        "Plattform": "ANDROID",
    }
 
    PHANTOMJS = {
        "Browsername": "phantomjs",
        "version": "",
        "Plattform": "JEDE",
        "javascriptEnabled": Wahr,
    }
 
    WEBKITGTK = {
        "browserName": "MiniBrowser",
        "version": "",
        "Plattform": "JEDE",
    }
 
    WPEWEBKIT = {
        "browserName": "MiniBrowser",
        "version": "",
        "Plattform": "JEDE",
    }

Aus dem Quellcode der Klasse DesiredCapabilities können wir erkennen, dass „DesiredCapabilities.CHROME“ ein von dieser Klasse definiertes Wörterbuchobjekt ist.

Hier verwendet der Autor einen Multithread-Ansatz, um Bing-Suchdienste in den Browsern Chrome bzw. Firefox zu implementieren. Die entsprechenden Skripts lauten wie folgt.

Inhalt der Datei Grid_Test.py:

vom Threading Thread importieren
von Selenium importiere Webtreiber
von Zeitimport Schlaf, ctime
von selenium.webdriver.common.by importiere von
 
def Test_Bing(Host, Browser):
    caps = {'browserName': Browser}  
    Treiber = Webtreiber.Remote(Befehlsausführungsfunktion = Host, gewünschte Funktionen = Caps)
    Treiber.get('http://www.bing.com')
    driver.find_element(By.ID,'sb_form_q').send_keys('asynchrone Community')
    Treiber.find_element(Nach.ID,'sb_form_go').klick()
    Bildname = Browser + '_result' + '.png'
    driver.save_screenshot(Bildname)
    assert ('Keine entsprechenden Ergebnisse' nicht in driver.page_source)
    Schlaf(2)
    Treiber.schließen()
 
wenn __name__ == '__main__':
    Stück = {'http://192.168.1.102:4444/wd/hub': 'Chrom',
             'http://localhost:4444/wd/hub': 'Feuerfuchs'
             }
    Threads = []
    tds=Bereich(Länge(Stück))
 
    # Thread für Host, Browser in pcs.items() erstellen:
        t = Thread(Ziel=Test_Bing, Argumente=(Host, Browser))
        threads.append(t)
 
    # Thread für i in tds starten:
        threads[i].start()
    für i in tds:
        threads[i].beitreten()

Aus dem obigen Skript können Sie ersehen, dass eine Funktion namens Test_Bing() erstellt wird, die zwei Parameter enthält, nämlich den Host und den Browser. Die Ausführungsabsicht der Funktion besteht darin, eine Suche im entsprechenden Browser basierend auf der URL-Zeichenfolge des Remote-Servers und der übergebenen Browsernamenzeichenfolge durchzuführen, wobei der Suchbegriff „asynchrone Community“ lautet, einen Screenshot des Ausführungsergebnisses zu erstellen, wobei der Name des Screenshots der entsprechende Browsername + die Datei „_result.jpg“ ist, und das Suchergebnis zu bestätigen. Es ist zu beachten, dass der Zweck des Erstellens eines Screenshots der Ergebnisse hier nicht nur darin besteht, die Ergebnisse anzuzeigen, sondern auch, weil bei Verwendung von Selenium Grid während der Testausführung kein Browser angezeigt wird, sodass Sie den Ausführungsprozess nicht sehen können. Um die Richtigkeit der Ergebnisse zu beweisen, müssen wir auch einen Screenshot erstellen, um zu beweisen, dass es tatsächlich funktioniert und die Ausführung korrekt ist. Wenn Sie die Schnittstellen verschiedener Container während der Ausführung sehen möchten, können Sie auch VNC Viewer verwenden, um eine Verbindung mit dem entsprechenden Container herzustellen (Sie müssen dazu jedoch die entsprechenden Imagedateien selenium/node-firefox-debug und selenium/node-chrome-debug herunterladen. Die Images mit der Endung debug haben alle VNC-Server. Sie können VNC-Clients auf Ihrem lokalen Computer installieren, um eine Remoteverbindung herzustellen. Port 5900 ist der Abhörport von VNC Viewer, daher wird eine Portzuordnung durchgeführt), wie in den Abbildungen 9 und 10 gezeigt.

Abbildung 9 Erstellen und Starten der Debug-Version des Node-Containers

Abbildung 10 VNC Viewer zur Beobachtung der Skriptausführung des Node-Containers

Für Testarbeiten macht das allerdings eigentlich nicht viel Sinn, deshalb werde ich nicht zu sehr ins Detail gehen.

In der Hauptfunktion wird ein Wörterbuch mit 2 Elementen definiert. Sie können sehen, dass der Autor 2 verschiedene Darstellungen derselben Adresse verwendet (die IP-Adresse des Hostcomputers lautet 192.168.1.102) und "localhost" auch den lokalen Computer, d. h. den Hostcomputer, bezeichnet. Warum also nicht einfach „192.168.1.102“ oder „localhost“ verwenden? Dies liegt daran, dass Wörterbuchschlüssel nicht wiederholt werden dürfen. Als Nächstes wird eine Thread-Liste erstellt und die Schlüssel und Werte des pcs-Wörterbuchs werden als Parameter der Funktion Test_Bing() verwendet und der Thread-Liste hinzugefügt. Starten Sie dann jeden Thread in der Threadliste.

Bevor Sie das Skript ausführen, müssen Sie sicherstellen, dass die Hub- und Node-Container erstellt und gestartet wurden (Hinweis: Der Autor verwendet hier die Nicht-Debug-Version des Node-Images), wie in Abbildung 11 dargestellt.

Abbildung 11 Erstellen und Starten der Hub- und Node-Container

Nach der Ausführung des Skripts werden zwei Bilddateien, „chrome_result.jpg“ und „firefox_result.jpg“, generiert, wie in Abbildung 12 dargestellt.

Abbildung 12 Bilddateiinformationen, die nach der Skriptausführung generiert werden

Wie in Abbildung 13 und Abbildung 14 gezeigt, können Sie in diesem Kompatibilitätstest sehen, dass beide Browser denselben Bing-Suchdienst ausführen. Ihre Seitenanzeige, ihr Layout und ihr Inhalt sind im Wesentlichen gleich, aber es gibt zwei kleine Probleme. Die Suchergebnisse im Chrome-Browser lauten „855.000 Ergebnisse“, während die Suchergebnisse im Firefox-Browser „859.000 Ergebnisse“ lauten, was inkonsistent ist. Ein weiteres kleines Problem besteht darin, dass in Firefox „Anmelden“ und ein Anmeldesymbol angezeigt werden, in Chrome jedoch nicht. Theoretisch handelt es sich hierbei um zwei kleinere Fehler mit niedrigerem Schweregrad, aber der Autor empfiehlt, dass Sie diese beiden kleinen Unterschiede mit Ihren Produkt- und F&E-Kollegen abklären. Produkt, Tests und F&E sollten die Anforderungen vereinheitlichen und klären und dann die Anforderungen oder den Code ändern, um sie konsistent zu halten.

Abbildung 13 Informationen zur Bilddatei chrome_result.jpg

Abbildung 14 firefox_result.jpg Bilddateiinformationen

Dies ist das Ende dieses Artikels über den Beispielcode der Testtechnologieanwendung basierend auf Docker+Selenium Grid. Weitere relevante Inhalte zur Docker Selenium Grid-Testtechnologie finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Praktische Möglichkeit zum Erstellen einer verteilten Selenium-Grid-Umgebung mit Docker
  • 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

<<:  Vue implementiert Akkordeoneffekt

>>:  Einige Tipps zur richtigen Verwendung des HTML-Titelattributs

Artikel empfehlen

Programme zum Abfragen und Löschen der Portnutzung im Windows-Betriebssystem

Im Windows-Betriebssystem das Programm zum Abfrag...

Details der MySQL-Berechnungsfunktion

Inhaltsverzeichnis 2. Feldverkettung 2. Geben Sie...

WebWorker kapselt JavaScript-Sandbox-Details

Inhaltsverzeichnis 1. Szenario 2. Implementieren ...

Tutorial zur Installation und Konfiguration von MySQL 5.7 unter CentOS7 (YUM)

Installationsumgebung: CentOS7 64-Bit, MySQL5.7 1...

So verwenden Sie mysqldump zum Sichern von MySQL-Daten

1. Einführung in mysqldump mysqldump ist ein logi...

Fünf Lösungen für Cross-Browser-Probleme (Zusammenfassung)

Kurz zusammengefasst: Browserkompatibilitätsprobl...

Eine einfache und eingehende Studie zu Async und Await in JavaScript

Inhaltsverzeichnis 1. Einleitung 2. Detaillierte ...

Installieren Sie Mininet aus dem Quellcode auf Ubuntu 16.04

Mininet Mininet ist eine leichtgewichtige, softwa...