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

时间:2017-07-07 00:16:11

标签: javascript node.js selenium-webdriver webdriver-io

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

2 个答案:

答案 0 :(得分:2)

TL; DR:除非您的网络应用程序在下载完成后有某种视觉/ GUI触发器(某些文本,图像/图标字体,推送通知等),然后答案是响亮的 NO

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

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

  

1。使用节点 File System (又名fs)验证文件是否已下载

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

如果您想要勤奋,那么也可以将fs.statSyncfs.exists&同时使用轮询该文件,直到其具有预期的大小(例如:> 2560 bytes

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

  

2。使用child_process exec 命令启动第三方脚本

虽然这种方法需要更多的工作来设置,但从长远来看,我发现它更具相关性。

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

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

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

采取的步骤:

  • 创建一个如上所述的独立脚本;
  • 将脚本的.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();
    } 
});

最后:我确信还有其他方法可以做到。但是,你对这个模糊问题的主要看法应该是:,如果你绝对必须,你可以验证文件是否已被下载,特别是如果这个测试用例 CRITICAL < / strong>到你的回归运行。

答案 1 :(得分:1)

您的问题并未说明您是想在本地还是远程确认(例如browserstack)。如果它是远程的,那么我的答案将是“”,因为您可以看到该文件已下载但您无法访问该文件夹。因此,您无法断言文件已下载。

如果您想在本地(在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

希望这有帮助。