代码之家  ›  专栏  ›  技术社区  ›  Salvador Salvatierra

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

  •  -1
  • Salvador Salvatierra  · 技术社区  · 7 年前

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

    2 回复  |  直到 7 年前
        1
  •  4
  •   T Gurung    7 年前

    如果你想在本地(在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,
                }
            }
        }],
    

    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
        });
    });
    

    https://www.npmjs.com/package/fs-extra

        2
  •  2
  •   iamdanchiv    7 年前

    TL;博士: 除非你的web应用在下载完成后有某种视觉/图形用户界面触发(一些文本、图像/图标字体、推送通知等),否则答案是响亮的

    Webdriver不能超出浏览器的范围,但底层框架可以。尤其是当你使用 节点JS

    在我的脑海里,我可以想出一些过去能够做到这一点的方法。根据需要选择:

    1. File System fs )

    fs.exists fs.existsSync

    如果你想勤奋,那么也要使用 fs.statSync 结合 & 轮询文件,直到其达到预期大小 > 2560 bytes

    网上有多个例子可以帮助你编写这样的脚本。使用 文件,但 other 资源也是如此。最后,您可以在您的 it describe 声明(我记得你用的是摩卡咖啡)。

    2. child_process exec 启动第三方脚本的命令

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

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

    • 使用 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();
        } 
    });
    

    最后: 我肯定还有其他方法。但是,对于这样一个模糊的问题,你的主要收获应该是: ,您可以验证文件是否已下载(如果绝对必须),特别是如果此测试用例是 关键