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

使用Selenium测试Django时出现报错但测试通过的问题排查

Django Selenium测试全部通过但控制台报TypeError

报错信息

Traceback (most recent call last):
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/wsgiref/handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "/Users/bav/venv/django/lib/python3.9/site-packages/django/test/testcases.py", line 1723, in __call__
    return super().__call__(environ, start_response)
  File "/Users/bav/venv/django/lib/python3.9/site-packages/django/core/handlers/wsgi.py", line 124, in __call__
    response = self.get_response(request)
  File "/Users/bav/venv/django/lib/python3.9/site-packages/django/test/testcases.py", line 1706, in get_response
    return self.serve(request)
  File "/Users/bav/venv/django/lib/python3.9/site-packages/django/test/testcases.py", line 1718, in serve
    return serve(request, final_rel_path, document_root=self.get_base_dir())
  File "/Users/bav/venv/django/lib/python3.9/site-packages/django/views/static.py", line 34, in serve
    fullpath = Path(safe_join(document_root, path))
  File "/Users/bav/venv/django/lib/python3.9/site-packages/django/utils/_os.py", line 17, in safe_join
    final_path = abspath(join(base, *paths))
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/posixpath.py", line 76, in join
    a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not NoneType

测试代码

class test_incluir_elemento(LiveServerTestCase):

    def setUp(self):
        self.user = User.objects.create_user(username='testuser', password='secretpassword')
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(10)

    def tearDown(self):
        self.driver.close()

    def test_incluir_elemento(self):
        self.driver.get(self.live_server_url)
        login = self.driver.find_element("id", "usuario")
        contrasena = self.driver.find_element("id", "contrasena")
        boton_login = self.driver.find_element("id", "boton-registro")
        login.send_keys("testuser")
        contrasena.send_keys("secretpassword")
        boton_login.click()
        modificar = self.driver.find_element("id", "modificar")
        modificar.click()

问题分析

这个错误的核心是LiveServerTestCase处理静态文件请求时,document_root参数为None,导致路径拼接失败。根源通常是项目的STATIC_ROOT配置未正确设置,或者测试类没有指定有效的静态文件目录。

解决方法

  1. 检查并配置STATIC_ROOT
    在项目的settings.py中确保STATIC_ROOT被设置为有效的路径:

    from pathlib import Path
    
    BASE_DIR = Path(__file__).resolve().parent.parent
    STATIC_ROOT = BASE_DIR / 'staticfiles'
    

    配置完成后,运行python manage.py collectstatic收集静态文件。

  2. 在测试类中临时指定静态目录
    如果不想修改全局配置,可以在测试类中临时创建并指定静态目录:

    from django.conf import settings
    from django.test import LiveServerTestCase
    from django.contrib.auth.models import User
    from selenium import webdriver
    import tempfile
    import shutil
    
    class test_incluir_elemento(LiveServerTestCase):
        @classmethod
        def setUpClass(cls):
            # 创建临时静态目录
            cls.static_root = tempfile.mkdtemp()
            settings.STATIC_ROOT = cls.static_root
            super().setUpClass()
    
        @classmethod
        def tearDownClass(cls):
            # 清理临时目录
            shutil.rmtree(cls.static_root)
            super().tearDownClass()
    
        def setUp(self):
            self.user = User.objects.create_user(username='testuser', password='secretpassword')
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(10)
    
        def tearDown(self):
            self.driver.close()
    
        def test_incluir_elemento(self):
            self.driver.get(self.live_server_url)
            login = self.driver.find_element("id", "usuario")
            contrasena = self.driver.find_element("id", "contrasena")
            boton_login = self.driver.find_element("id", "boton-registro")
            login.send_keys("testuser")
            contrasena.send_keys("secretpassword")
            boton_login.click()
            modificar = self.driver.find_element("id", "modificar")
            modificar.click()
    
  3. 检查页面静态文件引用
    确保模板中所有静态文件都使用{% static %}标签引用,避免硬编码路径导致服务器请求不存在的静态资源:

    <link rel="stylesheet" href="{% static 'css/style.css' %}">
    

内容的提问来源于stack exchange,提问作者Antonio Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:06:00