Ubuntu 22全新安装后运行Pytest触发Chrome SingletonLock文件未找到错误
Ubuntu 22下Django测试触发Chrome SingletonLock文件不存在错误
问题描述
在全新安装的Ubuntu 22系统中,Google Chrome可正常安装并运行,但运行Django项目的测试时,pytest抛出文件未找到错误,提示找不到/home/me/.config/google-chrome/SingletonLock。
使用版本
pytest-django==4.5.2pytest==7.2.0
错误信息
FileNotFoundError: [Errno 2] No such file or directory: '/home/me/.config/google-chrome/SingletonLock'
触发错误的测试用例
import pytest from django.urls import reverse @pytest.mark.django_db def test_home_view(client): """ ensure our default home view is accessable and working""" url = reverse('packages') response = client.get(url) print(f" response {response}") assert response.status_code == 200
可正常运行的测试用例
def test_DEBUG_env_var_exists(): if int(DEBUG) > 0: # debug is set to true in localhost pytest.skip("database misconfigured, test skip") assert os.environ.get('DEBUG') is not None
原因分析
这个错误的核心是测试过程中意外触发了依赖Chrome的逻辑:
- 失败的测试用例使用
clientfixture模拟HTTP请求,正常情况下不会关联Chrome,但目标视图packages的代码中很可能包含调用Chrome/无头浏览器的逻辑(比如生成网页截图、渲染页面内容等),当client.get访问该视图时,触发了这部分代码。 SingletonLock是Chrome单实例运行时生成的锁文件,仅当Chrome处于运行状态时才会存在。如果视图代码试图读取这个文件,或者依赖已运行的Chrome进程,而测试环境中未启动Chrome,就会抛出该错误。- 也可能是环境变量配置错误,导致测试代码错误地指向了Chrome的配置路径,进而尝试读取该锁文件。
解决方法
- 排查视图逻辑:检查
packages视图的实现,确认是否有调用Chrome的代码(比如selenium、playwright等工具)。如果存在:- 改为使用无头模式运行Chrome,避免依赖单实例锁文件;
- 在测试中mock掉这部分依赖Chrome的逻辑,不让它实际执行浏览器调用。
- 检查权限与路径:确保运行测试的用户对
/home/me/.config/google-chrome/目录有读写权限(不过Chrome能正常运行的话,这个概率较低)。 - 排查环境变量:测试前打印所有环境变量,确认是否有错误配置的变量指向了Chrome的路径,导致测试时误读锁文件。
- 显式启动Chrome实例:如果测试确实需要运行Chrome,确保测试代码中显式启动Chrome进程,而不是依赖系统中已运行的实例。
内容的提问来源于stack exchange,提问作者rai
相关产品推荐
相关产品推荐

