0

我尝试使用以下内容codescreenshot其保存在本地。但是,我想将屏幕截图嵌入到cucumber HTML reportJenkins使用json文件生成)。

我应该在此处添加哪些代码embedding应该反映在我的json报告文件中以获取HTML报告中的链接?请建议。

我的代码:

module.exports  = function stepResultHooks() {
var fs = require('fs'), dir = 'features/screenShots/';

this.StepResult(function (event, callBack) {
    var stepResult = event.getPayloadItem('stepResult'), step = stepResult.getStep();

    if (stepResult.isFailed()) {
        browser.takeScreenshot().then(function (png) {
            browser.getCapabilities().then(function (capabilities) {
                var browserName = capabilities.caps_.browserName;
                var browserVersion = capabilities.caps_.version;
                var stream, fname;

                fname = 'Screenshot' + '_' + 'Failed Step' + '_' + step.getName() + '_' + browserName.toUpperCase()+'_'+browserVersion+'_' + new Date() + '.png';
                fname = fname.replace(/"|'|\//g, '').replace(/\s|:|>/g, '_');

                stream = fs.createWriteStream(dir + fname);
                stream.write(new Buffer(png, 'base64'));
                stream.end();
            });
        }).then(callBack);
    } else callBack();
});
4

2 回答 2

1

根据https://github.com/cucumber/cucumber-js#attachments上的文档

您可以使用场景对象将文本、图像和文件附加到 Cucumber 报告中:

在 stepResult 钩子期间无法附加屏幕截图,只能在 After 钩子中。

this.After(function(scenario, next) {
  browser.takeScreenshot().then(function(png) {
    var decodedImage = new Buffer(png, 'base64').toString('binary');
    scenario.attach(decodedImage, 'image/png', next);
  }, function(err) {
    next(err);
  });
});
于 2016-05-24T09:10:40.447 回答
1

您只能在场景的后挂钩中附加,但您可以在每个步骤(在 StepResult 中)截屏,如果这是您所追求的,并将结果存储/推送到数组中。然后,您可以在每个场景结束时将数组内容作为附件推送,并清理数组以用于下一个场景的步骤。

您还可以根据每个步骤/页面的内容获取动态屏幕截图/浏览器高度。见下文。

在您有钩子的文件中执行以下操作:

'use strict';

var eachStepScreensArr = [];

module.exports = function() {

    this.Before(() => {

        //Reset Array with Step screenshots
        eachStepScreensArr = [];

    });

    this.After((scenario) => {

        return browser.driver.manage().window().setSize(1280, 1000).then(function() { //reset size after each scenario
            return browser.driver.manage().window().setPosition(0, 0).then(function() { //reset position after each scenario
                //Attach any step screenshots to the scenario metadata
                for (var key in eachStepScreensArr) {
                    scenario.attach(eachStepScreensArr[key], 'image/png');
                }
            });
        });

        return Promise.resolve();
    });

    this.StepResult((stepResult) => {
        var step = stepResult.getStep();

        if (step.getName() && stepResult.getStatus() !== 'skipped') {

            return browser.executeScript('return {' +
                'height: document.body.scrollHeight,' +
                'width: document.body.scrollWidth' +
                '}'
            ).then(function(result) {
                return browser.driver.manage().window().setSize(/*result.width*/1280, result.height + 50).then(function() {
                    return browser.takeScreenshot().then(function(png) {
                        eachStepScreensArr.push(new Buffer(png.replace(/^data:image\/(png|gif|jpeg);base64,/, ''), 'base64'));
                    });
                });
            });

        }

        return Promise.resolve();
    });
};

如果您使用的是黄瓜 HTML 报告器,请确保它支持多个嵌入(如“cucumber-html-report”),其他大多数只显示第一个。

如果您只截取失败步骤的屏幕截图,请更改行

stepResult.getStatus() !== 'skipped'

stepResult.getStatus() == 'failed'
于 2017-03-28T15:31:30.233 回答