Подтвердить что ты не робот

Вход с кодом при использовании LiveServerTestCase с Django

Итак, у меня есть набор функциональных тестов Selenium. Я уже протестировал функциональность входа/регистрации в нескольких тестах, переместив клиент Selenium на страницу регистрации, введя имя пользователя и пароль, а затем сообщив Selenium о регистрации с теми же учетными данными. Теперь я хочу протестировать другие части областей, требуемых для входа в систему, без необходимости указывать Selenium на щелчок и вводить текст в тестовый браузер.

Другими словами, я хотел бы использовать что-то вроде этого (которое я использую в моих модульных тестах):

self.client = Client()  
self.user = User.objects.create_user('temporary', '[email protected]', 'temporary')  
self.user.save()  
self.client.login(username='temporary', password='temporary')

в моих тестах Selenium, поэтому мне не нужно повторять длительный процесс входа в систему в каждом из моих тестов (так как я уже тестировал систему входа в предыдущие тесты, как я уже говорил)

Как сейчас, я просто копирую и вставляю инструкции Selenium "login flow" для каждого из моих тестов, требующих входа в систему. Это заставляет мои тесты принимать дополнительные 5-6 секунд каждый, и это делает мой файл functions_tests.py очень раздутым.

Весь мой Google Googling привел меня на страницы, где я преподавал, как тестировать логин с Selenium.

Спасибо заранее.

4b9b3361

Ответ 1

Вы не можете войти в систему пользователя из драйвера selenium. Это просто невозможно без некоторых хаков.

Но вы можете войти в систему один раз на TestCase, переместив его в метод setUp.

Вы также можете не копировать, создавая класс, который вы внедрили из LiveServerTestCase.

UPDATE

Этот код работал у меня:

self.client.login(username=superuser.username, password='superpassword') #Native django test client
cookie = self.client.cookies['sessionid']
self.browser.get(self.live_server_url + '/admin/')  #selenium will set cookie domain based on current page domain
self.browser.add_cookie({'name': 'sessionid', 'value': cookie.value, 'secure': False, 'path': '/'})
self.browser.refresh() #need to update page for logged in user
self.browser.get(self.live_server_url + '/admin/')

Ответ 2

В Django 1.8 можно создать предварительно аутентифицированный cookie сеанса и передать его в Selenium.

Чтобы сделать это, вам нужно:

  • Создайте новый сеанс в своем бэкэнд;
  • Сгенерировать файл cookie с этими вновь созданными данными сеанса;
  • Передайте этот файл cookie вашему веб-серверу Selenium.

Логика создания сеанса и файла cookie выглядит следующим образом:

# create_session_cookie.py
from django.conf import settings
from django.contrib.auth import (
    SESSION_KEY, BACKEND_SESSION_KEY, HASH_SESSION_KEY,
    get_user_model
)
from django.contrib.sessions.backends.db import SessionStore

def create_session_cookie(username, password):

    # First, create a new test user
    user = get_user_model()
    user.objects.create_user(username=username, password=password)

    # Then create the authenticated session using the new user credentials
    session = SessionStore()
    session[SESSION_KEY] = user.pk
    session[BACKEND_SESSION_KEY] = settings.AUTHENTICATION_BACKENDS[0]
    session[HASH_SESSION_KEY] = user.get_session_auth_hash()
    session.save()

    # Finally, create the cookie dictionary
    cookie = {
        'name': settings.SESSION_COOKIE_NAME,
        'value': session.session_key,
        'secure': False,
        'path': '/',
    }
    return cookie

Теперь, внутри ваших тестов Selenium:

#selenium_tests.py

# assuming self.webdriver is the selenium.webdriver obj.
from create_session_cookie import create_session_cookie

session_cookie = create_session_cookie(
    email='[email protected]', password='top_secret'
)

# visit some url in your domain to setup Selenium.
# (404 pages load the quickest)
self.driver.get('your-url' + '/404-non-existent/')

# add the newly created session cookie to selenium webdriver.
self.driver.add_cookie(session_cookie)

# refresh to exchange cookies with the server.
self.driver.refresh()

# This time user should present as logged in.
self.driver.get('your-url')