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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:35:16