如何在JavaScript/Cypress中比较Base64字符串并忽略部分差异
解决Base64字符串因可变跟踪号对比失败的方案
方案一:精准定位并移除可变内容(推荐)
既然明确差异来自动态生成的跟踪号,最可靠的方式是解析PDF内容,将跟踪号替换为固定标识后再对比。
步骤:
- 安装PDF解析依赖:
npm install pdf-parse --save-dev
- 在测试代码中实现文本归一化对比:
const pdfParse = require('pdf-parse'); // 根据实际跟踪号格式定义替换规则,示例为16位数字 function normalizePdfContent(base64Str) { const buffer = Buffer.from(base64Str, 'base64'); return pdfParse(buffer).then(data => { // 替换所有匹配格式的跟踪号为固定占位符 return data.text.replace(/\d{16}/g, '[FIXED_TRACKING_PLACEHOLDER]'); }); } // API返回的Base64 const base64FromAPI = res.body.completedShipments[0].completedPackages[0].documents[0].image; // 对比归一化后的文本 cy.readFile(`cypress/e2e/Testdata/Canada Post 02StoreId.pdf`, "base64") .then(normalizePdfContent) .then(normalizedLocalText => { normalizePdfContent(base64FromAPI).then(normalizedApiText => { expect(normalizedApiText).to.eq(normalizedLocalText); }); });
方案二:基于相似度阈值对比
如果无法精准定位差异位置,可以通过计算两个Base64字符串的相似度,设置合理阈值(如95%)来兼容小范围差异。
实现代码:
// 计算Levenshtein距离,用于推导相似度 function levenshteinDistance(a, b) { const matrix = Array.from({ length: a.length + 1 }, () => Array(b.length + 1).fill(0)); for (let i = 0; i <= a.length; i++) matrix[i][0] = i; for (let j = 0; j <= b.length; j++) matrix[0][j] = j; for (let i = 1; i <= a.length; i++) { for (let j = 1; j <= b.length; j++) { matrix[i][j] = a[i-1] === b[j-1] ? matrix[i-1][j-1] : Math.min(matrix[i-1][j], matrix[i][j-1], matrix[i-1][j-1]) + 1; } } return matrix[a.length][b.length]; } // 计算相似度百分比 function getSimilarity(str1, str2) { const longer = str1.length > str2.length ? str1 : str2; const shorter = str1.length > str2.length ? str2 : str1; if (longer.length === 0) return 100; const matchRatio = (longer.length - levenshteinDistance(longer, shorter)) / longer.length; return Math.round(matchRatio * 100); } // 执行对比 cy.readFile(`cypress/e2e/Testdata/Canada Post 02StoreId.pdf`, "base64").then(localBase64 => { const similarity = getSimilarity(localBase64, base64FromAPI); // 设定相似度阈值,可根据实际情况调整 expect(similarity).to.be.gte(95); });
方案三:直接替换Base64字节流中的可变部分(进阶)
如果明确跟踪号在PDF字节流中的固定位置,可以直接修改Base64对应的字节内容,但需要提前分析字节偏移量,仅适合对PDF结构非常熟悉的场景,通用性较低。
内容的提问来源于stack exchange,提问作者Srinidhi Reddy Palwai
相关产品推荐
相关产品推荐

