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

TestCafe 1.16.0下载PDF后加载触发E70内部错误求助

TestCafe 1.16.0(Guidewire GT:UI环境)E70内部错误解决与规避方案

问题背景

在Guidewire测试框架GT:UI中,使用TestCafe 1.16.0(无法升级)编写PDF下载及解析测试用例时,触发TestCafe内部E70错误。已排查变量配置、依赖安装无误,尝试过t.wait、原生setTimeout等待下载、--skip-js-errors参数及相关方案,问题仍未解决。

报错代码片段

const pdfData = world.PdfDataList4RPVpwaacdc[0];  
pdfData.data.id = 'SubmissionWizard-XXXXXXX-XXXXXXXX-XXXXXXXXX-0-NameLink';  
try {
  const elementHTML = Selector(`#${pdfData.data.id}`);
  await t.expect(elementHTML.exists).ok();
  await t.expect(elementHTML.textContent).contains(pdfData.docType);
  console.log(`'${pdfData.docType}' found`);  
  await t.setNativeDialogHandler(() => true);
  await t.click(elementHTML);

  // 问题代码行(第360行)
  await new Promise(resolve => setTimeout(resolve, 5000));

  const filePath = (await t.getNativeDialogHistory())[0].downloadPath;
  const pdfBuffer = await fs.promises.readFile(filePath);

  // 计划使用pdf-lib分析PDF文件
  // 以下是使用pdf-lib读取PDF文本的示例:
  const { PDFDocument } = require('pdf-lib');
  const pdfDoc = await PDFDocument.load(pdfBuffer);
  const pages = pdfDoc.getPages();
  let pdfText = '';
  for (let i = 0; i < pages.length; i++) {
  const page = pages[i];
  const pageText = await page.getText();
  pdfText += pageText + '\n';
}
console.log(`PDF text: ${pdfText}`);

} catch (error) {
console.error(error);
}

错误详情

'Étude' found
{
  code: 'E70',
  isTestCafeError: true,
  callsite: CallsiteRecord {
    filename: 'C:\\Guidewire\\guidewiretestingframework\\gt-ui\\policysolutions\\XXXXXXXXXXXXXXXX.js',
    lineNum: 360,
    callsiteFrameIdx: 4,
    stackFrames: [
      [Object], [Object],
      [Object], [Object],
      [Object], CallSite {},
      [Object], [Object],
      [Object]
    ],
isV8Frames: true
  }
}

解决方案与规避建议

1. 替换原生Promise为TestCafe原生t.wait()

TestCafe 1.16.0对原生异步Promise的兼容性较差,尤其是在Guidewire GT:UI的封装环境下,容易触发内部上下文冲突。将问题行的原生Promise等待替换为TestCafe提供的t.wait():

// 替换原问题代码行
await t.wait(5000);

2. 避开getNativeDialogHistory(),改用文件轮询获取路径

TestCafe 1.16.0的getNativeDialogHistory()在GT:UI环境中存在上下文泄漏问题,是触发E70的核心原因之一。改用轮询目标下载目录的方式确认文件是否完成下载:

await t.click(elementHTML);

// 提前配置TestCafe的下载目录(确保权限正确)
const downloadDir = 'C:\\你的下载目录路径'; 
let filePath = null;
let attempts = 0;
const maxAttempts = 20; // 最多等待10秒(每次间隔500ms)

// 轮询查找目标PDF文件
while (attempts < maxAttempts) {
  const files = await fs.promises.readdir(downloadDir);
  // 根据文件名特征匹配(例如包含文档类型、以.pdf结尾)
  const targetFile = files.find(file => file.includes(pdfData.docType) && file.endsWith('.pdf'));
  
  if (targetFile) {
    filePath = path.join(downloadDir, targetFile);
    break;
  }
  
  await t.wait(500);
  attempts++;
}

if (!filePath) {
  throw new Error(`PDF文件下载超时,未找到匹配文件: ${pdfData.docType}`);
}

// 后续读取和解析PDF逻辑不变
const pdfBuffer = await fs.promises.readFile(filePath);

3. 添加额外错误捕获与TestCafe参数调整

  • 在命令行启动测试时添加--skip-uncaught-errors参数,覆盖--skip-js-errors的局限性,跳过TestCafe内部未捕获的错误。
  • 在PDF解析逻辑外层添加额外的try-catch块,隔离TestCafe测试上下文与第三方库的异步操作:
try {
  const { PDFDocument } = require('pdf-lib');
  const pdfDoc = await PDFDocument.load(pdfBuffer);
  // ... 后续解析逻辑
} catch (parseError) {
  console.error('PDF解析失败:', parseError);
}

4. 调整测试流程顺序

将PDF解析逻辑移至TestCafe测试流程的最后,或使用TestCafe的run()方法独立执行解析步骤,避免与测试上下文的异步操作冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 18:24:56