- 点击可信验证增加两类生效旁证: 页面跳转/新开标签页(淘宝搜索按钮), 点击后元素整体消失(关闭登录弹窗); 此前均被误报为"目标未收到可信点击" 并在节点超时内反复重试, 造成"点击生效却等很久还报错" - 相似元素列表引用增加 index 序号: 动态id泛化后各卡片选择器相同, 46 条引用全部命中第一张卡导致抓取结果全重复; 修复 NodeList 无 indexOf 的 TypeError 被静默吞掉导致序号从未写入 - 元素定位改为两段式: 先在当前附着页查找, 找不到才跟随前台标签页, 避免多标签环境下被无条件切到 pages[0] 导致找错页面 - 新开标签页优先复用启动残留的 about:blank 空白页, 不再堆积空标签 - AI 能力输入识别增加 hint_word 字段(此前提示词读到的是空) - try_catch 捕获子步骤失败时记录 warn 日志, 不再静默 - Excel 落盘遇 EBUSY(文件被打开占用)时自动另存为带时间戳的文件 - 新增 similar-list.test.ts 端到端回归(46 卡片动态 id 真实浏览器验证) - 新增 export-last-run.js: 从运行记录导出比价 Excel
32 lines
1.4 KiB
JavaScript
32 lines
1.4 KiB
JavaScript
// 从运行记录的 tmp_table.json 重建比价表并导出 Excel
|
||
const ExcelJS = require("exceljs");
|
||
const fs = require("fs");
|
||
|
||
const table = JSON.parse(fs.readFileSync("C:/Users/Administrator/AppData/Roaming/rpa-studio/tmp_table.json", "utf8"));
|
||
// table[0] 是损坏的表头行(["标题"]),数据行从 index 1 开始:6 列 = 标题/价格/店铺/销量/空/AI
|
||
const dataRows = table.slice(1).filter((row) => row.length >= 4 && row[0]);
|
||
const aiText = table.map((row) => (row.length >= 6 ? row[5] : null)).find((c) => c && String(c).trim() && c !== null && String(c) !== "None") || "";
|
||
|
||
const workbook = new ExcelJS.Workbook();
|
||
const sheet = workbook.addWorksheet("比价结果");
|
||
sheet.addRow(["标题", "价格", "店铺", "销量"]);
|
||
for (const row of dataRows) {
|
||
sheet.addRow([row[0], row[1], row[2], row[3]]);
|
||
}
|
||
// AI 分析单独放一个 sheet
|
||
const aiSheet = workbook.addWorksheet("AI分析");
|
||
aiSheet.addRow(["AI 比价分析结论"]);
|
||
aiSheet.getRow(1).font = { bold: true };
|
||
aiSheet.addRow([String(aiText)]);
|
||
aiSheet.getColumn(1).width = 120;
|
||
sheet.getColumn(1).width = 60;
|
||
sheet.getColumn(2).width = 12;
|
||
sheet.getColumn(3).width = 24;
|
||
sheet.getColumn(4).width = 14;
|
||
sheet.getRow(1).font = { bold: true };
|
||
|
||
const out = "C:/Users/Administrator/Desktop/淘宝手机比价.xlsx";
|
||
workbook.xlsx.writeFile(out).then(() => {
|
||
console.log("written:", out, "dataRows:", dataRows.length, "aiLen:", String(aiText).length);
|
||
});
|