2

我正在使用 TestCafe 和 Node.JS 编写一个自动化测试脚本。其中一项测试是下载文件并验证下载是否完成。我不想写硬编码

await t.wait(4000);

因为由于我的测试是基于数据驱动的框架,所以我可以为它提供大量具有许多不同文件和文件类型的数据。因此,文件大小可能会从几 KB 到千兆字节不等。

所以写

await t.wait(4000);

可能适用于一个测试用例,但几乎肯定会在其他测试用例中失败。

我正在使用依赖项“下载文件夹”来发现本地系统上下载文件夹的路径。从那里我寻找我期望在那里的特定文件。它适用于快速下载的小型文本文件和小型 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 中运行良好的同步答案。

4

3 回答 3

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 微秒,然后才成功地继续执行脚本。

可以很容易地打破; 或返回;取决于您是想将其保留为函数还是直接与脚本代码内联使用。

于 2018-02-21T21:07:49.430 回答
2
const filepath = 'YOUR_FILE.pdf';
const verifyDownload = async () => new Promise((resolve, reject) => {
    fs.watchFile(filepath, (curr, prev) => {
        if (fs.existsSync(filepath)) {
            fs.unwatchFile(filepath);
            resolve(true);
        }
     });
});

await t.expect(await verifyDownload()).ok("Could not download", { timeout: 30000 });
于 2018-04-25T14:54:12.790 回答
0

问题是您正在检查文件是否存在,而无需等待下载完成。您发布的代码很好 - 您需要确保在下载完成(或失败)之前不会调用它。

如何做到这一点取决于您如何进行下载。它可以像在下载的代码行上放一个“等待”一样简单。

于 2018-02-21T16:44:30.270 回答