【发布时间】:2012-12-28 13:21:00
【问题描述】:
我正在尝试编写一个使用 Selenium 来测试 Django 视图的功能测试。当用户来到一个页面(“page2”)时,呈现该页面的视图期望找到一个会话变量“uid”(用户 ID)。我已经阅读了六篇关于如何做到这一点的文章,但没有一篇对我有用。下面的代码显示了 Django documentation 说它应该如何完成,但它对我也不起作用。当我运行测试时,视图永远不会完成执行,并且我收到“发生服务器错误”消息。有人可以告诉我我做错了什么吗?谢谢。
views.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)
【问题讨论】:
-
我看不到您在会话中设置 uid 的位置,它应该类似于 request.session['uid'] = uid。从 session 中恢复 uid 的方式是可以的,所以如果你在 session 上设置 uid 是正确的,那么这不是 session 变量的问题。
-
(我认为)我正在将 uid 添加到我的会话状态中,上面的 setUp 函数的最后一行:self.session['uid'] = 1。
-
嗯,有一个简单的方法来测试它。在您看来,尝试从会话中获取 uid,如下所示:uid = request.session.get('uid', None),然后打印或记录 uid 变量并查看 uid 是否为 None,这是 case key 'uid' 的默认值在会话中找不到。
-
经过大量在线研究,我发现了如何做到这一点。但是,它确实要求您使用 Django 的 TestCase 类而不是 Selenium 的 webdriver 类。我怀疑 webdriver 的浏览器对象和 Django 允许您创建的会话状态之间存在脱节。如果确实如此,它会对我的测试产生负面影响,因为这意味着我不能使用 Selenium 来测试任何假设初始会话状态的页面。因此,我仍然希望找到一些解决方案。
-
@Robert 在类似情况下(非 Django) 我已经为测试框架设置了特殊的 URL,以便将内容插入会话。不愉快,但确实有效。或者,您可以通过 selenium 驱动程序找出会话 ID(一旦打开第一页),然后在测试代码中查找(并更改)该会话。
标签: django django-views selenium-webdriver