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

Mocha测试返回Promise仍超时,如何让it块等待Promise完成?

解决Mocha中it块等待Promise完成的问题

咱们先拆解你代码里的核心问题,再给出修正方案:

1. 多余且错误的Promise包装

你手动创建的Promise完全是画蛇添足——driver.get()本身就会返回一个Promise,不需要再套一层Promise构造器。更关键的是,你写的reject(err)里的err根本没定义,这会直接抛出一个未捕获的引用错误,最终导致测试超时失败。

2. 未正确处理Selenium的异步生命周期

虽然你知道返回Promise就不用调用done(),但原代码里的写法相当于把一个已经在执行的Promise硬塞进resolve里,而且完全缺失错误处理逻辑。

修正后的代码示例

var {Builder, By, Key, until} = require('selenium-webdriver');
var test = require('selenium-webdriver/testing');
var chai = require('chai');
var getUrl = require('./wdio.conf.js');

test.describe('Proper Testing', function() {
  // 把driver初始化/销毁放到before/after里,避免重复创建进程
  let driver;
  test.before(function() {
    driver = new Builder().forBrowser('chrome').build();
  });

  test.it('should prompt the server from user', function() {
    // 直接返回driver.get()的Promise,Mocha会自动等待它完成
    return driver.get("https://www.google.co.in");
  });

  test.after(function() {
    // 测试结束后关闭浏览器,避免残留Chrome进程
    return driver.quit();
  });
})

额外优化建议

  • 调整超时时间:如果你的页面加载较慢,可以给测试块设置更长的超时:
    test.describe('Proper Testing', function() {
      this.timeout(10000); // 设置为10秒超时,默认一般是2秒
      // ... 测试内容
    })
    
  • 用async/await简化代码:Mocha完全支持async函数,写起来更直观,错误处理也更方便:
    test.it('should prompt the server from user', async function() {
      try {
        await driver.get("https://www.google.co.in");
        // 可以添加断言验证结果,比如检查页面标题
        const pageTitle = await driver.getTitle();
        chai.expect(pageTitle).to.include('Google');
      } catch (err) {
        console.error('测试出错:', err);
        throw err; // 必须抛出错误,Mocha才会标记测试失败
      }
    });
    

原代码超时的根本原因

你手动创建的Promise里,reject(err)会抛出ReferenceError: err is not defined,这个错误没有被任何逻辑捕获,Mocha一直在等待Promise完成,但实际上这个Promise已经因为未捕获错误而失败了,最终触发超时。

内容的提问来源于stack exchange,提问作者Pawan Juyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:52:53