[PYTHON] Richten Sie eine automatische Testumgebung für den Browser ein, in der Selenium + Pytest mit Docker Compose ausgeführt werden kann

Zusammenfassung

Wenn Sie versuchen, einen automatischen Browsertest mit Selenium und Pytest durchzuführen, ist es ziemlich mühsam, eine Umgebung zu erstellen, bis der Test ausgeführt wird. Wenn Sie einen Browser, einen Webtreiber, der der Version des Browsers entspricht, einen Python, einen Pytest usw. hinzufügen, kann die Installation mehrere Stunden dauern.

Daher werden wir dieses Mal Docker Compose verwenden, um den Start der Ausführungsumgebung für Selenium und Pytest zu vereinfachen. Bitte beziehen Sie sich darauf, wenn Sie eine sofortige Ausführungsumgebung für Browsertests wünschen oder wenn Sie die Ausführungsumgebung innerhalb eines Projekts vereinheitlichen möchten.

Systemkonfiguration

Starten Sie die folgenden beiden Container mit Docker Compose und verbinden Sie sie remote. --chrome (Chrome + Selenium-Ausführungsumgebung) --pytest (Pytest-Ausführungsumgebung)

Verwenden Sie Selen / Standalone-Chrome-Debug für den Chrome-Container. Dies ist ein Bild, das vom Selenium-Mitarbeiter bereitgestellt wurde. Wie der Name schon sagt, kann Chrome + Selenium eigenständig ausgeführt werden. (Intern ist ein Chrome-Knoten mit dem Selenium Grid Hub verbunden.)

Der Pytest-Container wird erstellt, indem Sie selbst eine Docker-Datei schreiben, die auf offizielles Docker-Python-Image basiert.

Dateiorganisation

Lokales Arbeitsverzeichnis

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

internes Verzeichnis des pytest-Containers

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

Inhalt jeder Datei

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

Die Beschreibung des Chrome-Containers basiert auf dem Docker-Befehl, der unter selenium / standalone-chrome-debug im YAML-Format beschrieben ist.

Der Pytest-Container verwendet Bind Mount. Sie haben das lokale Verzeichnis "Docker-Pytest / Screenshots" in das Verzeichnis "/ Docker-Pytest / Screenshots" des Pytest-Containers eingebunden. Jetzt können Sie die Screenshots lokal anzeigen, die beim Ausführen von pytest im pytest-Container gespeichert wurden.

Dockerfile_pytest

Da Datum und Uhrzeit im Testskript verwendet werden, wird nur die Zeitzone geändert.

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

Der Punkt ist, wie der Treiber angegeben wird. Sie können den Namen nach Containernamen durch Docker-Compose auflösen. Chrome-Container ・ Um eine Verbindung zum Selenium Grid Hub mit 4444-Anschluss herzustellen, stellen Sie eine Verbindung zu http: // chrome: 4444 / wd / hub her.

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):
        """
Greifen Sie auf die Google-Startseite zu.

Google Top-Seite(https://www.google.com/)Zugreifen.
Machen Sie zum Zeitpunkt des Zugriffs einen Screenshot
Der Dateiname ist das Datum und die Uhrzeit, zu der der Test ausgeführt wurde(YYMMDD_hhmmss.png)Und.
Erfolg oder Misserfolg werden danach beurteilt, "ob die aktuelle URL des Browsers die Google-Top-Seite ist".
        """

        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()

Wie benutzt man

  1. Verschieben Sie lokal in den Ordner "Docker-Pytest"
  2. Führen Sie docker-compose up -d --build aus
  3. Führen Sie "docker-compose exec pytest bash" aus und stellen Sie eine Verbindung zum pytest-Container her
  4. Führen Sie "Pytest-Tests" durch
  5. Wenn die Screenshots im lokalen Ordner "Docker-Pytest / Screenshots" erstellt wurden, sind Sie fertig!

Bestätigung der Ausführung

Das vom Selenium-Beamten verteilte Docker-Image hat eine normale Version und eine Debug-Version. Wenn Sie die Debug-Version verwenden, können Sie den Bildschirm während der Testausführung mit der GUI überprüfen, indem Sie eine Verbindung zu VNC herstellen.

Das Verbindungsziel ist "vnc: // localhost: 5900". Informationen zum Herstellen einer Verbindung finden Sie im folgenden Artikel. VNC-Verbindung zum Docker-Container für Selen / Standalone-Chrome-Debug

Zukunftsaussichten

Dieses Mal habe ich Selen / Standalone-Chrome-Debug verwendet, bei dem es sich um einen Selenium Grid Hub mit 1 Knoten handelt. Wenn dies jedoch zu mehreren Knoten gemacht wird, können Tests mit mehreren Browsern ausgeführt werden. Einzelheiten finden Sie im Folgenden. SeleniumHQ/docker-selenium#selenium-grid-hub-and-nodes

Referenzmaterial

Recommended Posts

Richten Sie eine automatische Testumgebung für den Browser ein, in der Selenium + Pytest mit Docker Compose ausgeführt werden kann
Richten Sie mit Docker einen Samba-Server ein
Richten Sie mit Sublime Text 2 eine Python-Entwicklungsumgebung ein
CodePicnic, das eine Umgebung [Entwicklung | Ausführen | Tutorial | Demo] erstellen kann, die im Browser ausgeführt wird
Richten Sie eine Python-Entwicklungsumgebung mit Visual Studio Code ein
Erstellen Sie eine Docker-Umgebung, die PyTorch und JupyterLab verwenden kann
Erstellen Sie mit Selenium ein Programm, mit dem Sie Ihr Lieblingsbild erstellen können
Das LXC Web Panel, das LXC mit einem Browser bedienen kann, war wunderbar
Versuchen Sie ernsthaft, eine Vim-Testumgebung einzurichten (für Python).
Komponieren Sie mit einem neuronalen Netzwerk! Führen Sie Magenta aus
Holen Sie sich mit Docker eine lokale Umgebung für DynamoDB
[Linux] Erstellen einer Jenkins-Umgebung mit Docker
Führen Sie eine Python-Webanwendung mit Docker aus
[Linux] Aufbau einer Docker-Umgebung mit Amazon Linux 2
Richten Sie einen einfachen HTTPS-Server mit Asyncio ein
Richten Sie einen lokalen Server mit Go-File-Upload ein.
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Richten Sie einen Test-SMTP-Server in Python ein.
Richten Sie einen lokalen Server mit Go-File-Download ein.
Richten Sie eine Python-Entwicklungsumgebung auf Marvericks ein
Verwendung von Docker zum Containerisieren Ihrer Anwendung und Verwenden von Docker Compose zum Ausführen Ihrer Anwendung in einer Entwicklungsumgebung