如何获取由 specflow 场景的 [Given-when-then] 方法之一抛出的异常消息

How to get Exception message thrown by one of the specflow scenario's [Given-when-then] methods

我正在使用 specflow 来自动化我的测试。正如预期的那样,当任何 [Given-when-then] 方法说找不到元素时,它们会抛出异常。我想在每个场景之后调用的 [afterscenario] 方法中获取此异常的错误消息。 这可能吗?

例如下面是我需要捕捉的错误信息

您正在寻找 ScenarioContext.Current.TestError。我尝试查看 SpecFlow 文档,但我想我通过在 Visual Studio.

中使用 Intellisense 深入研究 ScenarioContext.Current 属性 找到了这个 属性
using TechTalk.SpecFlow;

namespace Your.Project
{
    [Binding]
    public class CommonHooks
    {
        [AfterScenario]
        public void AfterScenario()
        {
            Exception lastError = ScenarioContext.Current.TestError;

            if (lastError != null)
            {
                if (lastError is OpenQA.Selenium.NoSuchElementException)
                {
                    // Test failure cause by not finding an element on the page
                }
            }
        }
    }
}

为了避免在访问ScenarioContext.Current时在多线程上下文中进行运行测试时出现异常,您可以利用内置的依赖注入框架将当前上下文作为构造函数参数传递给你的 CommonHooks class:

[Binding]
public class CommonHooks
{
    public CommonHooks(ScenarioContext currentScenario)
    {
        this.currentScenario = currentScenario;
    }

    private ScenarioContext currentScenario;

    [AfterScenario]
    public void AfterScenario()
    {
        Exception lastError = currentScenario.TestError;

        if (lastError != null)
        {
            if (lastError is OpenQA.Selenium.NoSuchElementException)
            {
                // Test failure cause by not finding an element on the page
            }
        }
    }
}

考虑到 ScenarioContext.Current 已过时,我想建议另一种变体。

这是一个 Hooks class

public class Hooks
{
    [BeforeScenario]
    public void CreateWebDriver(ScenarioContext context)
    {
        var options = new ChromeOptions();
        options.AddArgument("--start-maximized");
        options.AddArgument("--disable-notifications");

        IWebDriver driver = new ChromeDriver(options);
        context["WebDriver"] = driver;
    }

    [AfterScenario]
    public void AfterScenario(ScenarioContext context)
    {
        var driver = context["WebDriver"] as IWebDriver;            

        if (context.TestError != null)
        {
            //Do something();
        }
        driver.Quit();
    }
}