如何探测文件是否使用 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.exists
或 fs.existsSync
来 验证文件是否在预期的文件夹 中。
如果你想勤奋一点,那么也可以将 fs.statSync
与 fs.exists
结合使用 & 轮询文件,直到它具有预期的大小 (例如: > 2560 bytes
)
网上有多个示例可以帮助您编写这样的脚本。使用 fs
文档,但也使用 other 资源。最后,您可以在 it
/describe
语句中添加上述脚本(我记得您使用的是 Mocha)。
2. Use child_process
's exec command to launch third-party scripts
虽然此方法需要更多的设置工作,但我发现它更适合长期 运行。
!!!注意:除了启动脚本,还需要在第三方框架中编写脚本。
注意: 以上所有框架都可以生成一个 .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
希望这对您有所帮助。
我想知道在单击下载按钮后如何验证文件是否是使用 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.exists
或 fs.existsSync
来 验证文件是否在预期的文件夹 中。
如果你想勤奋一点,那么也可以将 fs.statSync
与 fs.exists
结合使用 & 轮询文件,直到它具有预期的大小 (例如: > 2560 bytes
)
网上有多个示例可以帮助您编写这样的脚本。使用 fs
文档,但也使用 other 资源。最后,您可以在 it
/describe
语句中添加上述脚本(我记得您使用的是 Mocha)。
2. Use
child_process
's exec command to launch third-party scripts
虽然此方法需要更多的设置工作,但我发现它更适合长期 运行。
!!!注意:除了启动脚本,还需要在第三方框架中编写脚本。
注意: 以上所有框架都可以生成一个 .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
希望这对您有所帮助。