Я впадаю в отчаяние, потому что я не могу найти решение для того, что, как я думал, будет использоваться всеми.
Я хочу протестировать простой вход в систему с помощью 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