如何让噩梦强行超时
Posted
技术标签:
【中文标题】如何让噩梦强行超时【英文标题】:How to make nightmare forcefully timeout 【发布时间】:2018-10-06 14:31:38 【问题描述】:正如标题所暗示的,我正在尝试强制让我的脚本超时,特别是在不满足条件(返回 done()
)的情况下。
这里有一些代码:
import * as Nightmare from "nightmare";
describe("Login Page", function()
this.timeout("30s");
let nightmare = null;
beforeEach(() =>
nightmare = new Nightmare( show: true );
);
let pageUrl;
describe("give correct details", () =>
it("should log-in, check for current page url", done =>
nightmare
.goto(www.example.com/log-in)
.wait(5000)
.type(".input[type='email']", "username")
.type(".input[type='password']", "password")
.click(".submit")
.wait(3000)
.url()
.exists(".navbar")
.then(function(result)
if (result)
done();
else
console.log("failure");
// I want it to timeout here
)
.catch(done);
)
.end()
.then(url =>
pageUrl = url;
console.log(pageUrl);
)
);
);
如果我的代码中有任何其他错误,请随时告诉我。
【问题讨论】:
您需要向我们展示一些实际的噩梦代码,然后添加一些关于您想要超时的代码中的确切内容的解释,以便我们能够帮助您解决任何级别的问题细节。 @jfriend00 完成。 【参考方案1】:您可以使用Promise.race()
来实现超时。我不知道你的测试代码,所以我将只展示让你在噩梦请求上超时的内部部分,你可以将它插入到你的测试框架中。
// utility function that returns a rejected promise after a timeout time
function timeout(t, msg)
return new Promise(function(resolve, reject)
setTimeout(function()
reject(new Error(msg));
, t);
);
Promise.race([
nightmare
.goto(www.example.com / log - in )
.wait(5000)
.type(".input[type='email']", "username")
.type(".input[type='password']", "password")
.click(".submit")
.wait(3000)
.url()
.exists(".navbar")
.end()
, timeout(5000, "nightmare timeout")
]).then(result =>
// process successful result here
).catch(err =>
// process error here (could be either nightmare error or timeout error)
);
这里的概念是,您在梦魇请求的承诺和超时的承诺之间进行竞争。无论哪个先解决或拒绝,都会获胜并导致 Promise 处理结束。如果Promise.race(...).then()
处理程序触发,那是因为您的噩梦请求在超时之前完成。如果Promise.race(...).catch()
处理程序触发,那是因为噩梦请求失败或者您超时了。您可以通过查看您收到的拒绝错误对象来判断它是哪个。
注意,噩梦中还内置了各种超时选项,如doc here 中所述。无论您的超时的确切目的是什么,您都可能会发现其中一个内置选项适合。
【讨论】:
我现在没有时间测试这个,如果你需要更新你的答案,我添加了我的测试代码。明天测试一下,谢谢解答 这行不通,因为您将.then
和 .catch
超出了噩梦的范围(我需要在它的范围内使用 .catch
来捕获 .done()
来完成脚本)
@AidanelGoste - Promise.race 返回一个您可以使用 .then 和 .catch 的承诺。这就是重点。我没有看到任何范围问题。 .then 和 .catch 都会告诉你噩梦何时结束。
问题是你在.end()
使用的逗号,因为promise.race 在timeout()
之后结束,它会错误地输出它下面的所有内容。我正在使用打字稿,所以这可能是主要问题
@AidanelGoste - 逗号是因为我们声明了一个包含两个项目的数组。一项是来自 .end() 的返回值,这是一个承诺。另一个是超时承诺。我们将此数组传递给 Promise.race,它会为我们监视两个 Promise,并根据它返回的 Promise 通知 .then 和 .catch。以上是关于如何让噩梦强行超时的主要内容,如果未能解决你的问题,请参考以下文章