Firefox下用Protractor自动下载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

