Cypress如何强制PDF文件直接下载而非在新标签页打开?
解决方案
方案1:强制配置run模式下Chrome的PDF下载偏好
npx cypress run模式不会读取本地Chrome的默认配置,需要在Cypress配置文件中通过before:browser:launch钩子主动注入Chrome偏好设置,覆盖默认的PDF阅读器行为:
const { defineConfig } = require('cypress') const path = require('path') module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { on('before:browser:launch', (browser, launchOptions) => { // 适配所有Chromium内核浏览器(Chrome、Edge等) if (browser.family === 'chromium' && browser.name !== 'electron') { // 配置下载偏好 launchOptions.preferences.default['download'] = { default_directory: path.resolve('./cypress/downloads'), prompt_for_download: false, } // 强制PDF使用外部程序打开(即直接下载) launchOptions.preferences.default['plugins'] = { always_open_pdf_externally: true, } // 禁用Chrome内置PDF阅读器 launchOptions.args.push('--disable-pdf-viewer') return launchOptions } }) // 此处保留你之前实现的pdf-parse相关cy.task逻辑 }, }, })
配置完成后执行npx cypress run --browser chrome时,PDF会直接下载到指定目录,你已有的文件校验逻辑可直接复用。
方案2:拦截PDF请求直接解析(更稳定,无环境依赖)
不需要依赖浏览器下载行为,直接通过cy.intercept拦截生成PDF的接口请求,拿到二进制响应体后直接传给pdf-parse解析,适配所有运行模式,也完全满足第三方不可控应用的测试需求:
it('校验PDF包含指定信息', () => { // 提前拦截PDF请求,根据实际情况修改请求方法和路由匹配规则 cy.intercept('GET', '/api/generate-pdf/**').as('getPdf') // 点击生成PDF的按钮 cy.get('#generate-pdf-button').click() // 等待PDF请求返回 cy.wait('@getPdf').then(({response}) => { // 将二进制响应转成Buffer const pdfBuffer = Buffer.from(response.body) // 调用已实现的PDF解析task cy.task('parsePdf', pdfBuffer).then(pdfText => { // 校验PDF内容 expect(pdfText).to.include('期望的目标信息') }) }) })
该方案无需处理本地文件读写、下载等待、文件重名等问题,稳定性远高于依赖浏览器下载的方案。
内容的提问来源于stack exchange,提问作者Enrique Ortiz
相关产品推荐
相关产品推荐

