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
相关产品推荐
相关产品推荐

