【问题标题】:BeforeScenario and AfterScenario hooks not working in specflowBeforeScenario 和 AfterScenario 挂钩在 specflow 中不起作用
【发布时间】:2019-12-31 09:46:52
【问题描述】:

我的 SeleniumSteps.cs 代码中有以下代码 我正在尝试让 AfterScenario 在调试这些测试时触发

using PrivateDomain;
using Machine.Specifications;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using TechTalk.SpecFlow;

namespace Functional.Steps
{
    public class SeleniumSteps : PrivateDomain.Steps.SeleniumSteps
    {
        #region Hooks
        [BeforeScenario]
        public void Before()
        {
            // before 
        }

        [AfterTestRun, Scope(Tag = null)]
        public new static void AfterTestRun()
        {
            // after testrun
        }

        [AfterScenario]
        public void AfterScenarioErrorScreenshot()
        {
            // after scenario
        }

        #endregion
    }
}





using OpenQA.Selenium;
using TechTalk.SpecFlow;

namespace PrivateDomain.Steps
{
    [Binding]
    [Scope(Tag = "Selenium")]
    public class SeleniumSteps
    {
        protected static IWebDriver webDriver;

        public SeleniumSteps();

        public virtual IWebDriver WebDriver { get; }

        [AfterTestRun]
        [Scope(Tag = null)]
        public static void AfterTestRun();

        [AfterScenarioAttribute(new[] { })]
        public virtual void AfterScenario();

    }
}

我的功能文件如下所示: (已删除详细信息)

@Customer_Portal
Feature: Account Management - Registration
    In order to create an account
    As a customer
    I want to register my details with the application

Scenario: Register

    # Registration Form
    When I navigate to "/Customer/Account/Register"
    // more code...


Scenario: Required Fields

    // more code...

Scenario: Invalid Contact Details

    // more code...

Scenario: Insufficient Password Strength

    // more code...

Scenario: Password Mismatch

    // more code...

Scenario: Already Registered

    // more code...

Scenario: Invalid Activation

    // more code...

Scenario: Already Activated

   // more code...

当我调试测试时,我可以看到调试器点击 AfterTestRun 部分。 但是,BeforeScenarioAfterScenario 都没有被执行。

谁能告诉我我做错了什么?

【问题讨论】:

    标签: selenium specflow


    【解决方案1】:

    首先,正如 Sandesh 在他的回答中指出的那样,您的 SeleniumSteps 子类缺少 [Binding] 属性。仅在基类中拥有[Binding] 是不够的,您必须将它应用到您的钩子方法或步骤定义(绑定)所在的每个类,因为这就是 specflow 如何在底层搜索钩子和绑定的方式。它就像范围标识符。如果您错过将[Binding] 属性放置到类中,specflow 将不会在该类中搜索潜在的钩子方法或绑定。文档链接:https://specflow.org/documentation/Hooks/

    这个链接也很有用。检查 RunOfTheShipe 给出的答案:Specflow test step inheritance causes "Ambiguous step definitions"

    【讨论】:

    • 感谢您的回复 - [Binding] 属性存在。我尝试了您提到的步骤,但不幸的是结果相同。你知道为什么 AfterTestRun 被成功调用而其他的没有吗?
    • 不,我不知道为什么会这样。你能编辑你的问题,并提供更多关于你的钩子定义的类的信息吗?您的那个类是否在其他任何地方使用 - 用于继承?
    • 你能展示你的 .feature 文件吗?以及与功能和场景相关的标签。请用它更新您的问题。
    • 好的,解决方案很少。尝试下一个:1. 你能从public class SeleniumSteps 中删除[Scope(Tag = "Selenium")],或者2. 只需为同一个类添加另一个Scope 属性,例如:[Scope(Tag = "Customer_Portal")],或者3. 只需将新的@Selenium 标签添加到您的Feature: Account Management - Registration
    • 谢谢大家 - 建议 3 对我有用。基类实际上来自一个 dll,所以我无法改变它。在我的功能文件中添加标签对我有用
    【解决方案2】:

    您在 SeleniumSteps 中错过了 [Binding] 属性

        namespace Functional.Steps
        {
             [Binding]
            public class SeleniumSteps : PrivateDomain.Steps.SeleniumSteps
            {
                #region Hooks
                [BeforeScenario]
                public void Before()
                {
                    // before 
                }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多