Login with code when using LiveServerTestCase with Django

て烟熏妆下的殇ゞ 提交于 2019-12-02 15:32:46

You can't login user from selenium driver. It's just impossible without some hacks.

But you can login once per TestCase by moving it to setUp method.

You can also avoid copy-pasting by creating you class inhereted from LiveServerTestCase.

UPDATE

This code worked for me:

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/')
tilacog

In Django 1.8 it is possible to create a pre-authenticated session cookie and pass it to Selenium.

In order to do this, you'll have to:

  1. Create a new session in your backend;
  2. Generate a cookie with that newly created session data;
  3. Pass that cookie to your Selenium webdriver.

The session and cookie creation logic goes like this:

# 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

Now, inside your Selenium tests:

#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='test@email.com', 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')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!