为何Playwright Reporter不等待异步函数执行完成?
问题解决:Playwright自定义Reporter中exec命令被跳过的问题
问题原因
Playwright的Reporter生命周期方法(比如onTestEnd)如果包含异步操作,必须返回Promise让Playwright等待操作完成。你原来的代码里exec用的是回调模式,而onTestEnd是同步方法,Playwright不会等待回调执行,直接结束流程,导致exec的逻辑被跳过。
解决方案
把exec转换成Promise形式,将onTestEnd改为异步方法并等待命令执行完成:
修改后的代码
const { exec } = require('child_process'); const { promisify } = require('util'); // 将exec转换为支持Promise的版本 const execPromise = promisify(exec); class CustomPDFReporter { async onTestEnd(test, result) { const cmd = `C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe --quiet --print-media-type ...`; try { const { stdout, stderr } = await execPromise(cmd); if (stderr) { console.error(`Error output: ${stderr}`); } console.log("Generation successful!"); console.log(`Command Output: ${stdout}`); } catch (error) { console.error(`Error executing command: ${error.message}`); } } } module.exports = CustomPDFReporter;
关键改动说明
- 使用
util.promisify把回调式的exec转为Promise兼容的函数,这样可以用await等待命令执行完成。 - 给
onTestEnd添加async关键字,让它返回Promise,Playwright会自动等待这个Promise完成后再继续。 - 用
try/catch替代原来的回调错误处理,更符合异步/await的代码风格。
内容的提问来源于stack exchange,提问作者Branislav
相关产品推荐
相关产品推荐

