【Linux服务器跑Selenium报错?大概率是这个原因】
Selenium新手避坑指南
最近遇到好几个新手问同样的问题:
"我在本地Windows跑Selenium没问题,一放到Linux服务器就各种报错,到底怎么回事?"
这个问题我刚入行时也踩过坑。今天把Linux服务器跑Selenium最常见的5种报错和解决方案整理出来,帮你少走弯路。
▼ Selenium常见报错类型总览
「一、Chrome找不到:No such file or directory」
这是最常见的第一个坑。报错信息通常是:
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.
原因:服务器上根本没装Chrome!
很多人以为装了Selenium包就够了,其实还需要:
1️⃣ 浏览器本身(Chrome/Chromium)
2️⃣ 对应的driver(chromedriver)
解决方案:
# Ubuntu / Debian sudo apt update sudo apt install -y chromium-browser wget https://chromedriver.storage.googleapis.com/114.0.5735.90/chromedriver_linux64.zip unzip chromedriver_linux64.zip sudo mv chromedriver /usr/bin/ sudo chmod +x /usr/bin/chromedriver
验证安装:
which google-chrome which chromedriver
「二、依赖库缺失:error while loading shared libraries」
装完Chrome后运行,又报新错:
error while loading shared libraries: libnss3.so.1: cannot open shared object file
原因:Chrome运行需要一堆系统库,裸机Linux通常没有。
解决方案:一次性安装所有依赖
▼ 系统依赖库安装命令
# Ubuntu / Debian 完整命令 sudo apt install -y \ libnss3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libxkbcommon0 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxrandr2 \ libgbm1 \ libasound2 \ libatspi2.0-0
「三、显示器问题:Cannot find display :0」
这个错误很迷惑:
Error: Cannot find display :0 The browser appears to have exited unexpectedly.
原因:Linux服务器通常没有物理显示器,X11找不到DISPLAY环境变量。
解决方案A:使用Headless模式(推荐)
options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage')解决方案B:使用虚拟显示器Xvfb
sudo apt install -y xvfb # 启动虚拟显示 Xvfb :99 -screen 0 1920x1080x24 & export DISPLAY=:99 # 然后运行测试 python test.py
解决方案C:使用pyvirtualdisplay(Python封装)
pip install pyvirtualdisplay from pyvirtualdisplay import Display display = Display(visible=False, size=(1920, 1080)) display.start() # 运行Selenium代码 driver = webdriver.Chrome(options=options) # ...
「四、沙盒限制:DevToolsActivePort file doesn't exist」
这个错误在root用户下特别常见:
The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.
原因:Chrome的沙盒模式在root用户下会失败。
解决方案:添加--no-sandbox参数
▼ 正确的Selenium启动配置代码
options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') # 关键!root用户必须 options.add_argument('--disable-dev-shm-usage') # 避免共享内存问题 options.add_argument('--disable-gpu')「五、共享内存问题:Chrome crashed unexpectedly」
这个错误比较隐蔽,在高并发或Docker环境中常见:
Chrome failed to start: crashed DevToolsActivePort file doesn't exist
原因:/dev/shm(共享内存)太小,Chrome无法启动。
解决方案A:添加--disable-dev-shm-usage
options.add_argument('--disable-dev-shm-usage')解决方案B:挂载更大的shm(Docker环境)
# docker-compose.yml services: selenium: image: selenium/standalone-chrome:latest shm_size: '2gb' # 关键配置 volumes: - /dev/shm:/dev/shm
▼ Selenium报错排查流程图
「六、终极方案:用Docker彻底避开环境问题」
上面这些问题,本质上都是"环境配置问题"。有没有一劳永逸的办法?
有!用Docker官方镜像,环境100%没问题:
# docker-compose.yml version: '3' services: selenium: image: selenium/standalone-chrome:latest ports: - "4444:4444" shm_size: '2gb' environment: - SE_NODE_MAX_SESSIONS=5
Python代码连接:
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities driver = webdriver.Remote( command_executor='http://localhost:4444/wd/hub', desired_capabilities=DesiredCapabilities.CHROME ) driver.get('https://www.baidu.com') print(driver.title) driver.quit()「七、调试技巧:截图大法」
Headless模式下看不到界面,出错时怎么调试?
技巧1:关键步骤截图
driver.save_screenshot('/tmp/step1_open.png') login_btn = driver.find_element('id', 'login') driver.save_screenshot('/tmp/step2_found_button.png') login_btn.click() driver.save_screenshot('/tmp/step3_after_click.png')技巧2:打印页面源码
print(driver.page_source[:500]) # 打印前500字符
技巧3:设置窗口大小
options.add_argument('--window-size=1920,1080') # 避免元素不可见「八、总结:5分钟检查清单」
下次在Linux服务器跑Selenium遇到问题,按这个清单检查:
✅ Chrome/Chromium已安装
✅ chromedriver在PATH中
✅ 系统依赖库已安装
✅ 使用--headless模式
✅ 添加--no-sandbox(root用户)
✅ 添加--disable-dev-shm-usage
✅ 窗口大小设置正确
记住:90%的报错都是环境配置问题,不是代码问题!
先把环境配好,再调试代码。
💬 你在Linux服务器跑Selenium时遇到过什么奇葩错误?欢迎留言分享~