Selenium-WebDriver脚本无法加载本地文件:Ubuntu版本差异问题
问题:Node.js Selenium脚本在Ubuntu 22.04无法加载本地HTML文件
我写了一段用Selenium加载Chrome的Node.js脚本,在Ubuntu 18.04上能正常运行,但到Ubuntu 22.04就加载不了本地文件。想问问是不是有影响本地文件加载语法的重大变更,还是我的代码有问题?
我的代码如下:
const { Builder } = require('selenium-webdriver') async function start() { const chrome = require('selenium-webdriver/chrome') const options = new chrome.Options() options.addArguments('--disable-dev-shm-usage') options.addArguments('--no-sandbox') const driver = new Builder() .forBrowser('chrome') .setChromeOptions(options) .build() await driver.get('file://' + __dirname + '/myfile.html') await driver.sleep(10000) const text = await driver.executeScript('return document.documentElement.innerText') console.log(text) driver.quit() } start()
运行后报错:
Your file couldn’t be accessed It may have been moved, edited or deleted. ERR_FILE_NOT_FOUND
我确认myfile.html确实存在,用console.log输出的文件路径在新旧系统里完全一致。把driver.get的参数换成网站就能正常输出内容。
失败环境:
- Ubuntu 22.04.1 LTS
- Node v16.15.0
- Chromium 108.0.5359.71 snap
正常环境:
- Ubuntu 18.04.6 LTS
- Node v16.15.0
- Chromium 107.0.5304.87(基于Ubuntu构建,运行在18.04)
解决方案
1. 解决Snap版Chromium的沙箱限制
Ubuntu 22.04默认的Chromium是Snap包,Snap的沙箱机制默认限制了文件访问权限——这是和18.04用Deb版Chromium的核心差异。
方案A:切换到Deb版Chromium
卸载Snap版:
sudo snap remove chromium
添加PPA安装Deb版:
sudo add-apt-repository ppa:saiarcot895/chromium-beta sudo apt update sudo apt install chromium-browser
方案B:给Snap版Chromium开放权限
如果不想换版本,可赋予其访问用户目录的权限:
sudo snap connect chromium:home :home
若需访问外部存储目录,先安装辅助工具再授权:
sudo apt install snapd-xdg-open snap connect chromium:removable-media
2. 修正File URL的格式
手动拼接file://容易出现路径格式错误,Linux下标准的本地文件URL应为file:///(三个斜杠),建议用Node.js内置模块生成标准URL:
修改代码中driver.get的部分:
const path = require('path'); const url = require('url'); // 生成标准的本地文件URL const filePath = path.resolve(__dirname, 'myfile.html'); const fileUrl = url.pathToFileURL(filePath).href; await driver.get(fileUrl);
url.pathToFileURL会自动处理跨平台路径格式,避免手动拼接的错误。
3. 匹配ChromeDriver与Chromium版本
Chromium 108需要对应版本的ChromeDriver,若Selenium自带的驱动版本不匹配也会导致问题:
方式一:手动指定驱动路径
下载对应108版本的ChromeDriver,然后在代码中指定:
const chrome = require('selenium-webdriver/chrome'); const service = new chrome.ServiceBuilder('/path/to/chromedriver-108').build(); const driver = new Builder() .forBrowser('chrome') .setChromeOptions(options) .setChromeService(service) .build();
方式二:用包自动管理驱动
安装chromedriver包自动匹配版本:
npm install chromedriver --save-dev
在代码开头引入:
require('chromedriver');
内容的提问来源于stack exchange,提问作者fooquency
相关产品推荐
相关产品推荐

