NightwatchJS v3.x:如何从globals.js提取异步获取的Solr数据
NightwatchJS v3.x 全局变量异步赋值返回undefined问题分析与解决
根本原因
就是调用时机问题。Nightwatch加载globals.js时是同步执行的,你在顶层代码里执行的Solr异步查询,其回调/Promise完成的时机晚于Nightwatch初始化全局变量、启动测试脚本的时机。所以测试脚本开始运行时,cmsEquipmentSettingsPage还没被赋值,自然返回undefined;而同步定义的tipsSection在globals加载完成时就已完成赋值,因此能正常获取。
解决方法
1. 将异步逻辑移至全局before钩子
Nightwatch的globals.js支持导出异步的before函数(可返回Promise或使用async/await),Nightwatch会等待该函数执行完成后再启动测试,确保异步数据已完成赋值:
module.exports = { // 全局before钩子,所有测试执行前仅运行一次 async before(browser) { // 执行Solr异步查询 const solrResult = await yourSolrClientQuery(); // 赋值到全局变量 browser.globals.cmsEquipmentSettingsPage = solrResult; }, // 同步定义的全局变量不受影响 tipsSection: '同步定义的内容' };
2. 避免在globals顶层执行异步操作
globals顶层代码是同步执行的,异步操作的回调/Promise结果无法被Nightwatch等待,必然导致测试启动时变量未赋值。所有需要异步获取的全局数据,都应放到全局钩子中处理。
3. 验证赋值时机
可以在全局before钩子中添加日志,确认Solr查询结果已正确赋值:
async before(browser) { const solrResult = await yourSolrClientQuery(); console.log('Solr查询结果:', solrResult); browser.globals.cmsEquipmentSettingsPage = solrResult; }
内容的提问来源于stack exchange,提问作者Darren Harley
相关产品推荐
相关产品推荐

