Selenium Firefox驱动无法读取/tmp目录文件进行上传的问题
问题原因及解决方案
问题根源
Kubuntu 22.04.1默认预装的Firefox是Snap包,Snap的沙箱隔离机制会为Firefox进程创建独立的文件系统视图——Firefox内部看到的/tmp是其沙箱专属的临时目录,而非系统全局的/tmp。你在系统全局/tmp创建的文件,Snap版Firefox完全无法访问,因此Selenium调用send_keys时会抛出文件不存在的错误。
而手动选择文件能成功的原因是:系统文件选择器运行在沙箱外,可正常访问全局/tmp,它会把文件内容传递给Firefox,而非让Firefox直接读取/tmp路径。
解决方案
方案1:替换为非Snap版Firefox(推荐)
移除Snap版Firefox,改用Mozilla官方PPA的原生deb包:
sudo snap remove firefox sudo add-apt-repository ppa:mozillateam/ppa sudo apt update sudo apt install firefox
安装完成后,重新运行你的Selenium脚本,系统全局/tmp的文件即可被Firefox正常访问。
方案2:使用Snap有权限访问的临时目录
无需替换Firefox,将测试文件创建在Snap允许访问的目录中,比如用户专属临时目录/run/user/$(id -u)/tmp(该目录属于当前用户,Snap默认有权限访问):
from selenium import webdriver from pathlib import Path import os # 创建用户专属临时目录(不存在则创建) user_tmp_dir = Path(f"/run/user/{os.getuid()}/tmp") user_tmp_dir.mkdir(exist_ok=True) test_file = user_tmp_dir / "my_test_file" test_file.touch() driver = webdriver.Firefox() driver.get("https://viljamis.com/filetest/") driver.find_element('xpath', '//input[@type="file"]').send_keys(str(test_file))
方案3:放宽Snap权限(不推荐)
通过命令给Firefox Snap添加访问外部目录的权限(会降低沙箱安全性):
sudo snap connect firefox:removable-media
该权限原本用于访问可移动存储,但也能让Firefox访问系统全局/tmp,不过不建议长期使用此方法。
内容的提问来源于stack exchange,提问作者wuerfelfreak
相关产品推荐
相关产品推荐

