2017-08-12 2 views
0

J'essaie d'obtenir une application Dockerized pour mon application de testeur. J'utilise le hub public et les images de noeud pour créer une grille Selenium qui fonctionne bien - je peux exécuter mes tests localement sur la grille Dockerized. Maintenant, tout ce que je dois faire est Dockerize mon code d'application de test et l'exécuter contre la grille. J'ai créé un fichier Docker-composer pour configurer la grille puis exécuter le code de test. Malheureusement, lorsque les tests sont exécutés à partir du conteneur Docker, ils ne semblent pas pouvoir se connecter au concentrateur. J'ai vérifié les journaux du conteneur de testeurs et j'ai vu quelques résultats de la première étape du test. Il se bloque alors là pour environ une minute et produit les éléments suivants:Comment puis-je exécuter des tests d'interface utilisateur sélénium sur une grille à partir du conteneur docker?

Net::ReadTimeout (Net::ReadTimeout) 

Je bombardé dans le conteneur de lanceur de test docker et a pu ping le centre de là, je crois que oui le coureur de test peut parler au moyeu. J'ai spécifié ma configuration du pilote comme ceci:

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 

Comme vous pouvez le voir, il va essayer de frapper le domaine centre-conteneur, il devrait pouvoir depuis que je peux le ping à l'intérieur du conteneur.

Je ne vois aucune information de journal sur le conteneur de nœud du navigateur, il semblerait donc qu'il n'ait même pas été tenté d'être atteint. Je suis capable d'exécuter exactement le même test à partir de ma machine locale à l'extérieur du conteneur docker. La seule différence est que je dois changer hub-container en localhost puisque je ne suis plus en cours d'exécution depuis le conteneur.

Quelqu'un at-il une idée de la raison pour laquelle je ne peux pas lancer le test depuis un conteneur docker?

fichier Compose:

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

Publiez votre fichier de composition –

+0

ajouté composez le fichier – Barodapride

Répondre

0

Mise à jour l'option :url dans votre configuration du pilote à :url => "http://hub:4444/wd/hub". Le nom d'hôte doit correspondre au nom du service hub défini dans votre fichier de composition.

+0

oui J'ai essayé dans les deux sens. J'avais précédemment démarré le hub avec le nom de conteneur hub-container. D'une manière ou d'une autre, je peux envoyer un ping vers un hub et un hub-container avec succès depuis le conteneur de runner de test. Cela ne semble pas faire de différence. – Barodapride

+0

@Barodapride A quoi ressemble Dockerfile 'test-runner'? –

+0

Non, les journaux du concentrateur indiquent que la grille est opérationnelle et qu'elle a enregistré quelques nœuds. Les journaux de noeud se terminent par "Le noeud est enregistré sur le concentrateur et prêt à être utilisé", donc je suppose qu'ils sont bons. Je suppose que la grille Dockerized fonctionne correctement puisque je peux exécuter mes tests localement en les envoyant à la grille. Seule différence que je peux penser dans le coureur de test de conteneur est la configuration de geckodriver/chromedriver là. Je ne sais pas quoi d'autre le problème pourrait être. – Barodapride

0

Beaucoup de choses peuvent mal tourner avec une configuration aussi complexe. Je l'ai fait fonctionner sans Grid, après de nombreuses heures de débogage. Puisque vous envoyez des messages configuration Chrome, voici comment j'ai réussi à le faire fonctionner:

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

Vous devez donc ajouter ces deux '--no-sandbox', '--whitelisted-ips' afin de rendre le travailler avec Docker/configuration à distance binaire chromedriver. Aussi, vous pouvez vérifier si votre binaire a effectivement des autorisations via ls -la, sinon essayez d'exécuter chmod +x chromedriver et chmod 777 chromedriver (faire la même chose pour le geckodriver, qui devrait être placé dans user/bin selon Mozilla dos). Si vous avez encore des problèmes avec le plus tard, vous devez suivre Mozilla docs:

« Même si le projet a été renommé GeckoDriver, bon nombre des clients de sélénium recherchent l'ancien nom Vous devez renommer le fichier binaire. fichier à «fils» (l'ancien nom) et assurez-vous qu'il est exécutable. "

La dernière chose qui peut vous dire, s'il y a des problèmes avec les executables du pilote est de les exécuter en mode autonome, juste obtenu le leur emplacement (pour geckodriver est /usr/bin) et commencer comme si ./geckodriver, la sortie devrait aider vous attrapez des erreurs si elles sont présentes.

Si vos nœuds n'ont pas d'affichage - vous devez utiliser la configuration headless ou xvfb, veillez également à résoudre ce problème. Les ports d'affichage doivent également être accessibles.

+0

Ai-je besoin de headless ou de xvfb si j'exécute les tests sur une autre machine? – Barodapride

+0

Oui, si la machine n'a pas d'affichage, car les conteneurs ne l'ont généralement pas. – ekostadinov

+0

Mais pourquoi? J'exécute les tests à distance, tout ce dont j'ai besoin est la ligne de commande. Pour être clair, le concentrateur et les nœuds ont l'affichage. Le testeur est censé envoyer les tests au concentrateur mais cela échoue. – Barodapride