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

如何在JavaScript/Cypress中比较Base64字符串并忽略部分差异

解决Base64字符串因可变跟踪号对比失败的方案

方案一:精准定位并移除可变内容(推荐)

既然明确差异来自动态生成的跟踪号,最可靠的方式是解析PDF内容,将跟踪号替换为固定标识后再对比。

步骤:

  1. 安装PDF解析依赖:
npm install pdf-parse --save-dev
  1. 在测试代码中实现文本归一化对比:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:01:28