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

使用Selenium-Chromedriver在JavaScript中无法完成文件下载

解决思路

1. 排查Docker环境的存储与权限问题

  • 确认Selenium Chrome容器挂载的下载目录权限为读写(如启动容器时加-v /本地下载路径:/home/seluser/Downloads:rw),权限不足会导致下载无法完成。
  • 检查容器内的磁盘空间,避免因空间不足中断下载。

2. 调整Chrome的下载偏好与启动参数

  • 配置Chrome偏好时,关闭下载保护与弹窗,指定明确的下载路径:
    const chromeOptions = new chrome.Options();
    chromeOptions.setUserPreferences({
      'download.default_directory': '/home/seluser/Downloads',
      'download.prompt_for_download': false,
      'download.directory_upgrade': true,
      'safebrowsing.enabled': false,
      'safebrowsing.disable_download_protection': true
    });
    
  • 添加Docker环境必备的启动参数,避免资源冲突:
    chromeOptions.addArguments('--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu');
    

3. 替换固定等待为动态文件检测

  • 不要固定等待90秒,而是轮询下载目录,判断目标文件是否完成(无.crdownload后缀,或文件大小连续几次检测不变):
    const fs = require('fs');
    const path = require('path');
    
    async function waitForDownload(downloadDir, filePattern) {
      let lastSize = -1;
      let stableTicks = 0;
      while (stableTicks < 3) {
        const files = fs.readdirSync(downloadDir);
        // 检查是否有完成的目标文件
        const finishedFile = files.find(f => f.match(filePattern) && !f.endsWith('.crdownload'));
        if (finishedFile) return path.join(downloadDir, finishedFile);
        
        // 检查临时下载文件的大小变化
        const tempFile = files.find(f => f.match(filePattern) && f.endsWith('.crdownload'));
        if (tempFile) {
          const size = fs.statSync(path.join(downloadDir, tempFile)).size;
          if (size === lastSize) {
            stableTicks++;
          } else {
            stableTicks = 0;
            lastSize = size;
          }
        }
        await new Promise(r => setTimeout(r, 1000));
      }
      throw new Error('下载超时或失败');
    }
    

4. 绕过浏览器直接下载

  • 直接通过接口获取最新版本号,拼接下载链接后用HTTP库下载,无需依赖Selenium浏览器:
    const axios = require('axios');
    const fs = require('fs');
    
    async function downloadBridgeDeb() {
      // 示例:从Proton的版本接口获取最新版本号(需替换为实际可用接口)
      const versionResp = await axios.get('https://api.protonmail.ch/bridge/versions/latest');
      const latestVersion = versionResp.data.version;
      const downloadUrl = `https://proton.me/download/bridge/protonmail-bridge_${latestVersion}_amd64.deb`;
      
      const stream = fs.createWriteStream('./protonmail-bridge.deb');
      const resp = await axios.get(downloadUrl, { responseType: 'stream' });
      resp.data.pipe(stream);
      
      return new Promise((resolve, reject) => {
        stream.on('finish', resolve);
        stream.on('error', reject);
      });
    }
    

5. 调整Selenium环境版本

  • 升级selenium-webdriver到最新稳定版(如4.16+),或更换Chrome镜像到更高版本(如120+),部分旧版本组合存在下载兼容性问题。
  • 给Selenium Grid节点分配足够资源(如增加内存),避免浏览器进程因资源不足中断下载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:57:35