能否访问wdio.conf中声明的变量?如何跨文件使用featureFiles数组?
关于WDIO配置变量访问和onPrepare钩子中数组共享的问题
问题1:能否访问在wdio.conf中声明的变量?
当然可以,但具体要看变量的声明方式:
- 如果变量是定义在
exports.config对象里的自定义属性(比如专门加一个customVars字段),你可以在测试代码里通过browser.config.customVars来访问,这是最规范的做法,因为WDIO会把整个config对象挂载到browser实例上。 - 如果你是在wdio.conf文件顶部声明了全局变量(不使用
var/let/const),或者主动挂载到global对象上(比如global.myVar = 'xxx'),也能在其他文件访问,但这种方式不太推荐,容易造成全局污染。 - 要是你在conf里声明的是局部变量(用
let/const包裹,没挂载到全局或config),那其他文件肯定访问不到,因为变量作用域只在conf文件内部。
问题2:如何在其他文件使用onPrepare钩子中生成的featureFiles数组?
你现在遇到的问题核心是执行时机:当其他文件导入wdio.conf的时候,conf里的同步代码已经执行完了,但onPrepare钩子是WDIO在启动测试流程时才会调用的,所以此时你拿到的featureFiles还是初始的空数组。
解决这个问题有几个靠谱的方法:
方法1:挂载到global对象
在onPrepare钩子里把数组赋值给全局对象:
// wdio.conf.js const fs = require('fs'); exports.config = { // 其他配置... onPrepare: function() { const listOfFiles = fs.readdirSync(process.cwd() + '/features'); global.featureFiles = listOfFiles; // 直接挂载到global } }
之后在其他测试文件或工具文件里,直接用global.featureFiles就能拿到填充后的数组了。不过要注意,global变量尽量少用,避免冲突,但这种方式最简单直接。
方法2:写入临时文件
如果不想用全局变量,可以把数组写入一个临时JSON文件,其他文件读取这个文件:
// wdio.conf.js const fs = require('fs'); const path = require('path'); exports.config = { // 其他配置... onPrepare: function() { const listOfFiles = fs.readdirSync(process.cwd() + '/features'); const tempFile = path.join(process.cwd(), 'feature-list.json'); fs.writeFileSync(tempFile, JSON.stringify(listOfFiles)); } }
然后在其他文件里读取:
// 其他文件 const fs = require('fs'); const path = require('path'); const featureFiles = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'feature-list.json'), 'utf8'));
这种方式更干净,适合需要持久化数据的场景,测试结束后可以删掉临时文件。
方法3:利用WDIO的config对象(注意时机)
你可以在config里先定义一个空的featureFiles属性,然后在onPrepare里给它赋值:
// wdio.conf.js const fs = require('fs'); exports.config = { // 其他配置... featureFiles: [], // 先初始化空数组 onPrepare: function(config) { // 这里可以拿到config对象 const listOfFiles = fs.readdirSync(process.cwd() + '/features'); config.featureFiles = listOfFiles; } }
不过要注意,在测试代码里要等到onPrepare执行完才能拿到值,比如在beforeSession或者测试用例里通过browser.config.featureFiles访问,不要在文件顶部直接require conf来拿,因为那时候onPrepare还没执行。
另外,你的代码里listOfFiles.map可以简化成const featureFiles = listOfFiles.filter(file => file.endsWith('.feature'));,避免把非feature文件也加进去,更严谨。
内容的提问来源于stack exchange,提问作者Daredevi1
相关产品推荐
相关产品推荐

