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运行锁定或系统级权限限制:
- 复制原配置文件到新目录:
cp -r /home/username/.mozilla/firefox/n2n9yy4r.default-release /home/username/selenium_firefox_profile - 修改新目录所有权为当前用户:
sudo chown -R username:username /home/username/selenium_firefox_profile - 代码中指向该副本路径:
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:
- 编辑当前用户crontab:
crontab -e - 确保脚本路径、profile路径对当前用户有读写权限
- 若需虚拟显示,确保
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
相关产品推荐
相关产品推荐

