如何让噩梦强行超时

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。

以上是关于如何让噩梦强行超时的主要内容,如果未能解决你的问题,请参考以下文章

Redis 开发与运维Redis 的噩梦:阻塞

Redis 开发与运维Redis 的噩梦:阻塞

Redis 开发与运维Redis 的噩梦:阻塞

公共头文件路径、安装目录、搜索头文件路径和其他噩梦

Windows 用户的 Posix、unix、paths、vim 和其他噩梦

冒险游戏AVG《小小噩梦2》Steam正版分流下载发布!