如何将Excel读取的日期转换为TestCafe可正常输入的合法字符串
Excel日期数据适配TestCafe输入解决方案
问题根因
- Excel底层默认将日期存储为以1900年1月1日为第1天的数字序列,你读取到的44416这类值就是原始序列值,直接转字符串无法匹配表单输入要求
- 常规Excel读取库默认返回单元格原始值而非显示格式的字符串,你设置8/20/2021格式后读取到undefined,是因为工具没有做自动转换,或者列名映射/单元格空值导致的取值异常
处理步骤
1. 配置Excel读取工具自动转换日期为JS Date对象
常用的Excel读取库都支持直接转换日期序列值为标准JS Date对象,无需手动计算:
- 若使用
xlsx库,读取文件时开启cellDates: true配置即可自动转换:
const XLSX = require('xlsx') // 核心配置项cellDates设为true const workbook = XLSX.readFile('回归测试用例.xlsx', { cellDates: true, raw: false }) const testDataSheet = XLSX.utils.sheet_to_json(workbook.Sheets['测试数据'])
- 若使用
exceljs库,直接读取单元格的value属性即可自动得到Date类型值
2. 封装日期格式化工具适配表单输入要求
拿到Date对象后,根据你的表单支持的输入格式(比如MM/DD/YYYY、YYYY-MM-DD等),封装统一格式化方法,避免依赖Excel单元格格式导致的环境差异:
// 示例:转换为MM/DD/YYYY格式的字符串,可根据你的表单要求修改格式 function formatDateForInput(date) { // 异常值判断,避免传入undefined触发TestCafe报错 if (!date || !(date instanceof Date) || isNaN(date.getTime())) { throw new Error('无效的日期数据,请检查Excel对应单元格内容') } const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') const year = date.getFullYear() return `${month}/${day}/${year}` }
3. 修改TestCafe输入逻辑
修改报错的typeText调用代码,传入格式化后的日期字符串:
await t .click(staffMembers.startDateField) .pressKey('delete '.repeat(11).trim()) // 简化清空逻辑,效果和你原来的11次delete一致 .typeText(staffMembers.startDateField, formatDateForInput(data.StartDate))
undefined报错额外排查点
如果修改后还是出现text参数为undefined的报错,优先检查以下两点:
- 对应测试用例行的StartDate列单元格是否为空
- Excel转JSON时的列名映射是否正确,
data.StartDate的字段名是否和Excel表头完全一致(大小写、空格都会导致取值异常)
内容的提问来源于stack exchange,提问作者Brandon Short
相关产品推荐
相关产品推荐

