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

Selenium(Python+Firefox)无法写入Firefox配置文件:权限错误求助

Selenium加载Firefox配置文件遇权限拒绝错误

错误提示

selenium.common.exceptions.SessionNotCreatedException: Message: Failed to set preferences: Unable to write Firefox profile: Permission denied (os error 13)

所用代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.firefox.options import Options
from datetime import datetime

f = open("/home/username/Documents/AH/log2.txt", "a")
f.write('gestart')
f.close()

# I use the below code when I use crontab, read below..
#from pyvirtualdisplay import Display
#display = Display(visible=0, size=(2880, 1800)).start()

website = "https://www.ah.nl/"
options=Options()
options.add_argument('-profile')
options.add_argument(r'/home/username/.mozilla/firefox/n2n9yy4r.default-release') 

driver = webdriver.Firefox(options=options, service_log_path="/home/username/geckodriver.log")

driver.implicitly_wait(20)
driver.get(website)

tijd = WebDriverWait(driver,40).until(EC.presence_of_element_located((By.XPATH,"//*[@id='navigation-header']/div[1]/div[1]/div/div/p/a")))
tijdbezorging = tijd.text

driver.close()
driver.quit()

f = open("/home/username/Documents/AH/testlog.txt", "a")
f.write(tijdbezorging)
f.close()

完整错误输出

SendAHStatus.py:46: DeprecationWarning: service_log_path has been deprecated, please pass in a Service object
  driver = webdriver.Firefox(options=options, service_log_path="/home/username/geckodriver.log")
/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.12) or chardet (3.0.4) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
  File "SendAHStatus.py", line 46, in <module>
    driver = webdriver.Firefox(options=options, service_log_path="/home/username/geckodriver.log")
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/firefox/webdriver.py", line 197, in __init__
    super().__init__(command_executor=executor, options=options, keep_alive=True)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 288, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 381, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 444, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py", line 249, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: Failed to set preferences: Unable to write Firefox profile: Permission denied (os error 13)

问题背景

  • 代码通过sudo crontab -e调度时可正常运行,去掉profile参数后普通命令行也能运行
  • 尝试更换profile路径(如/home/username/profiledir),仅sudo crontab下可运行
  • 通过Firefox的about:profiles创建新配置文件,给文件夹赋予所有用户(包括当前用户odroid)全部权限,问题依旧
  • 使用sudo python3 myscript.py运行时提示:
Running Firefox as root in a regular user's session is not supported.  ($XAUTHORITY is /home/username/.Xauthority which is owned by username.)
  • 修改XAUTHORITY所有权为root虽能运行,但不想采用这种方式
  • 已确认webdriver正常工作,问题源于权限,仅高权限下可运行

环境信息

  • Selenium 4.6.0
  • Python 3.8
  • Firefox 107.0
  • Ubuntu 20.04.5 LTS

解决方案

方案1:使用配置文件副本而非原文件

Selenium加载配置文件时会修改其中的文件,原用户配置文件可能存在Firefox运行锁定或系统级权限限制:

  1. 复制原配置文件到新目录:
    cp -r /home/username/.mozilla/firefox/n2n9yy4r.default-release /home/username/selenium_firefox_profile
    
  2. 修改新目录所有权为当前用户:
    sudo chown -R username:username /home/username/selenium_firefox_profile
    
  3. 代码中指向该副本路径:
    options.add_argument(r'/home/username/selenium_firefox_profile')
    

方案2:使用FirefoxProfile类加载配置

替代直接用Options.add_argument,改用Selenium专用类处理配置文件(Selenium 4.x兼容,虽标记为过时但仍可使用):

from selenium.webdriver.firefox.firefox_profile import FirefoxProfile

profile = FirefoxProfile('/home/username/.mozilla/firefox/n2n9yy4r.default-release')
driver = webdriver.Firefox(firefox_profile=profile, options=options)

方案3:使用用户级crontab替代sudo crontab

避免root运行Firefox的限制,改用当前用户的crontab:

  1. 编辑当前用户crontab:
    crontab -e
    
  2. 确保脚本路径、profile路径对当前用户有读写权限
  3. 若需虚拟显示,确保pyvirtualdisplay安装在当前用户环境中(而非root环境)

方案4:修复原配置文件深层权限

检查配置文件目录下隐藏文件的权限,确保所有文件归当前用户所有:

sudo chown -R username:username /home/username/.mozilla/firefox/n2n9yy4r.default-release/
sudo chmod -R u+rw /home/username/.mozilla/firefox/n2n9yy4r.default-release/

内容的提问来源于stack exchange,提问作者Steve de Peijper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:45:31