将异步Nightwatch After Hook与客户端交互一起使用不起作用

时间:2018-07-30 21:32:13

标签: nightwatch.js cucumberjs

据我所知,在After挂钩中使用promise或callback会阻止在使用Promise /回调时执行Command Queue。我试图弄清楚为什么,任何帮助或建议都会受到赞赏。我在github上发现的最接近的问题是:https://github.com/nightwatchjs/nightwatch/issues/341

其中指出:finding that trying to make browser calls in the after hook is too late; it appears that the session is closed before after is run.(正是我的问题)。但是没有提供解决方案。我的方案运行后,我需要运行清理步骤,并且这些清理步骤需要能够与浏览器进行交互。

https://github.com/nightwatchjs/nightwatch/wiki/Understanding-the-Command-Queue

在下面的代码段中,bar从不输出。只是foo

const { After } = require('cucumber');
const { client } = require('nightwatch-cucumber');

After(() => new Promise((resolve) => {
  console.log('foo')
  client.perform(() => {
    console.log('bar')
  });
}));

我也尝试使用回调方法

After((browser, done) => {
  console.log('foo');
  client.perform(() => {
    console.log('bar');
    done();
  });
});

但是与第一个示例类似,bar从未输出,仅foo

您可以改用类似的内容:

const moreWork = async () => {
  console.log('bar');
  await new Promise((resolve) => {
    setTimeout(resolve, 10000);
  })
}

After(() => client.perform(async () => {
  console.log('foo');
  moreWork();
}));

但是moreWork的异步特性意味着客户端在我的工作完成之前就终止了,因此这对我而言并不是真正的工作。您不能在await中使用perform,因为它们处于不同的执行上下文中。

基本上,使客户端命令在挂接后执行的唯一方法是我的第三个示例,但这使我无法使用异步。

如果命令队列没有冻结并阻止执行,则第一个和第二个示例将非常有用。

编辑:我在github上发现了更多问题,指出该浏览器在钩子之前/之后不可用:https://github.com/nightwatchjs/nightwatch/issues/575

如果要在运行所有功能后使用浏览器进行清理,应该怎么办?

1 个答案:

答案 0 :(得分:0)

尝试以下

After(async () => {
   await client.perform(() => {
      ...
   });
   await moreWork();
})