4

任务

  • 使用 selenium、webdriver、cucumberjs 执行自动化验收测试。
  • 查找失败的验收测试场景并截取页面截图
  • 将其保存为 go 管道中的人工制品。

这就是我今天的任务。我已经完成了所有这些,包括编写场景测试、selenium 设置、go 管道以及其他所需的一切。

唯一的问题是 - 我无法弄清楚如何找到失败的场景步骤并截取页面的屏幕截图。

问题详细信息:我在步骤定义中放置了以下代码,该代码针对每个场景步骤运行

//file: features/setpdefinitions/common.step.js

var commonWrapper = function commonWrapper() {

    this.World = require('../support/world').World;

    this.Before(function (next) {
        this.initBrowser(next);
    });

    this.After(function (next) {
        this.browser.quit(next);
    });

    this.StepResult(function (event, callback) {
        var stepResult = event.getPayloadItem('stepResult');
        console.log(stepResult.isFailed());
        callback();
    });
};

module.exports = commonWrapper;

包含World浏览器启动方法。

而且,这是我正在测试的示例功能场景

Feature: Forgot Password
     As a user of Booking My account
     I want to reset my password
     So that I can login to my account when I forget my password

 Scenario: On unsuccessful entering invalid email id
    Given I am on forgot password page
    When I enter invalid email "invalidemail-someDomain.com"
        And click submit button
    Then I should see validation message "Please enter a valid email."

问题在于上下文数据。我不知何故无法将scenario传递给 after/before 方法作为第一个参数。我尝试了 cucumberjs 源代码中给出的代码,但未能成功。因此,我开始添加该stepResult方法,该方法在每次完成一个步骤时运行。比较类似的做法。

根据文档,该isFailed()方法根据步骤结果返回一个布尔值。false但是,无论步骤失败或通过,我总是得到一个。我尝试了它的alter-ego ,它无论如何isSuccessful()都会返回a 。true

所以,

  1. 我在这里可能做错了什么?
  2. 我如何实际将场景传递给 after() 方法?

我对 TDD 比较陌生,但是到目前为止,这是一次很棒的经历。

4

3 回答 3

7

你需要的是一个后钩

创建文件 features/support/after_hooks.js

module.exports = function() {
    this.After(function (scenario, callback) {
        if (scenario.isFailed()) {
            // Do your after stuff here
        }
        callback();
    });
};

请注意,这仅在每个功能之后执行

于 2014-11-27T14:13:00.317 回答
1

您可以在 (cucumberjs 1.x) https://github.com/cucumber/cucumber-js/blob/1.x/lib/cucumber/api/scenario.js#L27中获得更多详细信息

getKeyword: function getKeyword() {
    return astScenario.getKeyword();
},
getName: function getName() {
    return astScenario.getName();
},
getDescription: function getDescription() {
    return astScenario.getDescription();
},
getUri: function getUri() {
    return astScenario.getUri();
},
getLine: function getLine() {
    return astScenario.getLine();
},
getTags: function getTags() {
    return astScenario.getTags();
},
isSuccessful: function isSuccessful() {
    return scenarioResult.getStatus() === Cucumber.Status.PASSED;
},
isFailed: function isFailed() {
    return scenarioResult.getStatus() === Cucumber.Status.FAILED;
},
isPending: function isPending() {
    return scenarioResult.getStatus() === Cucumber.Status.PENDING;
},
isUndefined: function isUndefined() {
    return scenarioResult.getStatus() === Cucumber.Status.UNDEFINED;
},
isSkipped: function isSkipped() {
    return scenarioResult.getStatus() === Cucumber.Status.SKIPPED;
},
getException: function getException() {
    return scenarioResult.getFailureException();
},
getAttachments: function getAttachments() {
    return attachments;
},
clearAttachments: function clearAttachments() {
    attachments = [];
},
于 2016-09-19T05:53:59.083 回答
0

创建 afterhook.js 并检查失败的场景您可以使用 browser.saveScreenshot 来保存屏幕截图。保存屏幕截图时,对文件名使用时间戳,并从版本控制中排除屏幕截图

module.exports = function() {
  this.After((scenario, callback) => {
    if (scenario.isFailed()) {
      const d = new Date();
      browser.saveScreenshot(
        `./e2e/screenshots/screenshot-${d.toISOString()}.png`
      );
    }
    callback();
  });
};
于 2018-11-01T17:16:56.703 回答