Nightwatch测试中await未生效,browser.perform后续代码提前执行
问题根因
你当前的问题核心是混用了Nightwatch的回调式旧API和async/await异步模式,且没有正确处理异步任务的等待逻辑:
- 你传给
browser.perform的是普通同步函数,函数执行时仅提交了browser.elements、browser.elementIdText的异步请求就直接返回,perform的Promise会立刻resolve,所以await相当于没有生效,后续打印list的代码会提前执行。 - 回调式API的执行时机完全脱离了async/await的Promise链,Nightwatch检测不到未完成的异步任务,会提前终止测试进程,因此
console.log('end')完全没有执行机会;给navigate加await后两种模式的命令队列发生冲突,会直接导致测试流程卡住无输出。
解决方案
推荐直接全量使用Nightwatch的async/await兼容模式,所有API都不传回调,直接用await等待执行结果,修改后代码如下:
module.exports = { '@tags': ['smoke test'], 'Work with a table': async browser => { // 导航命令加await等待执行完成 await browser.page.mainPage.tablePage().navigate(); let list = [] // 直接await获取元素列表,不传入回调 const elements = await browser.elements('css selector', 'thead th'); // 遍历元素逐个获取文本,每个操作都加await等待 for (const elementsObj of elements.value) { const result = await browser.elementIdText(elementsObj.ELEMENT); list.push(result.value) console.log('>> ' + result.value); } // 此时list已完全填充完成 console.log('list: ' + list); console.log('end'); // 测试结束后主动关闭浏览器会话 await browser.end(); } }
补充说明
如果确实需要使用perform方法包裹逻辑,需要给perform的回调传入async函数,且内部所有异步操作都用await等待,否则依然会出现等待失效的问题。
内容的提问来源于stack exchange,提问作者Bohdan Nesteruk
相关产品推荐
相关产品推荐

