функция для снятия скриншотов для cucumber-html-reporter генерирует тайм-аут функции после ошибки 5000 ..

Я использую protractor-cucumber-framework, и я хотел создать html-отчет для тестов, которые я написал. Я решил использовать для этого cucumber-html-reporter. В моем hooks.js я написал объект this.After, чтобы сделать снимок экрана при сбое теста:

   this.After(function(scenario, callback) {
     if (scenario.isFailed()) {
        browser.takeScreenshot().then(function(buffer) {
            return scenario.attach(new Buffer(buffer, 'base64'), function(err) {
                callback(err);
            });
        });
     }
     else {
        callback();
     }
   });

Все работает нормально, отчет формируется, а скриншоты делаются и прикрепляются только в случае сбоя теста. Но я также получил сообщение об ошибке при выполнении шага After (когда произошел сбой):

время ожидания функции истекло через 5000 миллисекунд

Я бы хотел избавиться от этого сообщения, так как оно также появляется в моем отчете в формате html. Может ли кто-нибудь предоставить мне решение для этого?


person bartleo    schedule 04.11.2016    source источник
comment
Возможно, вы захотите взглянуть на Serenity / JS, который может дополнить вашу текущую настройку Protractor / Cucumber - см. этот ответ   -  person Jan Molak    schedule 04.03.2017


Ответы (3)


Ниже код работает для меня. Я добавил это в js-файл определения шага. В конце сценария в отчете добавляется скриншот.

defineSupportCode(({After}) => {
    After(function(scenario) {
        if (scenario.isFailed()) {
            var attach = this.attach; 
                return browser.takeScreenshot().then(function(png) {
            var decodedImage = new Buffer(png, "base64");
                return attach(decodedImage, "image/png");
            });
            }
        });
    });
person Naveen Kattimani    schedule 26.09.2017

У меня была аналогичная проблема, и она не удалась даже после 60 секунд ожидания. Проблема заключалась в том, что у меня не был реализован правильный обратный вызов.

Приведенный ниже код работал у меня. (Я новичок в JavaScript, поэтому мое использование обратного вызова может быть правильным. Пожалуйста, не стесняйтесь рассказывать мне, есть ли лучший способ сделать это. :))

After(function(scenario,done)
{
    const world = this;
    if (scenario.result.status === 'failed') {
        browser.takeScreenshot().then(function (stream) {
            let decodedImage = new Buffer(stream.replace(/^data:image\/(png|gif|jpeg);base64,/, ''), 'base64');
            world.attach(decodedImage, 'image/png');
        }).then(function () {
            done();
        });
    }else {
        done();
    }
});
person Navin    schedule 08.02.2018
comment
Можно ли это сделать с помощью protractor.conf.js's onPrepare()? - person Ustaman Sangat; 14.06.2019

Ваш код кажется абсолютно нормальным. Может, просто нужны более длительные таймауты?

Вы можете установить тайм-аут для хуков следующим образом:

this.After({ timeout: 20 * 1000 }, function (scenario, callback) {
  if (scenario.isFailed()) {
    browser.takeScreenshot().then(function(buffer) {
        return scenario.attach(new Buffer(buffer, 'base64'), function(err) {
            callback(err);
        });
    });
  }
  else {
    callback();
  }
});
person KyleFairns    schedule 10.02.2017