我想知道如何在点击下载按钮后验证是否使用Selenium Webdriver下载了文件。
答案 0 :(得分:2)
TL; DR:除非您的网络应用程序在下载完成后有某种视觉/ GUI触发器(某些文本,图像/图标字体,推送通知等),然后答案是响亮的 NO 。
Webdriver不能超出浏览器的范围,但您的底层框架可以。特别是如果您使用的是 NodeJS 。 :)
在我的头脑中,我可以想到过去我能做到的几种方法。选择适用:
1。使用节点 File System (又名
fs
)验证文件是否已下载
由于您在NodeJS环境下运行WebdriverIO,因此您可以使用其功能强大的lib工具套件。我会使用fs.exists
或fs.existsSync
来验证文件是否在预期的文件夹中。
如果您想要勤奋,那么也可以将fs.statSync
与fs.exists
&同时使用轮询该文件,直到其具有预期的大小(例如:> 2560 bytes
)
在线有多个示例可以帮助您整理这样的脚本。使用fs
文档,但也可以使用 other 资源。最后,您可以在it
/ describe
语句中添加所述脚本(我记得您使用的是Mocha)。
2。使用
child_process
的 exec 命令启动第三方脚本
虽然这种方法需要更多的工作来设置,但从长远来看,我发现它更具相关性。
<强> !!!注意:除了启动脚本外,您还需要在第三方框架中编写脚本。
注意:以上所有框架都可以生成.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
希望这有帮助。