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

Ubuntu22下Selenium调用Firefox报错‘binary is not a Firefox executable’求助

解决Ubuntu 22.04 Snap版Firefox与Selenium兼容性问题

问题描述

原本在Debian 12上运行正常的Python Selenium脚本,迁移到Ubuntu 22.04后因系统默认的Firefox和geckodriver为Snap版本,执行时抛出InvalidArgumentException: Message: binary is not a Firefox executable错误。

原始代码

class search_jobs():
  def setup_method(self, method):
    self.driver = webdriver.Firefox()
    self.vars = {}

首次执行报错

$ python3 ./job-apply.py 
Do you want to skip ahead to the interactive job applications? (y/n): n
Traceback (most recent call last):
  File "/mnt/Piracy/job-apply/./job-apply.py", line 537, in <module>
    job_search.setup_method('Firefox')
  File "/mnt/Piracy/job-apply/./job-apply.py", line 70, in setup_method
    self.driver = webdriver.Firefox()
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/firefox/webdriver.py", line 67, in __init__
    super().__init__(command_executor=executor, options=options)
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 206, in __init__
    self.start_session(capabilities)
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 290, in start_session
    response = self.execute(Command.NEW_SESSION, caps)["value"]
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 345, in execute
    self.error_handler.check_response(response)
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidArgumentException: Message: binary is not a Firefox executable

尝试显式指定路径后的代码

from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options

class search_jobs():
  def setup_method(self, method):
    # Specify the path to geckodriver
    geckodriver_path = '/snap/bin/geckodriver'
    firefox_path = '/snap/bin/firefox'

    driver_service = Service(executable_path=geckodriver_path)

    options = Options()
    options.binary_location = firefox_path

    self.driver = webdriver.Firefox(service=driver_service, options=options)
    self.vars = {}

修改后仍报错

$ python3 ./job-apply.py 
Do you want to skip ahead to the interactive job applications? (y/n): n
/mnt/Piracy/job-apply/./job-apply.py:72: DeprecationWarning: Firefox will soon stop logging to geckodriver.log by default; Specify desired logs with log_output
  driver_service = Service(executable_path=geckodriver_path)
Traceback (most recent call last):
  File "/mnt/Piracy/job-apply/./job-apply.py", line 545, in <module>
    job_search.setup_method('Firefox')
  File "/mnt/Piracy/job-apply/./job-apply.py", line 77, in setup_method
    self.driver = webdriver.Firefox(service=driver_service, options=options)
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/firefox/webdriver.py", line 67, in __init__
    super().__init__(command_executor=executor, options=options)
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 206, in __init__
    self.start_session(capabilities)
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 290, in start_session
    response = self.execute(Command.NEW_SESSION, caps)["value"]
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 345, in execute
    self.error_handler.check_response(response)
  File "/home/pcadmin/.local/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidArgumentException: Message: binary is not a Firefox executable

解决方案

问题核心在于:Ubuntu 22.04的Snap版Firefox中,/snap/bin/firefox是一个启动脚本而非实际的浏览器二进制文件,Selenium无法识别该脚本作为可执行程序。需要指定Snap包内真实的Firefox二进制路径:

修正后的代码

from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options

class search_jobs():
  def setup_method(self, method):
    # Snap版Firefox的实际二进制路径
    geckodriver_path = '/snap/bin/geckodriver'
    firefox_path = '/snap/firefox/current/usr/lib/firefox/firefox'

    driver_service = Service(executable_path=geckodriver_path)

    options = Options()
    options.binary_location = firefox_path
    # 可选:添加参数避免沙箱权限问题
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')

    self.driver = webdriver.Firefox(service=driver_service, options=options)
    self.vars = {}

额外检查项

  1. 确认geckodriver与Firefox版本匹配:
    执行以下命令查看版本:

    firefox --version
    geckodriver --version
    

    若版本不兼容,可通过Snap商店更新两者:sudo snap refresh firefox geckodriver

  2. 权限验证:
    确保当前用户对/snap/firefox/current/usr/lib/firefox/firefox有执行权限,默认情况下Snap包会自动配置权限,无需额外修改。

内容的提问来源于stack exchange,提问作者PC-Admin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:16:03