使用量角器保存屏幕截图

时间:2017-06-06 20:11:25

标签: protractor

我正在尝试使用量角器中的通用方法保存屏幕截图。两个功能,它创建文件夹,如果它不存在,它保存文件(具有一定条件)。

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测试时,图像会保存在正确的位置。但是,如果我在项目根目录运行它,则会捕获错误。显然,这与我的相对路径参考有关。如何捕获项目的根目录并从中构建,以便我可以从任何目录运行测试?

1 个答案:

答案 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