使用SeleniumWebDriver测试时访问Django的上下文

使用SeleniumWebDriver测试时访问Django的上下文,django,testing,selenium,Django,Testing,Selenium,我想在Django测试中使用Selenium,但我找不到一种访问Django上下文的方法,就像您可以使用它一样 例如,使用测试客户端,我可以查看表单是否有错误以及使用的模板: response = self.client.get('/') self.assertTemplateUsed(response, 'home.html') self.assertEqual(resp.context['form']['code'].errors, [u'This field is required.'])

我想在Django测试中使用Selenium,但我找不到一种访问Django上下文的方法,就像您可以使用它一样

例如,使用测试客户端,我可以查看表单是否有错误以及使用的模板:

response = self.client.get('/')
self.assertTemplateUsed(response, 'home.html')
self.assertEqual(resp.context['form']['code'].errors, [u'This field is required.'])
如果我使用的是Selenium WebDriver,我该怎么做

driver = self.driver
driver.get(self.base_url + "/")
# ???

我能找到的唯一一个解决办法是。你能用Selenium WebDriver替换掉它吗?

下面是一个例子。您可以使用断言方法:

driver = self.driver
driver.get(self.base_url + "/")
# ???
[编辑]请注意,这里您只需调用:getself.live_server_url,这样它就会调用您的索引页,或者LocalHost:8000(例如,如果您在本地计算机上进行测试)


[编辑]您只需为要测试的内容调用对象即可。然后使用断言测试上下文是否在响应的内容中。至少我是这样做的

当Selenium之类的东西得到响应时,有用的上下文内容就会被剥离

不过,您可以编写一个简单的中间件类将其添加回。比如:

class AddContextMiddleware(object):
    def process_response(self, request, response):
         response['debug_stuff'] = str(response.context_data)
         return response
然后您的响应对象将有一个标题debug_stuff,其中包含Django通常提供给中间件的上下文_数据。你可以用硒来检验

重要提示:不要在生产中这样做。在这种背景下,很可能有一些敏感的东西,你不想让世界窥探


这似乎是一件非常有用的事情,如果有人已经为它创建了Django插件,我也不会感到惊讶。您可以查看一下常用的django包站点。

我不确定这是否回答了最初的问题,这更多的是关于如何获取django上下文,而不是响应的呈现内容。您已经对其进行了编辑,以将django对象与呈现HTML的元素进行比较,这是一件非常有用的事情。但是,如果您不知道,当您使用Django内部测试客户端时,它实际上并没有检查Django上下文数据,而是将实际的原始数据(即未在HTML视图上下文中呈现的数据)作为特殊对象添加到响应中。这就是在外部测试客户端或真正的浏览器之前被剥离掉的东西!可以说,使用SeleniumCheat之类的工具进行功能测试,并且只使用内部数据结构,而不是呈现的HTML,这是一个值得怀疑的想法。但有时它可能是一个有用的黑客。如果我在HTML中搜索表单错误消息,它可能会匹配来自不同表单字段的相同错误,或者它可能会匹配帮助文本,如果您得到错误X,请参阅第Y页以了解更多详细信息。我可能会使用CSS选择器来缩小搜索范围,但是后端过程会依赖于前端CSS选择器保持不变。我认为访问Django的上下文是确保正确的表单元素抛出正确错误的唯一可靠方法。好吧,这很聪明,我想它可以正常工作,但我希望它更干净一些。请注意,可能最好是根据上下文或其他内容。似乎将其转换为字符串可能会有问题。+1@joelburton我更喜欢你的答案。我想的是来自对象的上下文,而不是来自html响应的上下文。测试不同的粗骨料。是的,我认为特拉维斯指的是html响应。