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 = {}
额外检查项
确认geckodriver与Firefox版本匹配:
执行以下命令查看版本:firefox --version geckodriver --version若版本不兼容,可通过Snap商店更新两者:
sudo snap refresh firefox geckodriver权限验证:
确保当前用户对/snap/firefox/current/usr/lib/firefox/firefox有执行权限,默认情况下Snap包会自动配置权限,无需额外修改。
内容的提问来源于stack exchange,提问作者PC-Admin
相关产品推荐
相关产品推荐

