如何解决Django+Selenium测试切换语言时的连接错误?
首先明确:Selenium完全支持多语言环境,你的问题和语言无关,错误提示的connectionFailure是重定向后的地址无法访问导致的,核心原因是视图中的重定向逻辑依赖HTTP_REFERER,而在Selenium测试场景下这个值不符合预期。
错误原因拆解
当你直接用driver.get('/set-language/?l=ja')访问语言切换接口时,若没有前置来源页面,request.META.get('HTTP_REFERER', '/')的取值可能不符合测试服务器的实际地址(比如错误信息中重定向到了https://localhost/admin/,但测试服务器可能运行在127.0.0.1加随机端口的地址),导致浏览器无法连接到目标服务器。
另外,Django测试用LiveServerTestCase默认启动随机端口的服务器,直接使用相对路径时,Selenium会拼接测试服务器地址,但重定向依赖的HTTP_REFERER可能指向了不匹配的域名/端口,最终引发连接失败。
解决方案
1. 改用显式next参数替代HTTP_REFERER
修改set_language视图,优先使用next参数指定重定向目标,避免依赖不可靠的HTTP_REFERER:
@login_required def set_language(request): lang = request.GET.get('l', 'en') request.session[settings.LANGUAGE_SESSION_KEY] = lang # 优先使用next参数,其次才是referer或默认首页 next_url = request.GET.get('next', request.META.get('HTTP_REFERER', '/')) response = HttpResponseRedirect(next_url) response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang) return response
测试时直接指定next参数:
driver.get(reverse('set_language') + '?l=ja&next=/')
2. 测试前先访问有效页面,确保HTTP_REFERER正确
在调用语言切换接口前,先访问测试服务器的首页或其他有效页面,让HTTP_REFERER指向测试服务器的正确地址:
# 先访问首页,生成有效referer driver.get(reverse('home')) # 再调用语言切换接口 driver.get(reverse('set_language') + '?l=ja')
3. 使用完整URL而非相对路径
在测试中拼接测试服务器的完整地址,避免路径解析错误:
from django.test import LiveServerTestCase class LanguageTest(LiveServerTestCase): def test_language(self): # 用live_server_url拼接完整请求地址 full_url = f"{self.live_server_url}{reverse('set_language')}?l=ja" driver.get(full_url)
验证方法
修改后运行测试,可在视图中临时打印request.META.get('HTTP_REFERER')和next_url,确认重定向目标是测试服务器的有效地址。
内容的提问来源于stack exchange,提问作者Cerin

