Protractor 使用量角器保存屏幕截图

Protractor 使用量角器保存屏幕截图,protractor,Protractor,我正试图在量角器中使用通用方法保存一个屏幕截图。有两个功能,它在文件夹不存在时创建文件夹,并保存文件(在特定条件下) 这可以通过调用browser.takeScreenshot().then(png=>WriteScreenShot(png,'login/login page'))来使用使用这个示例调用,我假设将在WriteScreenShot方法的文件所在的相对路径中创建一个文件。但情况似乎并非如此 例如,当我在spec文件夹中运行spec测试时,图像会保存在正确的位置。但是如果我在项目根目录

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

这可以通过调用
browser.takeScreenshot().then(png=>WriteScreenShot(png,'login/login page'))来使用使用这个示例调用,我假设将在WriteScreenShot方法的文件所在的相对路径中创建一个文件。但情况似乎并非如此


例如,当我在spec文件夹中运行spec测试时,图像会保存在正确的位置。但是如果我在项目根目录下运行它,就会出现一个错误。显然,这与我的相对路径引用有关。如何捕获项目的根目录并从中构建,以便可以从任何目录运行测试?

这是一个典型的目录访问错误。让我解释一下你的代码发生了什么-

 let path =filename.substring(0, filename.lastIndexOf('/'));
上述行输出到
。/../../../test reports

fs.existsSync
检查此路径是否存在-

案例1:(正向流)您的spec文件夹与您尝试创建报告文件夹的当前工作目录相同。当您运行测试时,路径存在,它生成
测试报告
目录和屏幕截图,您的代码运行正常

案例2:(负流)当您尝试从根目录(当前工作目录)运行它时,
fs.existsSync
尝试检查其中的路径和报告文件夹。如果它不存在,
fs.mkdirSync
尝试创建目录,但会失败,因为它无法创建多个目录

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();
}
您应该使用nodejs的本机path模块来提取路径,而不是使用文件子字符串和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();
}

如果您想知道这两者之间的区别,请阅读此文。

您能给出一个如何运行配置以及从何处运行配置的示例吗?有几种方法可以做到这一点,但是运行脚本的位置对于确定最佳解决方案非常有用。我还找到了应用程序根路径模块。