WebdriverIO多浏览器并发执行时如何获取对应worker编号?
WebdriverIO获取worker编号实现窗口排布方案
直接获取worker编号的官方方法
WebdriverIO启动每个worker进程时,会自动向进程注入独立的环境变量WDIO_WORKER_ID,值就是你在日志前缀[n-n]中看到的第二个worker编号,完全不需要自己维护计数,也不存在竞态问题。
你可以在测试脚本、wdio配置文件的任意钩子函数中直接读取该变量:
// 读取worker编号并转为数字 const workerId = parseInt(process.env.WDIO_WORKER_ID, 10) // 按需求对5取模得到位置索引 const positionIdx = workerId % 5
接下来就可以用这个索引排布窗口位置,示例如下:
// 预设5个窗口的排布参数,示例按1920*1080屏幕横向均分布局 const windowConfigs = [ {x: 0, y: 0, width: 384, height: 1080}, {x: 384, y: 0, width: 384, height: 1080}, {x: 768, y: 0, width: 384, height: 1080}, {x: 1152, y: 0, width: 384, height: 1080}, {x: 1536, y: 0, width: 384, height: 1080} ] // 应用窗口位置配置 await browser.setWindowRect( windowConfigs[positionIdx].x, windowConfigs[positionIdx].y, windowConfigs[positionIdx].width, windowConfigs[positionIdx].height )
你可以根据自己的演示需求修改windowConfigs里的坐标和尺寸参数。
替代方案(自定义编号场景适用)
如果你需要自定义worker的标记规则,可以在wdio.conf.js的onWorkerStart钩子中由主进程统一分配编号,这个钩子是主进程在每个worker启动时触发的,所有编号由主进程统一维护,也不会出现竞态问题:
// wdio.conf.js let workerCounter = 0 exports.config = { // 其他配置项省略 onWorkerStart: function (cid, caps, specs, args, execArgv) { process.env.CUSTOM_WORKER_ID = workerCounter++ } }
之后在worker进程中直接读取process.env.CUSTOM_WORKER_ID即可使用。
关于自增系统变量方案的说明
自己读写全局系统变量的方式确实会引发竞态条件,多进程同时读取变量时可能拿到相同的值,导致编号重复,没必要采用该方案,使用官方自带的WDIO_WORKER_ID即可满足需求。
内容的提问来源于stack exchange,提问作者DarkArtsWizard
相关产品推荐
相关产品推荐

