【问题标题】:cucumberjs: finding if a step Result is failedcucumberjs:查找步骤结果是否失败
【发布时间】:2014-06-25 02:58:09
【问题描述】:

任务

  • 使用 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(),无论如何它都会返回true

所以,

  1. 我可能做错了什么?
  2. 我如何真正将 scenario 传递给 after() 方法?

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

【问题讨论】:

    标签: node.js selenium selenium-webdriver mocha.js cucumberjs


    【解决方案1】:

    你需要的是一个后钩

    创建文件 features/support/after_hooks.js

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

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

    【讨论】:

    • 对我也很好!
    【解决方案2】:

    您可以在 (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 = [];
    },
    

    【讨论】:

      【解决方案3】:

      创建 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();
        });
      };
      

      【讨论】:

      • “场景”参数的来源是什么?当我使用scenario.isFailed()时,我得到“isFailed()”不是函数错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 2018-01-01
      • 2020-05-20
      • 1970-01-01
      • 2020-06-15
      相关资源
      最近更新 更多