如何探测文件是否使用 Selenium/WebdriverIO 下载

How to probe if a file was download using Selenium/WebdriverIO

我想知道在单击下载按钮后如何验证文件是否是使用 Selenium Webdriver 下载的。

TL;DR: 除非你的网络应用程序在下载完成后有某种 visual/GUI 触发器(一些文本,image/icon-font,推送- 通知等),那么答案就是响亮的 NO

Webdriver 不能超出浏览器的范围,但您的底层框架可以。特别是如果你使用 NodeJS。 :)

在我的头脑中,我可以想到我过去能够做到这一点的几种方法。选择适用的:

1. Verify if the file has been downloaded using Node's File System (aka fs)

由于您在 NodeJS 环境下 运行ning WebdriverIO,因此您可以使用其强大的库工具套件。我会使用 fs.existsfs.existsSync 验证文件是否在预期的文件夹 中。

如果你想勤奋一点,那么也可以将 fs.statSyncfs.exists 结合使用 & 轮询文件,直到它具有预期的大小 (例如: > 2560 bytes)

网上有多个示例可以帮助您编写这样的脚本。使用 fs 文档,但也使用 other 资源。最后,您可以在 it/describe 语句中添加上述脚本(我记得您使用的是 Mocha)。

2. Use child_process's exec command to launch third-party scripts

虽然此方法需要更多的设置工作,但我发现它更适合长期 运行。

!!!注意:除了启动脚本,还需要在第三方框架中编写脚本。

  • 使用 AutoIT 脚本;
  • 使用 Sikuli 脚本;
  • 使用 TestComplete(不链接它,我不太喜欢它),或[在此处插入 GUI 验证脚本] 脚本;

注意: 以上所有框架都可以生成一个 .exe 文件,您可以从 WebdriverIO 测试用例中触发该文件,以检查您的文件是否已下载, 与否。

要采取的步骤:

  • 创建如上所述的独立脚本之一;
  • 将脚本的 .exe 文件放在项目中的已知文件夹中;
  • 使用 child_process.exec 启动脚本并在执行完成后声明其结果;

示例:

exec = require('child_process').exec;
// Make sure you also remove the .exe from scriptName
var yourScript = pathToScript + scriptName;

var child = exec(yourScript); 
child.on('close', function (code, signal) {
    if (code!==0) {
        callback.fail(online.online[module][code]);
    } else {
        callback();
    } 
});

最后: 我相信还有其他方法可以做到这一点。但是,你从这样一个模糊的问题中得到的主要结论应该是:YES,如果绝对必要,你可以验证文件是否已经下载,特别是如果这个测试用例是 对你的回归至关重要-运行。

你的问题没有说明你是想在本地还是远程(比如browserstack)确认。如果它是远程的,那么我的回答将是“NO”,因为您可以看到文件正在下载,但您无法访问该文件夹。所以你不能断言文件已经下载。

如果你想在本地(在Chrome)实现这个,那么答案是“”,你可以这样做:

在wdio.conf.js(要知道下载的位置)

var path = require('path');

const pathToDownload = path.resolve('chromeDownloads');

// chromeDownloads above is the name of the folder in the root directory
exports.config = {
capabilities: [{
        maxInstances: 1,     
        browserName: 'chrome',
        os: 'Windows',      
        chromeOptions: {
            args: [
                'user-data-dir=./chrome/user-data',
            ],
            prefs: {
                "download.default_directory": pathToDownload,
            }
        }
    }],

还有你的spec文件(检查文件是否下载?)

const fsExtra = require('fs-extra');
const pathToChromeDownloads = './chromeDownloads';

describe('User can download and verify a file', () =>{

    before(() => {
        // Clean up the chromeDownloads folder and create a fresh one
        fsExtra.removeSync(pathToChromeDownloads);
        fsExtra.mkdirsSync(pathToChromeDownloads);
    });

    it('Download the file', () =>{
        // Code to download 
    });

    it('Verify the file is downloaded', () =>{
        // Code to verify 
        // Get the name of file and assert it with the expected name
    });
});

关于 fs-extra 的更多信息:https://www.npmjs.com/package/fs-extra

希望这对您有所帮助。