You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:09:51