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

如何用Selenium验证新标签中无URL的动态生成PDF内容?

解决动态生成PDF(about:blank)的内容验证问题

这种场景确实挺让人头疼的——没法直接通过URL拉取PDF,又没有下载权限,不过根据你的测试场景和技术栈,有几个可行的方向:

1. 拦截前端PDF生成的原始数据(适用于前端直接生成PDF的情况)

如果你的应用是通过前端库(比如jsPDF、pdfmake)直接在浏览器里生成PDF,然后用about:blank打开,那你可以在测试中hook前端的生成函数,拿到PDF的原始Blob或Base64数据,不用依赖URL。

比如用Selenium的话,你可以执行JavaScript代码获取生成好的Blob:

// 假设前端生成PDF后把Blob存在了window对象下
String blobBase64 = (String) ((JavascriptExecutor) driver).executeScript("""
    return new Promise((resolve) => {
        const reader = new FileReader();
        reader.onloadend = () => resolve(reader.result.split(',')[1]);
        reader.readAsDataURL(window.generatedPdfBlob);
    });
""");

// 把Base64转成字节流,再传给PDFParser
byte[] pdfBytes = Base64.getDecoder().decode(blobBase64);
ByteArrayInputStream inputStream = new ByteArrayInputStream(pdfBytes);
PDFParser testPDF = new PDFParser(inputStream);
testPDF.parse();
String testText = new PDFTextStripper().getText(testPDF.getPDDocument());

2. 利用浏览器调试协议捕获真实的PDF响应(适用于后端生成后返回的情况)

很多时候,about:blank打开的PDF其实是后端返回的二进制数据,只是前端用Blob URL或者直接在空白页渲染。这种情况下,你可以用**Chrome DevTools Protocol(CDP)**来监听网络请求,捕获PDF的真实响应内容。

比如用Puppeteer(Node.js)的示例:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // 监听所有响应,筛选PDF类型
  page.on('response', async (response) => {
    if (response.headers()['content-type'] === 'application/pdf') {
      const pdfBuffer = await response.buffer();
      // 这里可以把buffer传给Java的PDF解析工具,或者直接用Node.js的PDF库解析
      console.log('捕获到PDF数据');
    }
  });

  await page.goto('你的应用URL');
  await page.click('触发PDF的链接选择器');

  await browser.close();
})();

如果是Java环境,你可以用Selenium配合CDP来实现类似的拦截逻辑。

3. 自动化测试框架的请求拦截功能

如果你用的是Cypress、Playwright这类现代自动化测试框架,它们内置了强大的请求拦截能力,可以直接捕获生成PDF的API请求,拿到响应体:

比如Cypress的示例:

cy.intercept('POST', '/api/generate-pdf').as('pdfRequest');

// 点击触发PDF的链接
cy.get('a.pdf-link').click();

// 等待请求完成,获取响应体
cy.wait('@pdfRequest').then((interception) => {
  const pdfBuffer = interception.response.body;
  // 可以把buffer转成Base64传给后端的Java代码解析,或者用Cypress的插件直接处理
});

关键注意点

  • 先确认PDF的生成方式:是前端纯客户端生成,还是后端返回二进制数据后前端渲染?这会决定你用哪种方案。
  • 如果你用的是Java测试栈,可以结合Selenium + CDP来实现网络请求的捕获,或者通过执行JS获取前端的Blob数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:21