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

Firefox下用Protractor自动下载PDF失败问题求助

解决Firefox在Protractor E2E测试中自动下载PDF仍弹出“另存为”窗口的问题

针对你遇到的问题,结合你的配置和环境信息,我整理了几个可能的修复点,你可以逐一尝试:

1. 检查PDF的MIME类型是否匹配

很多时候服务器返回的PDF文件MIME类型可能不是application/pdf,而是application/octet-stream或其他变种。Firefox会根据返回的MIME类型判断是否自动保存,所以需要把可能的类型都加入到browser.helperApps.neverAsk.saveToDisk中:

'browser.helperApps.neverAsk.saveToDisk': 'application/pdf,application/octet-stream,application/x-pdf',

2. 修正MacOS下的下载路径配置

MacOS对文件路径的处理可能和Windows/Linux不同,你当前用process.cwd() + "/resources/test/download"可能存在路径解析问题,建议用Node.js的path模块生成绝对路径,确保路径正确且可访问:
首先在文件顶部引入path:

const path = require('path');

然后修改下载路径:

'browser.download.dir': path.resolve(__dirname, '../resources/test/download'),

另外,确保这个目录在测试前已经存在(可以在onPrepare里添加创建目录的代码),避免因为目录创建延迟导致下载失败。

3. 解决Protractor与Selenium版本不兼容问题

你使用的protractor: ~5.4.0和selenium-webdriver: ^4.0.0-alpha.1版本不匹配,Protractor 5.x系列依赖的是Selenium 3.x的稳定版本,Alpha版本的Selenium 4可能存在兼容性bug。建议降级selenium-webdriver到3.x的稳定版,比如:

npm install selenium-webdriver@3.141.59 --save-dev

4. 移除冗余或干扰的Firefox偏好设置

你的配置中有services.sync.prefs.sync.browser.download.useDownloadDir这个同步相关的设置,这可能会干扰本地的下载路径配置,建议移除该选项。同时可以简化一些不必要的设置,保留核心的下载配置即可。

5. 添加下载完成的等待逻辑

测试中点击下载按钮后,需要等待文件完全下载完成再结束测试,否则可能出现文件夹为空的情况。你可以在测试代码中添加等待文件存在的逻辑,比如:

const fs = require('fs');
const downloadPath = path.resolve(__dirname, '../../resources/test/download');
const pdfFilePath = `${downloadPath}/your-file-name.pdf`;

// 点击下载按钮后等待文件出现
browser.wait(() => {
  return fs.existsSync(pdfFilePath);
}, 10000, 'PDF文件未在规定时间内下载完成');

修改后的完整protractor.conf.js示例

const { SpecReporter } = require('jasmine-spec-reporter');
const path = require('path');
const fs = require('fs');

exports.config = {
  allScriptsTimeout: 11000,
  specs: [
    './e2e/**/*.e2e-spec.ts'
  ],
  capabilities: {
    'browserName': 'firefox',
    'moz:firefoxOptions': {
      prefs: {
        'browser.download.folderList': 2,
        'browser.download.dir': path.resolve(__dirname, '../resources/test/download'),
        'browser.download.useDownloadDir': true,
        'browser.download.manager.alertOnEXEOpen': false,
        'browser.download.manager.closeWhenDone': true,
        'browser.download.manager.focusWhenStarting': false,
        'browser.download.manager.showWhenStarting': false,
        'browser.helperApps.alwaysAsk.force': false,
        'browser.download.manager.showAlertOnComplete': false,
        'browser.download.manager.useWindow': false,
        'browser.helperApps.neverAsk.saveToDisk': 'application/pdf,application/octet-stream,application/x-pdf',
      },
    },
  },
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  },
  onPrepare() {
    // 确保下载目录存在
    const downloadDir = path.resolve(__dirname, '../resources/test/download');
    if (!fs.existsSync(downloadDir)) {
      fs.mkdirSync(downloadDir, { recursive: true });
    }

    require('ts-node').register({ project: 'e2e/tsconfig.e2e.json' });
    require("zone.js/dist/zone-node");
    require("zone.js/dist/long-stack-trace-zone");
    require("zone.js/dist/async-test");
    require("zone.js/dist/fake-async-test");
    require("zone.js/dist/sync-test");
    require("zone.js/dist/proxy");
    require("zone.js/dist/jasmine-patch");
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
  }
};

你可以按照上面的步骤逐一调整,应该能解决Firefox弹出“另存为”窗口且下载文件夹为空的问题。

内容的提问来源于stack exchange,提问作者crazy-ace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:48:19