如何让Nightmare脚本在指定条件未满足时强制超时?
解决Nightmare脚本在条件不满足时强制超时的问题
看起来你是想在Mocha测试中,当Nightmare的操作没达到预期(比如登录后没跳转到目标页面,导致done()一直没被调用)时,不用等全局的30秒超时,而是主动触发超时终止测试对吧?我给你几个可行的方案:
1. 给Nightmare设置内部等待超时
在创建Nightmare实例时,添加waitTimeout选项,控制.wait()方法的超时时间(比如设置10秒),如果等待元素/URL的时间超过这个值,Nightmare会直接抛出错误,触发测试失败,不用等全局的30秒:
beforeEach(() => { nightmare = new Nightmare({ show: true, waitTimeout: 10000 // 设置10秒超时,按需调整 }); });
2. 主动检查条件,不满足时立即终止测试
在获取到页面状态(比如URL)后,主动判断是否符合预期,不符合的话直接调用done()并传入错误,让Mocha立即终止测试,相当于“强制超时”的效果:
it("should log-in, check for current page url", done => { nightmare .goto("https://www.example.com/log-in") // 注意要加引号和协议,原代码漏了 .type("#username", "your-correct-username") .type("#password", "your-correct-password") .click("#login-submit") .wait("#dashboard-container") // 等待登录后的目标元素出现 .url() .end() .then(currentUrl => { // 检查URL是否符合预期 if (!currentUrl.includes("/dashboard")) { // 条件不满足,主动触发错误终止测试 done(new Error("登录失败:未跳转到仪表盘页面")); return; } // 条件满足,正常结束测试 done(); }) .catch(err => { // 捕获Nightmare的超时或其他错误,传给done done(err); }); });
3. 给单个测试用例设置独立超时
如果某个测试需要更严格的超时限制,可以在测试用例里单独设置,覆盖全局的30秒:
it("should log-in, check for current page url", function(done) { this.timeout(15000); // 这个测试单独用15秒超时 // ... 测试逻辑 });
另外注意你原代码里的goto(www.example.com/log-in)有语法错误,需要把URL改成字符串形式(加引号),最好加上https://协议,避免Nightmare解析出错。
内容的提问来源于stack exchange,提问作者Aidan el Goste
相关产品推荐
相关产品推荐

