J'essaie d'exécuter mes suites de tests d'interface graphique d'automatisation qui se trouvent dans mon conteneur d'automatisation.

J'ai téléchargé séparément une image selenium-firefox autonome et fonctionnant en tant que conteneur fonctionnant sur le port 4444.

localhost:4444/wd/hub

Maintenant, j'essaie d'exécuter les suites de tests qui se trouvent dans mon conteneur d'automatisation, j'utilise le code ci-dessous pour exécuter en mode sans tête pour atteindre la version firefox de sélénium dans ma suite de tests robotframework.

Open Browser      http://www.youtube.com    headlessfirefox    remote_url=http://localhost:4444/wd/hub

Cette approche fonctionne bien lorsque j'exécute ma suite de tests à partir de ma machine, elle échoue lorsque je l'exécute dans le conteneur d'automatisation.

Est-il possible que mon conteneur d'automatisation puisse atteindre le conteneur sélénium-firefox pour utiliser le navigateur.

Erreur:

C: 10: Open Chrome headless                                          
/usr/local/lib/python3.6/site-packages/requests/__init__.py:91: 
RequestsDependencyWarning: urllib3 (1.26.3) or chardet (3.0.4) doesn't 
match a supported version!
RequestsDependencyWarning)
[ WARN ] Retrying (Retry(total=2, connect=None, read=None, redirect=None, 
status=None)) after connection broken by 
'NewConnectionError('<urllib3.connection.HTTPConnection object at 
0x7f4a322440b8>: Failed to establish a
[ WARN ] Retrying (Retry(total=1, connect=None, read=None, redirect=None, 
status=None)) after connection broken by 
'NewConnectionError('<urllib3.connection.HTTPConnection object at 
0x7f4a32244710>: Failed to establish a
new connection: [Errno 111] Connection refused',)': /wd/hub/session
[ WARN ] Retrying (Retry(total=0, connect=None, read=None, redirect=None, 
status=None)) after connection broken by 
'NewConnectionError('<urllib3.connection.HTTPConnection object at 
0x7f4a32235710>: Failed to establish a
new connection: [Errno 111] Connection refused',)': /wd/hub/session
| FAIL |
MaxRetryError: HTTPConnectionPool(host='localhost', port=4444): Max 
retries exceeded with url: /wd/hub/session (Caused by 
NewConnectionError('<urllib3.connection.HTTPConnection object at 
0x7f4a32235438>: Failed to establish a new connection: [Errno 111] 
Connection refused',))

Toute aide serait reconnaissante

0
Gopi Krishna 12 mars 2021 à 12:48

2 réponses

Meilleure réponse

Votre conteneur est considéré comme une machine différente, au niveau du réseau. Lorsque vous lancez l'image selenium-firefox, vous liez probablement le port 4444 de votre conteneur au port 4444 de votre hôte. Ensuite, lorsque vous demandez localhost: 4444 sur votre hôte, il est lié à votre conteneur.

Mais lorsque vous lancez un autre conteneur, localhost: 4444 signifie le port 4444 de ce conteneur!

Ce que vous devez faire est d'utiliser les offres de docker mécanique embed dns: lorsque vous créez un conteneur, il a un nom (que vous pouvez spécifier). Docker lui attribue une adresse IP interne sur le réseau Docker par défaut mais n'associe pas le nom du conteneur à cette adresse IP. Pour pouvoir utiliser le nom du conteneur comme nom de domaine dans vos URL, vous devez créer un nouveau réseau, qui utilisera ensuite le dns docker incorporé et obtiendra son propre nom en tant qu'alias.

C'est pourquoi la réponse de Vova fonctionnait: docker-compose crée un réseau par défaut pour votre conteneur, ce qui signifie qu'ils obtiennent automatiquement un alias. J'étais tellement habitué à utiliser le réseau et / ou à composer que j'ai négligé le fait que les alias n'étaient pas automatiques sur le réseau docker par défaut.

Vous ne devez créer un réseau de pont spécifique que pour ces conteneurs: docker network create selenium-net --driver bridge

Puis docker run -p 4444:4444 --name selenium --network selenium-net selenium/standalone-firefox:latest

Lorsque vous exécutez votre autre conteneur, vous devez également les ajouter au réseau selenium-net

Une alternative est de connecter les conteneurs que vous avez déjà au réseau: disons que j'ai des conteneurs selenium et testsuite en cours d'exécution (ou existants) Je vais lancer docker network connect selenium-net selenium et docker network connect selenium-net testsuite pour les mettre dans le réseau. Lorsque vous faites cela, vous pouvez spécifier l'option --alias si vous voulez leur donner un alias / domaine particulier sur le réseau docker.

1
Faeeria 13 mars 2021 à 03:04

Vous devez créer le fichier docker-compose.yml avec tous les conteneurs que vous allez créer:

version: '3.8'
services:
  chrome:
    image: selenium/standalone-chrome:85.0
    hostname: chrome
    ports:
      - "4444:4444"
  e2e-tests:
    build: .
    depends_on:
      - chrome

Et utilisez le nom d'hôte 'chrome' à l'intérieur du conteneur ce qui va l'utiliser comme:

cls.driver = webdriver.Remote(command_executor='http://chrome:4444/wd/hub',desired_capabilities=DesiredCapabilities.CHROME)
1
Vova 13 mars 2021 à 07:58