gpt4 book ai didi

django - 如何在 Selenium/Django 单元测试中创建 session 变量?

转载 作者:行者123 更新时间:2023-12-03 19:05:42 25 4
gpt4 key购买 nike

我正在尝试编写一个使用 Selenium 来测试 Django View 的功能测试。当用户访问页面(“page2”)时,呈现该页面的 View 期望找到 session 变量“uid”(用户 ID)。我已经阅读了六篇关于如何做到这一点的文章,但没有一篇对我有用。下面的代码展示了 Django documentation说它应该完成,但它对我也不起作用。当我运行测试时, View 永远不会完成执行,我收到一条“发生服务器错误”的消息。有人可以告诉我我做错了什么吗?谢谢你。

View .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})

测试.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)

最佳答案

以下是解决此问题的方法。 James Aylett 在上面提到 session ID 时暗示了解决方案。 jscn 展示了如何设置 session ,但他没有提到 session key 对解决方案的重要性,也没有讨论如何将 session 状态链接到 Selenium 的浏览器对象。

首先,您必须了解,当您创建 session 键/值对(例如 'uid'=1)时,Django 的中间件将在您选择的后端(数据库、文件等)中创建 session 键/数据/到期日期记录。 )。然后,响应对象会将 cookie 中的 session key 发送回客户端的浏览器。当浏览器发送后续请求时,它会发回一个包含该 key 的 cookie,然后中间件将使用该 key 来查找用户的 session 项。

因此,解决方案需要 1.) 找到一种方法来获取创建 session 项时生成的 session key ,然后; 2.) 找到一种方法通过 Selenium 的 Firefox webdriver 浏览器对象将该 key 传递回 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)

关于django - 如何在 Selenium/Django 单元测试中创建 session 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14320873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com