Тест входа в систему Selenium не принимает приспособления pytest для входа в систему или отказывается подключаться - PullRequest
6 голосов
/ 18 марта 2020

Я впадаю в отчаяние, потому что я не могу найти решение для того, что, как я думал, будет использоваться всеми.

Я хочу протестировать простой вход в систему с помощью selenium и pytest с помощью live_server URL-адрес. Согласно pytest- django do c, простое устройство под названием live_server должно сработать (https://pytest-django.readthedocs.io/en/latest/helpers.html#live -server ).

К сожалению, когда я передаю этот прибор в свой тест и пытаюсь зайти с ним на свой веб-сайт, я получаю:

localhost отказался подключиться, например,

для этого:

    def test_selenium(self, live_server, create_staff_user_in_db):
        browser = webdriver.Remote(
            command_executor='http://selenium:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.CHROME,
        )

        browser.get(live_server.url)

Использование этого вопроса Selenium не может войти в систему Django LiveServerTestCase Я пытаюсь использовать другой серверный прибор, который затем соединяет меня, и я вижу свой веб-сайт в моей программе просмотра VN C.

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

Но теперь я не могу войти на свой сайт, если я создаю пользователей в БД с помощью своих приборов. Хотя кажется, что пользователи действительно созданы. Итак, мой тест теперь выглядит так:


  def test_selenium(self, test_server, create_staff_user_in_db):
        browser = webdriver.Remote(
            command_executor='http://selenium:4444/wd/hub',
            desired_capabilities=DesiredCapabilities.CHROME,
        )

        browser.get(f"{live_server.url}/login")
        input_username = browser.find_element_by_name('username')
        input_password = browser.find_element_by_name('password')
        input_username.send_keys('testuserstaff')
        input_password.send_keys('mypasswordstaff')
        browser.find_element_by_xpath(
            '//*[@id="page-top"]/div[1]/div/div/div/div/form/button'
        ).click()

А мой пользовательский прибор:

@pytest.fixture()
def create_staff_user_in_db():
    User = get_user_model()
    staff_user = User.objects.create_user(
        username="testuserstaff",
        password="mypasswordstaff",
    )
    staff_user.is_staff = True
    staff_user.save()

    return staff_user

Тесты посещают мою страницу входа и не в состоянии войти. Я на 100% уверен, что я Я использую правильные учетные данные.

Если я распечатаю для отладки, я также могу убедиться, что мой пользователь находится в моей базе данных:

print(u.username) ==> testuserstaff
print(u.password) ==> igetthehashofthepassword
print(User.objects.count()) ==> 1 

Таким образом, я предполагаю, что база данных, создаваемая pytest, заполнена этим пользователем. пройти как крепеж. Так или иначе, мой живой сервер либо не использует базу данных, либо не распознает приборы.

Он должен быть подключен к устройству live_server / test_server. Я был бы очень благодарен за любую помощь. Я чувствую, что я так близко, но я просто не могу понять, почему он не входит в систему.

Что еще я пробовал: 1) Войдите в систему с пользователями, которые находятся в моей db разработки. Нет успеха Так что мне интересно: какой дБ тогда будет использоваться?

2) Я попытался настроить библиотеку pytest-selenium. Если я пытаюсь загрузить страницу, я получаю selenium.common.exceptions.SessionNotCreatedException: Message: Unable to create session

3) Я пытался работать со StaticLiveServerCase, но это не вариант, так как мне нужно передать фиксаторы в качестве аргумента.

4) Я искал повсюду в Интернете и больше ничего не могу найти

Также полезно знать:

Я запускаю это в среде docker (рад поделиться если это поможет)

Так что мой стек в основном: Docker, Django, Pytest, селен

Опять-таки, я бы очень оценил здесь руку. Большое спасибо заранее

РЕДАКТИРОВАТЬ:

Мой docker -составить файл:

version: '3'

volumes:
  local_postgres_data: {}
  local_postgres_data_backups: {}

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

  selenium:
    image: selenium/standalone-chrome-debug
    ports:
      - 4444:4444
      - 5900:5900

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

1 Ответ

2 голосов
/ 30 марта 2020

Превращение комментария в ответ: по умолчанию тесты избегают выполнения запросов к базе данных, чтобы не замедлять выполнение теста, поэтому User.objects.create_user не записывает данные в базу данных. Чтобы обеспечить фиксацию в дб, используйте маркер @pytest.mark.django_db(transaction=True) в тестах или прибор transactional_db в ваших приборах:

@pytest.fixture()
def create_staff_user_in_db(transactional_db):
    staff_user = User.objects.create_user(...)
    ...

Я предполагаю, что прибор live_server из django использует transactional_db автоматически, но что test_server нет?

Точно - live_server подразумевает транзакционный режим, а пользовательский импл test_server - нет. Явный запрос устройства transactional_db в test_server должен исправить это:

@pytest.fixture
def test_server(request) -> LiveServer:
    request.getfixturevalue("transactional_db")
    ...

Кстати, если вы просто хотите динамически применить адрес живого сервера, вам не нужно определять свой собственный прибор; записи значений конфигурации должно быть достаточно. Пример:

# conftest.py

def pytest_configure(config):
    config.option.liveserver = socket.gethostbyname(socket.gethostname())

Это значение будет затем использоваться встроенным прибором live_server. Поместите conftest.py в ваш проект или тесты root dir, чтобы pytest нашел крюк достаточно рано для его применения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...