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

Javascript 如何使用Selenium/WebDrivero探测文件是否已下载,javascript,node.js,selenium-webdriver,webdriver-io,Javascript,Node.js,Selenium Webdriver,Webdriver Io,我想知道如何在单击下载按钮后验证是否使用Selenium Webdriver下载了文件。TL;DR:除非您的web应用程序在下载完成后具有某种视觉/GUI触发器(一些文本、图像/图标字体、推送通知等),否则答案是响亮的否 Webdriver不能超出浏览器的范围,但您的底层框架可以。特别是如果您使用的是NodeJS:) 在我的脑海里,我可以想出一些我过去能够做到这一点的方法。根据需要选择: 1。使用节点的(又称fs)验证文件是否已下载 由于您在NodeJS环境下运行WebdriverIO,因此可以

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

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

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

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

1。使用节点的(又称
fs
)验证文件是否已下载

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

如果您想努力工作,还可以将
fs.statSync
fs.exists
&一起使用,轮询文件,直到其达到预期大小(例如:
>2560字节

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

2.使用
子进程
命令启动第三方脚本

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

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

  • 使用脚本
  • 使用脚本
  • 使用TestComplete(不链接它,我不太喜欢),或者[在这里插入GUI验证脚本]脚本
注意:上述所有框架都可以生成一个
.exe
文件,您可以从WebDrivero测试用例中触发该文件,以检查您的文件是否已下载

要采取的步骤:

  • 创建如上所述的一个独立脚本
  • 将脚本的
    .exe
    文件放在已知文件夹中的项目中
  • 使用
    child\u 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();
    } 
});

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

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

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

在wdio.conf.js中(了解下载位置)

和您的规范文件(检查文件是否已下载?)

有关fs extra的更多信息:


希望这能有所帮助。

嘿,伙计们,我很清楚,问题是,我在系统中按下了一些下载按钮,然后文件开始下载,但我不知道这个文件的名称。如果我使用fs.exists,我需要传递名称,对吗?那么,下载开始后,如何捕获此名称呢?嗨@iamdanciv,是的,我知道这很难,如果我选择不同的行,文件名将更改,如果我想在chrome或firefox中使用selenium WDIO,如何捕获文件名?我已经知道文件存放在哪里了。这是一个屏幕广播ohh@iamdanchiv,很抱歉,我想你误解了我,呵呵,我知道我可以将文件名存储在一个变量中,然后将文件名与下载文件夹中的文件名进行比较,如果存在,如果对我来说不错。我的意思是,如果我没有一个预定义的名称存储在变量中并在下载文件夹中搜索,那么当它开始使用WebDrivero下载时,我如何捕获文件名?让我更深入地向您解释一下,有一个发票模块包含一个具有不同发票(行)的网格例如@iamdanchhiv这是发票网格第一行的文件名“Factura_de_venta_VE555154195025.pdf”,但是如果您下载另一张发票,“Factura de venta”后面的代码可能会更改(例如,按发票网格第二行的“下载发票”),则无法在下载之前获取名称,您知道名称是在下载开始后出现的,因此,如果我没有确切的文件名,如何在下载文件夹中搜索它?是否有方法使用webdriver检测浏览器的最新下载或提取最新下载文件名?这是网格的截图,谢谢!你救了我一天。另外,如果要设置Mozilla下载目录:
“browser.download.dir”:pathToDownload
。有关Mozilla的其他选项卡信息,您可以在此处找到:。它们可以用于设置自动关闭提示等。
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
    });
});