5

Selenium を使用して Django ビューをテストする機能テストを作成しようとしています。ユーザーがページ ("page2") にアクセスすると、そのページをレンダリングするビューは、セッション変数 "uid" (ユーザー ID) を見つけることを期待します。これがどのように行われるかについての記事を半ダース読みましたが、どれもうまくいきませんでした。以下のコードは、Django のドキュメントで実行する必要があると記載されている方法を示していますが、私にとっても機能しません。テストを実行すると、ビューの実行が完了せず、「サーバー エラーが発生しました」というメッセージが表示されます。誰かが私が間違っていることを教えてもらえますか? ありがとうございました。

ビュー.py:

from django.shortcuts import render_to_response

def page2(request):
    uid = request.session['uid']
    return render_to_response('session_tests/page2.html', {'uid': uid})

test.py:

from django.test import LiveServerTestCase
from selenium import webdriver
from django.test.client import Client

class SessionTest(LiveServerTestCase):

    def setUp(self):
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(3)
        self.client = Client()
        self.session = self.client.session
        self.session['uid'] = 1

    def tearDown(self):
        self.browser.implicitly_wait(3)
        self.browser.quit()

    def test_session(self):
        self.browser.get(self.live_server_url + '/session_tests/page2/')
        body = self.browser.find_element_by_tag_name('body')
        self.assertIn('Page 2', body.text)
4

3 に答える 3

3

この問題を解決する方法は次のとおりです。James Aylett は、上記のセッション ID に言及して、解決策をほのめかしました。jscn はセッションのセットアップ方法を示しましたが、解決策に対するセッション キーの重要性については触れておらず、セッション状態を Selenium のブラウザ オブジェクトにリンクする方法についても言及していませんでした。

最初に、セッションのキーと値のペア (例: 'uid'=1) を作成すると、Django のミドルウェアが選択したバックエンド (データベース、ファイルなど) にセッション キー/データ/有効期限のレコードを作成することを理解する必要があります。 )。次に、応答オブジェクトは、そのセッション キーを Cookie に入れてクライアントのブラウザに送り返します。ブラウザが後続のリクエストを送信すると、そのキーを含む Cookie が返されます。このキーは、ミドルウェアがユーザーのセッション アイテムを検索するために使用されます。

したがって、解決策として必要だったのは、1.) セッション アイテムの作成時に生成されるセッション キーを取得する方法を見つけることです。2.) Selenium の Firefox Web ドライバー ブラウザー オブジェクトを介して、そのキーを Cookie に戻す方法を見つける。これを行うコードは次のとおりです。

selenium_test.py:
-----------------

from django.conf import settings
from django.test import LiveServerTestCase
from selenium import webdriver
from django.test.client import Client
import pdb

def create_session_store():
    """ Creates a session storage object. """

    from django.utils.importlib import import_module
    engine = import_module(settings.SESSION_ENGINE)
    # Implement a database session store object that will contain the session key.
    store = engine.SessionStore()
    store.save()
    return store

class SeleniumTestCase(LiveServerTestCase):

    def setUp(self):
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(3)
        self.client = Client()

    def tearDown(self):
        self.browser.implicitly_wait(3)
        self.browser.quit()

    def test_welcome_page(self):
        #pdb.set_trace()
        # Create a session storage object.
        session_store = create_session_store()
        # In pdb, you can do 'session_store.session_key' to view the session key just created.

        # Create a session object from the session store object.
        session_items = session_store

        # Add a session key/value pair.
        session_items['uid'] = 1
        session_items.save()

        # Go to the correct domain.
        self.browser.get(self.live_server_url)

        # Add the session key to the cookie that will be sent back to the server.
        self.browser.add_cookie({'name': settings.SESSION_COOKIE_NAME, 'value': session_store.session_key})
        # In pdb, do 'self.browser.get_cookies() to verify that it's there.'

        # The client sends a request to the view that's expecting the session item.
        self.browser.get(self.live_server_url + '/signup/')
        body = self.browser.find_element_by_tag_name('body')
        self.assertIn('Welcome', body.text)
于 2013-01-23T23:35:42.310 に答える
0

Django のバグ トラッカーには、この種の問題に関するチケットがいくつかあります。主なチケットはhttps://code.djangoproject.com/ticket/10899のようです。これは数か月間まったく動きがありません。基本的に、セッションを適切に機能させるには、追加の設定を行う必要があります。これが私にとってうまくいったことです(私はSeleniumを使用していなかったので、あなたの特定の設定ではそのままではうまくいかないかもしれません):

def setUp(self):
    from django.conf import settings
    engine = import_module(settings.SESSION_ENGINE)
    store = engine.SessionStore()
    store.save()
    self.client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key

これで、アクセスできるようにself.client.sessionなり、加えた変更が記憶されるはずです。

于 2013-01-21T00:03:06.500 に答える