Playwright中ExcelJS读取的salary变量未定义的作用域问题
解决"salary is not defined"错误的方案
问题根源
- 变量作用域限制:原代码中
salary是在wb.xlsx.readFile().then()的回调函数内部定义的局部变量,外部的async函数无法访问这个变量。 - 异步执行顺序问题:Excel文件读取是异步操作,而Playwright的浏览器自动化代码会先执行,此时
salary还未被定义或赋值。
修正后的代码
const { chromium } = require("playwright"); const ExcelJS = require('exceljs'); (async () => { // 读取Excel文件并获取salary值 const wb = new ExcelJS.Workbook(); const fileName = 'Book1.xlsx'; let salary; try { await wb.xlsx.readFile(fileName); const ws = wb.getWorksheet('RenM1ACont'); salary = Number(ws.getCell('I69').value.result).toFixed(0).toString(); console.log(salary); } catch (err) { console.log(err.message); // 读取失败时可提前退出或做其他处理 return; } // 启动浏览器并执行自动化操作 const browser = await chromium.launch({ headless: false, }); const page = await browser.newPage(); await page.goto("https://someweb"); await page.getByTitle('Field1').fill("123"); await page.getByTitle('Field2').fill("1971"); await page.getByTitle('name.').fill(salary); // 按需关闭浏览器 // await browser.close(); })();
关键改动说明
- 将Excel读取逻辑移入主async函数,确保
salary变量在整个函数作用域内可访问。 - 使用
await替代.then()回调,统一异步代码风格,保证Excel读取完成后再执行Playwright的自动化操作。 - 添加try/catch块处理Excel读取可能出现的错误,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Pcouper
相关产品推荐
相关产品推荐

