Nightwatch.js自定义命令执行后后续测试无法触发求助
解决Nightwatch自定义命令后后续测试用例不执行的问题
嘿,这个问题我之前也踩过坑!核心原因是你的Solr查询是异步操作,但Nightwatch默认不知道要等它完成,直接就判定自定义命令执行结束,导致后续测试用例被意外跳过。
问题根源
你的自定义命令里调用了client.search(),这是一个异步HTTP请求——代码调用这个方法后会立刻执行return this;,Nightwatch就误以为命令已经跑完,直接走后续流程,但实际上Solr的回调逻辑还在后台执行。这就导致后续测试用例根本没机会启动。
修复方案:让Nightwatch等待异步操作完成
Nightwatch专门提供了处理自定义命令异步逻辑的机制,我们可以用this.perform()包裹异步操作,并通过done()函数明确通知Nightwatch:“这个异步任务做完了,可以继续跑测试了”。
修改后的自定义命令代码如下:
var solr = require('solr-client') exports.command = function(callback) { var client = solr.createClient('solr.dev.bauerhosting.com', 8080, 'cms', '/www.parkers.co.uk'); var globalSettingsQuery = client.createQuery() .q({TypeName:'Bauer.Parkers.GlobalSettings'}) .start(0) .rows(10); // 用perform包裹异步操作,强制Nightwatch等待回调完成 this.perform(function(client, done) { client.search(globalSettingsQuery, function(err, obj) { if (err) { console.log(err); } else { var myresult = obj.response.docs[0].s_InternalAdviceLinksHtml; console.log(myresult.length); if (myresult.length === 0) { console.log('content block not configured'); } else { console.log('content block configured'); } } // 关键步骤:调用done()告诉Nightwatch异步任务结束 done(); // 可选:如果需要把Solr查询结果传给测试用例,调用回调函数 if (typeof callback === 'function') { callback(err, obj); } }); }); return this; };
为什么这样改能解决问题?
this.perform()是Nightwatch为异步逻辑设计的方法,它会暂停测试流程,直到你调用done()函数。done()相当于给Nightwatch发了一个“任务完成”的信号,只有收到这个信号,Nightwatch才会继续执行后续的测试用例。
你的测试文件代码不需要做任何修改,保持原样即可:
module.exports = { 'set up the solr query': function (browser) { browser .solr_query.global_settings.internalAdviceLinksHtml(); }, 'links above footer on advice landing page displayed': function (browser) { browser .url(browser.launch_url + browser.globals.carAdvice) .assert.elementPresent('section.seo-internal-links') }, 'closing the browser': function (browser) { browser .browserEnd(); }, };
现在重新运行测试,你会看到Solr查询的回调执行完成后,后续的测试用例会正常启动执行了~
内容的提问来源于stack exchange,提问作者Darren Harley
相关产品推荐
相关产品推荐

