You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:15:00