使用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配置未正确设置,或者测试类没有指定有效的静态文件目录。
解决方法
检查并配置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收集静态文件。在测试类中临时指定静态目录
如果不想修改全局配置,可以在测试类中临时创建并指定静态目录: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()检查页面静态文件引用
确保模板中所有静态文件都使用{% static %}标签引用,避免硬编码路径导致服务器请求不存在的静态资源:<link rel="stylesheet" href="{% static 'css/style.css' %}">
内容的提问来源于stack exchange,提问作者Antonio Garcia
相关产品推荐
相关产品推荐

