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
相关产品推荐
相关产品推荐

