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

Cypress测试遍历XLSX文件报Cannot read properties of undefined如何解决

报错解决方案

核心错误原因

  • 变量名重复覆盖:循环内用var jsonData = jsonData[index].data直接覆盖了外层parseXlsx返回的原始解析结果,第二次循环时访问的已经是被覆盖后的行数据数组,不存在data属性,直接触发undefined报错。
  • 数据结构认知偏差:node-xlsx解析xlsx后返回的结构为工作表数组,格式如下:
[
  {
    name: '工作表1名称',
    data: [ // 工作表内所有行数据,是二维数组
      ['USERNAME', 'PASSWORD'], // 第一行表头
      ['Username1', 'Password1'], // 第二行数据
      ['Username2', 'Password2'] // 第三行数据
    ]
  }
]

行数据本身是普通数组,没有data属性,你之前的调用逻辑完全不符合数据结构。

  • 循环逻辑错误:每次循环都调用cy.writeFile会持续覆盖文件内容,且每次都固定取第一行的值,最终输出结果不符合预期。

修改后的spec.js代码

describe('convert data to Json', () => {
    it('read data from excel', () => {
        cy.parseXlsx('cypress/fixtures/excelData.xlsx').then((excelParseResult) => {
            // 取第一个工作表的行数据
            const sheetRows = excelParseResult[0].data
            const userList = []
            // 跳过表头,从第二行(index=1)开始遍历
            for (let index = 1; index < sheetRows.length; index++) {
                const row = sheetRows[index]
                console.log('当前行数据:', row)
                // 组装用户数据
                userList.push({
                    username: row[0],
                    password: row[1]
                })
            }
            // 所有数据组装完成后一次性写入文件
            cy.writeFile("cypress/fixtures/xlsxData.json", userList)
        })
    })
})

代码修改说明

  1. 避免变量名冲突:将外层解析结果变量名改为excelParseResult,和内部变量完全区分,不会出现覆盖问题。
  2. 适配数据结构:直接取第一个工作表的data属性作为行数组遍历,不需要重复访问data属性。
  3. 优化读写逻辑:先把所有行数据组装成用户数组,最后一次性写入JSON文件,不会出现内容覆盖问题,输出的JSON文件会包含所有行的用户数据。
  4. 跳过表头处理:遍历从index=1开始,自动忽略第一行的表头内容,不会把USERNAME/PASSWORD作为业务数据写入文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:05