据我所知,在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
如果要在运行所有功能后使用浏览器进行清理,应该怎么办?
答案 0 :(得分:0)
尝试以下
After(async () => {
await client.perform(() => {
...
});
await moreWork();
})