WebdriverIO无法动态传递输出目录 访问result_path为undefined
问题原因
- 执行顺序逻辑错误:WebdriverIO 会先完整解析配置文件中的所有静态配置项(包括
reporters配置),待整个配置初始化完成后才会触发onPrepare生命周期钩子。你在onPrepare中才给result_path赋值,reporters读取该变量时赋值逻辑还没执行,自然拿到undefined。 - 变量作用域隐患:原代码里的
today/date/time/result_path都没有做变量声明,直接赋值会污染全局作用域,就算解决了执行顺序问题也容易出现变量被意外篡改的异常。
解决方案
直接把动态路径生成、目录创建的逻辑放到配置文件的顶层作用域,这部分代码会在配置解析阶段最先执行,生成的路径可以直接传给reporters配置使用,不会出现取值未定义的问题。
修正后的配置代码
const fs = require('fs') // 配置加载阶段直接生成动态结果路径 const today = new Date() const date = today.getDate() const runTime = `${date}_${today.getHours()}hrs_${today.getMinutes()}mins_${today.getSeconds()}secs` const resultPath = `./execution_time_${runTime}` // 提前创建结果目录,加recursive参数避免多级目录创建报错 if (!fs.existsSync(resultPath)) { fs.mkdirSync(resultPath, { recursive: true }) } exports.config = { // 其余原有配置... onPrepare: function (config, capabilities) { // 这里保留你其他onPrepare阶段的业务逻辑即可,不需要再处理路径生成 }, reporters: [['timeline', { outputDir: `${resultPath}/`, fileName: 'timeliner-reporter.html', embedImages: true, images: { quality: 80, resize: false, reductionRation: 2 }, screenshotStrategy:'before:click' }]], // 其余原有配置... }
备选方案(必须在onPrepare中生成路径时使用)
如果你的路径生成逻辑必须依赖onPrepare阶段才能拿到的参数(比如动态获取的capabilities多设备信息),可以直接在onPrepare中修改传入的config对象里的reporter配置,修改后的值会在reporter正式加载时生效:
const fs = require('fs') exports.config = { // 其余原有配置... onPrepare: function (config, capabilities) { const today = new Date() const date = today.getDate() const runTime = `${date}_${today.getHours()}hrs_${today.getMinutes()}mins_${today.getSeconds()}secs` const resultPath = `./execution_time_${runTime}` if (!fs.existsSync(resultPath)) { fs.mkdirSync(resultPath, { recursive: true }); } // 直接修改配置对象中的timeline reporter输出路径 const timelineReporterConf = config.reporters.find(item => item[0] === 'timeline') if (timelineReporterConf) { timelineReporterConf[1].outputDir = `${resultPath}/` } }, reporters: [['timeline', { // 这里可以先填个临时默认路径,onPrepare执行时会覆盖 outputDir: './default_report/', fileName: 'timeliner-reporter.html', embedImages: true, images: { quality: 80, resize: false, reductionRation: 2 }, screenshotStrategy:'before:click' }]], // 其余原有配置... }
内容的提问来源于stack exchange,提问作者user19425139
相关产品推荐
相关产品推荐

