Использование Selenium с Pytest для проекта Django 2.2, запущенного в Docker - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь использовать Pytest с плагином Django и Selenium для тестирования проекта Django 2.2, который выполняется в Docker, но я не могу подключить Selenium к тестовому серверу.Selenium продолжает возвращать «Адрес недоступен», когда я пытаюсь подключиться, используя настройки ниже.

Мой состав Docker:

version: '3'

volumes:
  local_postgres_data: {}

services:
  django:
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: local_django
    depends_on:
      - postgres
    volumes:
      - .:/app
    env_file:
      - ./.envs/.local/.django
      - ./.envs/.local/.postgres
    ports:
      - "8000:8000"
    links:
      - selenium
    command: /start

  postgres:
    build:
      context: .
      dockerfile: ./compose/local/postgres/Dockerfile
    image: local_postgres
    volumes:
      - local_postgres_data:/var/lib/postgresql/data
    env_file:
      - ./.envs/.local/.postgres

  selenium:
    image: selenium/standalone-firefox
    ports:
      - "4444:4444"

Я определил DJANGO_LIVE_TEST_SERVER_ADDRESS=django в моем .djangoфайл env и настройте прибор в conftest.py для удаленного веб-драйвера Selenium:

import environ
import pytest

from selenium.webdriver import Remote
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities


env = environ.Env()


@pytest.fixture(scope='session')
def selenium() -> Remote:
    driver = Remote(
        command_executor=env('SELENIUM_HOST', default='http://selenium:4444/wd/hub'),
        desired_capabilities=DesiredCapabilities.FIREFOX
    )
    yield driver

Мой тестовый пример с использованием моего приспособления selenium и приспособления live_server, предоставленного Django-PyTest:

import pytest

class TestDashboard:
    def test_loads(self, selenium, live_server):
        selenium.get(live_server.url)
        assert My Site' in selenium.title

повышает OSError: [Errno 99] Address not available в конструкторе live_server.

Помимо прочего, я также пытался использовать класс StaticLiveServerTestCase напрямую, опуская live_server и мой selenium приспособление, но это не сработало намного лучше:

import pytest

from django.contrib.staticfiles.testing import StaticLiveServerTestCase

from selenium.webdriver import Remote
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities


pytestmark = pytest.mark.django_db


class TestDashboardView(StaticLiveServerTestCase):
    @classmethod
    def setUpClass(cls):
        cls.host = 'django'
        cls.selenium = Remote(
            command_executor='http://selenium:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.FIREFOX
        )
        super().setUpClass()

    @classmethod
    def tearDownClass(cls):
        cls.selenium.quit()
        super().tearDownClass()

    def test_page_loads(self):
        self.selenium.get(self.live_server_url)
        assert "My Site" in self.selenium.title

Эта версия теста также поднимает OSError: [Errno 99] Address not available.

Есть ли у кого-нибудь здесь какие-либо указатели относительно того, кем я могу бытьделать неправильно и как я могу исправить это?Было бы здорово, если бы Selenium работал вместе с моими существующими тестами на сервере.

1 Ответ

1 голос
/ 17 мая 2019

Думаю, я понял это.Вместо того, чтобы использовать прибор pytest-django live_server, я добавил свой собственный, который использует существующий класс LiveServer.

Вот мой дополнительный прибор:

import pytest
import socket

from pytest_django.live_server_helper import LiveServer

@pytest.fixture(scope='session')
def test_server() -> LiveServer:
    addr = socket.gethostbyname(socket.gethostname())
    server = LiveServer(addr)
    yield server
    server.stop()

Вы также можетенужно добавить ip контейнера Django в ALLOWED_HOSTS.Я делаю это так:

if env("USE_DOCKER") == "yes":
    import socket

    ALLOWED_HOSTS = [socket.gethostbyname(socket.gethostname())]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...