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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:06:03