web-dev-qa-db-ja.com

DjangoでLiveServerTestCaseを使用する場合は、コードを使用してログインします

だから私は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命令をコピーして貼り付けるだけです。これにより、テストにそれぞれ5〜6秒の追加時間がかかり、function_tests.pyファイルが非常に肥大化します。

私のグーグルはすべて、Seleniumでログインをテストする方法を教えてくれるページに私を連れてきました。

前もって感謝します。

34

Seleniumドライバーからユーザーにログインすることはできません。いくつかのハックなしでは不可能です。

ただし、TestCaseをsetUpメソッドに移動することで、TestCaseごとに1回ログインできます。

LiveServerTestCaseから継承されたクラスを作成することで、コピー貼り付けを回避することもできます。

[〜#〜]更新[〜#〜]

このコードは私のために働いた:

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

Django 1.8では、事前認証されたセッションCookieを作成し、それをSeleniumに渡すことができます。

これを行うには、次のことを行う必要があります。

  1. バックエンドで新しいセッションを作成します。
  2. 新しく作成されたセッションデータを使用してCookieを生成します。
  3. そのCookieをSeleniumWebドライバーに渡します。

セッションと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')
16
tilacog