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

NodeJS环境下使用Selenium在Headless Chrome中下载文件问题求助

解决方案

Chrome传统无头模式(--headless)为独立实现,默认不支持读取下载配置,导致配置不生效。适配方案如下:

方案1(推荐:Chrome 112及以上版本)

新版Chrome推出的--headless=new模式与有头模式行为完全对齐,直接支持下载配置,修改点如下:

  • 替换无头模式启动参数
  • 补全用户偏好的必填下载配置项,避免下载被拦截
  • 提前创建下载目录,确保有写入权限
  • 触发下载后增加等待逻辑,避免提前关闭driver导致下载中断

完整修改后代码:

const path = require('path');
const fs = require('fs');
let downloadPath = path.resolve(`./public`);
// 提前创建下载目录
if (!fs.existsSync(downloadPath)) {
  fs.mkdirSync(downloadPath, { recursive: true });
}

const {Builder, By, Key, until, Capabilities} = require("selenium-webdriver");
const chrome = require("selenium-webdriver/chrome");
let options = new chrome.Options();
options
// 替换为新版无头模式
.addArguments("--headless=new")
.addArguments("--disable-gpu")
.addArguments("--no-sandbox")
.setUserPreferences({
  "download.default_directory": downloadPath,
  "download.prompt_for_download": false,
  "download.directory_upgrade": true,
  "safebrowsing.enabled": false
})
.setChromeBinaryPath(process.env.CHROME_BINARY_PATH)
let serviceBuilder = new chrome.ServiceBuilder(process.env.CHROME_DRIVER_PATH);

let scrape = async() => {
    let driver = await new Builder()
    .forBrowser("chrome")
    .setChromeOptions(options)
    .setChromeService(serviceBuilder)
    .build();

    await driver.get(url);
    await driver.findElement( By.css(download_selector) ).click();

    // 可替换为轮询判断目标文件是否存在的逻辑,确保下载完成
    await driver.sleep(5000);
    await driver.quit();
}

(async() => {
    await scrape();
})();

方案2(兼容Chrome 112以下旧版本)

如果使用旧版本Chrome无法支持新版无头模式,需要在driver初始化完成后、触发下载前,通过DevTools协议手动设置下载行为,添加以下代码即可:

await driver.sendAndExecuteDevToolsCommand('Page.setDownloadBehavior', {
  behavior: 'allow',
  downloadPath: downloadPath
});

内容的提问来源于stack exchange,提问作者Quang Man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 10:54:03