2017-08-12 5 views
0

Ich versuche, meine Test-Runner-Anwendung vollständig zu dockerisieren. Ich verwende die öffentlichen Hub- und Knotenbilder, um ein Selenium-Gitter zu erstellen, das gut funktioniert - ich kann meine Tests lokal mit dem Dockerized Grid ausführen. Alles, was ich jetzt noch tun muss, ist, meinen Test-App-Code zu docken und gegen das Grid zu starten. Ich habe eine Docker-Compose-Datei erstellt, um das Grid einzurichten und den Testcode auszuführen. Wenn die Tests über den Docker-Container ausgeführt werden, können sie leider keine Verbindung zum Hub herstellen. Ich überprüfte die Logs des Test-Runner-Containers und ich sah einige Ergebnisse aus dem ersten Testschritt. Es hängt dann dort für etwa eine Minute und gibt die folgenden:Wie kann ich Selen-UI-Tests in einem Grid vom Andock-Container ausführen?

Net::ReadTimeout (Net::ReadTimeout) 

ich in den Docker Test Runner Behälter geschält und konnte die Nabe ping von dort so glaube ich, die Test-Runner mit der Nabe sprechen kann. Ich meine angegebene Treiberkonfiguration wie folgt:

Capybara.register_driver :remote_hub_chrome do |app| 
    caps = Selenium::WebDriver::Remote::Capabilities.chrome 
    caps.version = "59.0.3071.115" 
    caps.platform = "LINUX" 
    Capybara::Selenium::Driver.new(
     app, 
     :browser => :chrome, 
     :url => "http://hub-container:4444/wd/hub", 
     :desired_capabilities => caps 
    ) 
end 

Wie Sie sehen können, wird es versuchen, die Hub-Container Domäne zu treffen, die es in der Lage sein sollte, da ich es aus dem Behälter anpingen kann.

Ich sehe keine Protokollinformationen auf dem Browser Knoten Container, so scheint es nicht einmal versucht worden zu erreichen. Ich bin in der Lage, den gleichen Test von meinem lokalen Rechner außerhalb des Andock-Containers auszuführen. Einziger Unterschied ist, dass ich den Hub-Container zu localhost ändern muss, da ich nicht mehr innerhalb des Containers laufe.

Hat jemand eine Idee, warum ich den Test nicht innerhalb eines Docker-Containers ausführen kann?

Compose-Datei:

version: "3" 

services: 

    hub: 
    image: selenium/hub 
    ports: 
     - "4444:4444" 
    networks: 
     - ui-test 

    firefox: 
    image: selenium/node-firefox-debug 
    ports: 
     - "5900" 
    depends_on: 
     - hub 
    environment: 
     - HUB_PORT_4444_TCP_ADDR=hub 
     - HUB_PORT_4444_TCP_PORT=4444 
    networks: 
     - ui-test 

    chrome: 
    image: selenium/node-chrome-debug 
    ports: 
     - "5900" 
    depends_on: 
     - hub 
    environment: 
     - HUB_PORT_4444_TCP_ADDR=hub 
     - HUB_PORT_4444_TCP_PORT=4444 
    networks: 
     - ui-test 

    test-runner: 
    image: test-runner 
    depends_on: 
     - hub 
     - chrome 
     - firefox 
    networks: 
     - ui-test 

networks: 
    ui-test: 
    driver: bridge 
+0

Veröffentlichen Sie Ihre Datei verfassen –

+0

hinzugefügt verfassen Datei – Barodapride

Antwort

0

Aktualisieren Sie die :url Option in Ihrer Treiberkonfiguration zu :url => "http://hub:4444/wd/hub". Der Hostname muss mit dem Namen des in Ihrer Compose-Datei definierten Dienstes hub übereinstimmen.

+0

ja ich habe beide Möglichkeiten ausprobiert. Ich hatte zuvor den Hub mit Containername Hub-Container gestartet. So oder so, ich kann Hub und Hub-Container erfolgreich aus dem Test-Runner-Container pingen. Scheint keinen Unterschied zu machen. – Barodapride

+0

@Barodapride Wie sieht Ihre Dockerfile 'test-runner' aus? –

+0

Nein, die Hub-Protokolle sagen, dass das Grid läuft und dass es einige Knoten registriert hat. Die Knotenprotokolle enden mit "Der Knoten ist beim Hub registriert und kann sofort verwendet werden", also gehe ich davon aus, dass sie gut sind. Ich nehme an, dass das Dockerized-Gitter funktioniert, da ich meine Tests lokal ausführen kann, indem ich sie an das Grid sende. Einziger Unterschied, den ich innerhalb des Containertestlaufers denken kann, ist das geckodriver/chromedriver Setup dort. Nicht sicher, was das Problem sonst noch sein könnte. – Barodapride

0

Mit so einem komplexen Setup können viele Dinge schief gehen. Ich habe es derzeit geschafft, ohne das Grid, nach vielen Stunden des Debuggens arbeiten. Da Sie Chrome Setup Mitteilung verfassen, hier ist, wie ich es laufen machen verwaltet:

caps = Selenium::WebDriver::Remote::Capabilities.chrome(
    'chromeOptions' => { 'args' => 
     ['--start-maximized', '--disable-infobars', 
     '--no-sandbox', '--whitelisted-ips'] } 
) 

So sollten Sie diese beiden '--no-sandbox', '--whitelisted-ips' zu machen, um die chromedriver binär mit Docker/Remote-Setup arbeiten hinzuzufügen. Sie können auch überprüfen, ob Ihre Binärdatei tatsächlich Berechtigungen über ls -la hat, wenn nicht versuchen, chmod +x chromedriver und chmod 777 chromedriver ausführen (das gleiche für die geckodriver tun, die in user/bin nach Mozilla DOS platziert werden sollte). Wenn Sie noch Fragen haben mit der späteren, Sie haben Mozilla docs folgen:

„Auch wenn das Projekt GeckoDriver umbenannt wurde, sehen viele der Selen-Clients für den alten Namen Sie müssen die binäre umbenennen. Datei zu 'Drähte' (der alte Name) und sicherstellen, dass es ausführbar ist. "

Letzte, was man sagen kann, wenn es Probleme mit den Treiber Executables sind, wird sie als eigenständiges laufen, hätte gerade den ihren Standort (für geckodriver ist /usr/bin) und starten Sie es wie so ./geckodriver, soll die Ausgabe helfen Sie fangen Fehler, wenn solche vorhanden sind.

Wenn Ihre Knoten keine Anzeigen haben - Sie müssen headless oder xvfb Setup verwenden, stellen Sie sicher, auch dies zu beheben. Display-Ports sollten auch zugänglich sein.

+0

Benötige ich headless oder xvfb, wenn ich die Tests auf einem anderen Rechner durchführe? – Barodapride

+0

Ja, wenn die Maschine keine Anzeige hat, da Container dies normalerweise nicht haben. – ekostadinov

+0

Aber warum? Ich führe die Tests aus der Ferne durch, alles was ich brauche ist die Kommandozeile. Um es klar zu sagen, der Hub und die Knoten haben das Display. Der Testläufer soll die Tests nur an den Hub senden, aber es versagt. – Barodapride

Verwandte Themen