[PYTHON] Configurer un environnement de test automatique du navigateur qui peut exécuter Selenium + Pytest avec Docker Compose

Résumé

Lorsque vous essayez d'effectuer un test automatique du navigateur avec Selenium et Pytest, il est plutôt difficile de créer un environnement jusqu'à ce que le test soit exécuté. Si vous mettez dans un navigateur, mettez dans un webdriver qui correspond à la version du navigateur, mettez en Python, mettez en Pytest, etc., l'installation peut prendre plusieurs heures.

Par conséquent, cette fois, nous utiliserons Docker Compose pour simplifier le démarrage de l'environnement d'exécution pour Selenium et Pytest. Veuillez vous y référer lorsque vous souhaitez un environnement d'exécution de test de navigateur instantané ou lorsque vous souhaitez unifier l'environnement d'exécution au sein d'un projet.

Configuration du système

Lancez les deux conteneurs suivants avec Docker Compose et connectez-les à distance. --chrome (environnement d'exécution Chrome + Selenium) --pytest (environnement d'exécution Pytest)

Utilisez selenium / standalone-chrome-debug pour le conteneur de chrome. Il s'agit d'une image fournie par le responsable de Selenium et, comme son nom l'indique, Chrome + Selenium peut être exécuté de manière autonome. (En interne, un nœud de Chrome est connecté à Selenium Grid Hub)

Le conteneur pytest est construit en écrivant un Dockerfile par vous-même basé sur l'image python officielle de Docker.

organisation des fichiers

Répertoire de travail local

docker-pytest
├── Dockerfile_pytest
├── docker-compose.yml
├── screenshots
└── tests
    └── test_google.py

répertoire interne du conteneur pytest

/
└── docker-pytest
    ├── screenshots
    └── tests
        └── test_google.py

Contenu de chaque fichier

docker-compose.yml

docker-compose.yml


version: "3"

services:
  chrome:
    image: selenium/standalone-chrome-debug:4.0.0-alpha-7-prerelease-20200826
    container_name: chrome
    volumes:
      - /dev/shm:/dev/shm
    ports:
      - 4444:4444
      - 5900:5900

  pytest:
    build:
      context: ./
      dockerfile: Dockerfile_pytest
    container_name: pytest
    volumes:
      - ./screenshots:/docker-pytest/screenshots/
    tty: true

La description du conteneur chrome est basée sur la commande docker décrite dans selenium / standalone-chrome-debug au format YAML.

Le conteneur pytest utilise Bind Mount. Vous avez monté le répertoire local docker-pytest / screenshots dans le répertoire / docker-pytest / screenshots du conteneur pytest. Vous pouvez maintenant afficher localement les captures d'écran enregistrées lorsque vous exécutez pytest dans le conteneur pytest.

Dockerfile_pytest

Étant donné que la date et l'heure sont utilisées dans le script de test, seul le fuseau horaire est modifié.

FROM python:3

RUN pip install --upgrade pip && \
    pip install selenium pytest

ENV TZ "Asia/Tokyo"

WORKDIR /docker-pytest
COPY ./tests/ /docker-pytest/tests

test_google.py

Le point est de savoir comment spécifier le pilote. Vous pouvez résoudre le nom par nom de conteneur par docker-compose. conteneur chrome ・ Pour vous connecter à Selenium Grid Hub avec le port 4444, connectez-vous à http: // chrome: 4444 / wd / hub.

test_google.py


import os
from datetime import datetime

from selenium import webdriver


class TestGoogle:
    @classmethod
    def setup_class(cls):
        cls.driver = webdriver.Remote(
            command_executor="http://chrome:4444/wd/hub",
            options=webdriver.ChromeOptions(),
        )

    def test_access_google(self):
        """
Accédez à la page d'accueil de Google.

Haut de page Google(https://www.google.com/)Accéder.
Prendre une capture d'écran au moment de l'accès
Le nom du fichier est la date et l'heure auxquelles le test a été exécuté(YYMMDD_hhmmss.png)Et.
Le succès ou l'échec est jugé par "si l'URL actuelle du navigateur est la première page de Google".
        """

        driver = TestGoogle.driver

        file_name = datetime.now().strftime("%y%m%d_%H%M%S.png ")
        screenshot_path = os.path.join("/docker-pytest/screenshots/", file_name)

        driver.get("https://www.google.com/")
        driver.get_screenshot_as_file(screenshot_path)

        assert driver.current_url == "https://www.google.com/"

    @classmethod
    def teardown_class(cls):
        cls.driver.quit()

Comment utiliser

  1. Déplacez-vous localement dans le dossier docker-pytest
  2. Exécutez docker-compose up -d --build
  3. Exécutez docker-compose exec pytest bash et connectez-vous au conteneur pytest
  4. Exécutez pytest tests
  5. Si les captures d'écran sont générées dans le dossier local docker-pytest / screenshots, vous avez terminé!

Confirmation d'exécution

L'image Docker distribuée par le fonctionnaire Selenium a une version normale et une version de débogage. Si vous utilisez la version de débogage, vous pouvez vérifier l'écran en cours d'exécution du test avec l'interface graphique en vous connectant à VNC.

La destination de la connexion est «vnc: // localhost: 5900». Consultez l'article ci-dessous pour savoir comment vous connecter. Connexion VNC au conteneur selenium / standalone-chrome-debug de Docker

Perspectives d'avenir

Cette fois, j'ai utilisé selenium / standalone-chrome-debug qui est un Selenium Grid Hub à 1 nœud, mais si cela est transformé en plusieurs nœuds, des tests multi-navigateurs peuvent être exécutés. Pour plus de détails, reportez-vous à ce qui suit. SeleniumHQ/docker-selenium#selenium-grid-hub-and-nodes

Matériel de référence

--Livres

Recommended Posts

Configurer un environnement de test automatique du navigateur qui peut exécuter Selenium + Pytest avec Docker Compose
Configurer un serveur Samba avec Docker
Configurer un environnement de développement Python avec Sublime Text 2
CodePicnic qui peut créer un environnement [Développement | Exécuter | Tutoriel | Démo] qui s'exécute sur le navigateur
Configurer un environnement de développement Python avec Visual Studio Code
Créer un environnement Docker qui peut utiliser PyTorch et JupyterLab
Créez un programme qui peut générer votre image préférée avec Selenium
Le panneau Web LXC qui peut faire fonctionner LXC avec un navigateur était merveilleux
Essayez de mettre en place un environnement de test Vim assez sérieusement (pour Python)
Composez avec un réseau neuronal! Run Magenta
Obtenez un environnement local pour DynamoDB avec Docker
[Linux] Créer un environnement Jenkins avec Docker
Exécutez une application Web Python avec Docker
[Linux] Construction de l'environnement Docker avec Amazon Linux 2
Configurer un serveur HTTPS simple avec asyncio
Configurer un serveur local avec le téléchargement Go-File-
[Python] Créer un environnement de développement Django avec Docker
Configurez un serveur SMTP de test en Python.
Configurer un serveur local avec le téléchargement Go-File-
Configurer un environnement de développement Python sur Marvericks
Comment utiliser Docker pour conteneuriser votre application et comment utiliser Docker Compose pour exécuter votre application dans un environnement de développement