我正在尝试使用量角器中的通用方法保存屏幕截图。两个功能,它创建文件夹,如果它不存在,它保存文件(具有一定条件)。
export function WriteScreenShot(data: string, filename: string) {
let datetime = moment().format('YYYYMMDD-hhmmss');
filename = `../../../test-reports/${filename}.${datetime}.png`;
let path =filename.substring(0, filename.lastIndexOf('/'));
if (!fs.existsSync(path)) {
fs.mkdirSync(path);
}
let stream = fs.createWriteStream(filename);
stream.write(new Buffer(data, 'base64'));
stream.end();
}
这可以通过调用browser.takeScreenshot().then(png => WriteScreenShot(png, 'login/login-page'));
来使用。使用此示例调用,我将假设在WriteScreenShot方法的文件所在的路径中创建一个文件。但情况似乎并非如此。
例如,当我在spec的文件夹中运行我的spec测试时,图像会保存在正确的位置。但是,如果我在项目根目录运行它,则会捕获错误。显然,这与我的相对路径参考有关。如何捕获项目的根目录并从中构建,以便我可以从任何目录运行测试?
答案 0 :(得分:1)
这是一个经典的目录访问错误。让我来解释一下你的代码发生了什么 -
let path =filename.substring(0, filename.lastIndexOf('/'));
以上行输出到../../../test-reports
fs.existsSync
会检查此path
是否存在 -
案例1 :(正面流程)您的spec文件夹位于您尝试创建报告文件夹的当前工作目录中。当您运行测试时,路径存在,它会生成test-reports
目录&截图和你的代码工作正常。
案例2 :(否定流程)当您尝试从当前工作目录的根目录运行它时,fs.existsSync
会尝试检查路径&里面的reports文件夹。如果它不存在,fs.mkdirSync
会尝试创建您的目录,但它会失败,因为它无法创建多个目录。
您应该使用nodejs的原生路径模块来提取路径,而不是使用文件子字符串和 mkdirp 外部模块来创建多个目录。
import * as path from 'path';
let {mkdirp} = require('mkdirp'); // npm i -D mkdirp
export function WriteScreenShot(data: string, filename: string) {
let datetime = moment().format('YYYYMMDD-hhmmss');
filename = `../../../test-reports/${filename}.${datetime}.png`;
let filePath = path.dirname(filename); // output: '../../..' (relative path)
// or
let filePath = path.resolve(__dirname); // output: 'your_root_dir_path' (absolute path)
// or
let filePath = path.resolve('.'); // output: 'your_root_dir_path' (absolute path)
if (!fs.existsSync(filePath )) {
mkdirp.sync(filePath); // creates multiple folders if they don't exist
}
let stream = fs.createWriteStream(filename);
stream.write(new Buffer(data, 'base64'));
stream.end();
}
如果您想知道btw mkdir
& mkdir-p
请阅读SO thread。