Cypress表格多规则排序校验报错:期望数组深度相等
修复Cypress表格排序校验的解决方案
核心问题分析
- 数组拆分逻辑错误:原代码把所有单元格的文本合并后用
split(/\s+/)拆分,会把带空格的公司名称(比如"ABC Corp")拆成多个数组元素,完全破坏了数据结构,这是触发expected [Array(14)] to deeply equal [Array(14)]的主要原因。 - 未实现货币优先级规则:原代码仅处理了基础字母排序,未按要求实现TND优先、其次欧元、美元,剩余按字母排序的规则。
修复后的代码实现
1. 公司名称按字母顺序排序校验
// 正确收集每一行的公司名称,避免拆分带空格的名称 cy.get('#accounts-list-table tbody tr') .find(`td:eq(${companyColumnIndex})`) .each(($td) => Cypress.$($td).text().trim()) // 遍历每个单元格,提取清洗后的文本 .then(companyNamesArray => { cy.log('当前表格的公司名称顺序:', companyNamesArray); if (companyNamesArray.length === 0) { cy.log('警告:公司列无内容'); expect(true).to.be.true; // 空状态下标记测试通过 return; } // 生成按字母排序后的预期数组 const sortedByCompany = [...companyNamesArray].sort((a, b) => a.localeCompare(b)); cy.log('预期的字母排序顺序:', sortedByCompany); // 校验当前表格顺序是否符合字母排序规则 expect(companyNamesArray).to.deep.equal(sortedByCompany); });
2. 货币列按自定义优先级排序校验
假设货币列索引为currencyColumnIndex,实现TND > EUR > USD > 其余按字母排序的规则:
// 定义货币优先级权重,数值越大优先级越高 const currencyPriority = { 'TND': 3, 'EUR': 2, 'USD': 1 }; cy.get('#accounts-list-table tbody tr') .find(`td:eq(${currencyColumnIndex})`) .each(($td) => Cypress.$($td).text().trim()) .then(currencyArray => { cy.log('当前表格的货币顺序:', currencyArray); if (currencyArray.length === 0) { cy.log('警告:货币列无内容'); expect(true).to.be.true; return; } // 生成符合自定义优先级的排序数组 const sortedByCurrency = [...currencyArray].sort((a, b) => { const priorityA = currencyPriority[a] || 0; const priorityB = currencyPriority[b] || 0; // 优先级不同时,权重大的排前面 if (priorityA !== priorityB) { return priorityB - priorityA; } // 优先级相同时按字母顺序排序 return a.localeCompare(b); }); cy.log('预期的货币排序顺序:', sortedByCurrency); // 校验当前表格顺序是否符合自定义规则 expect(currencyArray).to.deep.equal(sortedByCurrency); });
额外调试建议
- 在校验前打印当前数组和预期数组的具体内容,快速定位差异点
- 如果表格支持升/降序切换,需根据当前排序方向调整
sort函数的返回值(比如降序时反转排序结果)
内容的提问来源于stack exchange,提问作者Eya Dimessi
相关产品推荐
相关产品推荐

