我正在使用TestCafe和Node.JS编写自动化测试脚本。 其中一项测试是下载文件并验证下载是否完整。 我不想写一个硬编码的
await t.wait(4000);
因为我的测试是基于数据驱动的框架,所以我可以用很多不同的文件和文件类型来提供大量数据。因此,文件大小可能会从几千字节到千兆字节之间变化。
所以写作
await t.wait(4000);
可能适用于一个测试用例,但对于其他测试用例几乎肯定会失败。
我使用依赖' downloads-folder'发现本地系统上的下载文件夹的路径。从那里我寻找我期望在那里的特定文件。它适用于快速下载的小文本文件和小型zip文件。但是一旦我尝试下载包含大量数据的非常大的zip文件,它就会失败
if (fs.existsSync(zipFileNameAndPath)) {
await t.expect(true).eql(true); // Report it as a success.
} else {
console.log('file does NOT exist: ' + zipFileNameAndPath);
await t.expect(false).eql(true); // Report it as a failure!
}
所以我的问题是:
有没有办法做类似
的事情if (fs.existsSync(zipFileNameAndPath){[ timeout: 50000000]}) {...} else {...}
如果生成的超时将作为动态超时工作,等待查看文件何时找到,如果在超时到期之前找到它,那么它将返回true,并且只有在超时期限过后才会返回false ?
我正在寻找一个对Lodash或JQuery没有任何依赖性的同步答案,并且在ES6中运行良好。
答案 0 :(得分:2)
我写了一个函数:
async function CheckFileExistsWithTimeDelay(t, timeDelay, fileNameAndPath) {
for (var i = 0; i < timeDelay; i++) {
console.log('Waited for a total of ' + i.toString() + ' microseconds');
await t.wait(1);
if (fs.existsSync(fileNameAndPath)) {
// break;
return;
}
}
};
然后该函数的调用者看起来像:
await Common.CheckFileExistsWithTimeDelay(t, 500000, zipFileNameAndPath);
当然你可以注释掉console.log(...),我把它留在那里,所以我可以在等待调试的时候看它。
当我运行它时,它在下载59mb zip文件之前等待了7996微秒,然后突破并继续成功执行脚本。
可以很容易地打破;或返回;取决于您是希望将其保留为函数还是直接与脚本代码一起使用。
答案 1 :(得分:1)
{{1}}
答案 2 :(得分:0)
问题是您正在检查文件是否存在而不等待下载完成。您发布的代码很好 - 您需要确保在下载完成(或失败)之前不会调用它。
如何做到这取决于您的下载方式。它可以像在执行下载的代码行上删除'await'一样简单。