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
相关产品推荐
相关产品推荐

