【问题标题】:Setting up SpecFlow to pass in identifiers设置 SpecFlow 以传入标识符
【发布时间】:2015-09-15 20:00:17
【问题描述】:

我是 C# 新手,我正在尝试使用 SpecFlow,就像我过去使用 Gherkin 一样,通过为项目提供唯一名称,然后在步骤定义中传递名称。我的问题是关于如何在创建对象时添加标识符,这样我就可以调用该对象,而不必在每次创建步骤时都传递对象的实际名称。

因此,例如,代码如下所示:

    [When(@"I click the (.*) button")]
    public void ClickTheButton(string ButtonName)
    {
         driver.Click(ButtonName)
         //ButtonName would be a string that would call to the ID for the ADD button
    }

我希望能够输入“添加”之类的内容(因此该行将显示为“当我单击添加按钮时”),然后让代码搜索“添加”标识符。

我知道这在 Ruby/Cucumber 中是可能的,方法是使用 DOM,然后传入带有小黄瓜名称的 XML。在 Ruby/Cucumber 中,对象看起来像这样:

    <button gherkin_name="ADD" key="id" value="add_button_12685"/>

但是,我发现在 C# 中使用 SpecFlow 绝对没有办法做到这一点,而这是我真正需要能够做到的事情。

有没有办法做到这一点?我真正想做的就是将业务用户实际可以使用的句柄/参数名称链接到页面对象,就像在 Ruby/Cucumber 中一样,无需让用户知道后台代码。而且,顺便说一句,对象的名称几乎与我添加的小黄瓜行完全相同,因此让用户编写它们非常奇怪。这就是我希望只为用户提供一个标识符的原因。

提前感谢您的帮助。

编辑:我现在意识到我在原始帖子中不够清楚,所以也许一些背景知识会有所帮助。我正在使用 Selenium-Webdriver 来测试一个包含数百个项目的网站。为每个页面上的每个项目编写不同的步骤将非常乏味和耗时。因为页面上有许多具有完全相同特性的完全相同的项目(例如,在一个页面上有 50 个按钮,它们的行为都相似,而网站有几十个页面),编写一个方法来测试它们似乎是最合乎逻辑的想法。使用业务可以使用的标识符来识别这些项目将减少 Steps 内部的体积、编写的步骤数以及业务用户使用作为最终目标的代码感到自在的可能性。

【问题讨论】:

    标签: c# selenium identifier specflow pageobjects


    【解决方案1】:

    如果您使用 PageObject 模式并且有一个属性 Buttons(可能基于 PageObject 类),您可以做您想做的事,它将可用按钮作为一个集合公开(可以通过反射完成)和那么你可以这样做:

    [When(@"I click the (.*) button")]
    public void ClickTheButton(string ButtonName)
    {
         myPage.Buttons.First(button=>button.Name==ButtonName).Click;         
    }
    

    但我会考虑 AutomatedChaos 所说的,而不是在 gerkin 中的一个步骤中使用它,而只是将它作为类似这样的辅助方法

    [When(@"I add a widget")]
    public void AddAWidget(string ButtonName)
    {
         ClickTheButton("Add")        
    }
    
    private void ClickTheButton(string ButtonName)
    {
         myPage.Buttons.First(button=>button.Name==ButtonName).Click;         
    }
    

    您的Buttons 属性不必通过反射来完成,最简单的实现是这样的:

    public IEnumerable<IWebElement> Buttons
    {
         yield return AddButton;
         yield return RemoveButton;
         yield return SomeOtherButton;
         //etc etc
    }
    

    但是使用反射意味着当你向页面对象添加按钮时,你不需要记住将它们添加到这个方法中,它们会被自动找到。

    【讨论】:

    • 啊,我慢慢意识到DAP用的不是Web,而是WPF。这应该是正确的答案。
    • 感谢您的回答。反射是否适用于网站?如果这看起来是一个愚蠢的问题,我很抱歉,但我只使用 C# 几天,并不确定什么在什么平台上有效。
    • 是的,反射仍然适用于网站,但您不必使用反射。您可以只返回每个按钮。我会编辑我的答案
    • 我将如何在步骤中使用 IEnumerable 元素?对我来说,看起来我仍然有没有将标识符链接到对象的相同问题。如果这是一个愚蠢的问题,我很抱歉,但我对 C# 的了解相当有限。
    • 你会按照上面的答案使用它:myPage.Buttons.First(button=&gt;button.Name==ButtonName).Click
    【解决方案2】:

    SpecFlow 只是 BDD 框架。它本身不会驱动浏览器,您需要安装驱动浏览器的其他软件包。

    使用 C#,您有几个选择:

    • Selenium,最知名的,可与您习惯的页面对象一起使用。
    • Fluent Automation,即将推出的库,作为 Selenium 之上的包装器,使接口更容易(更自然的语言)
    • CodedUI,Microsoft 的 Web 和 UI 测试解决方案,自带 Visual Studio 测试版。

    就个人而言,我认为 Selenium(无论是否使用 Fluent Automation)最适合与 SpecFlow 一起使用 (comparisson)

    如果您想安装 Selenium 或其他包,您可以安装 NuGet 包管理器,以便为您轻松搜索、安装和更新包。

    最后,您是否考虑过使用更多特定领域的 Gherkin 短语,例如 When I add a Wabberjock 而不是 When I press the Add button?这就是 BDD 的强大之处:在隐藏实现细节的同时暴露意图。

    【讨论】:

    • +l 表示最后一段。
    • 很抱歉我最初没有说清楚。我确实在使用 Selenium,并且正在测试 Web 界面。我们确实有一个页面对象模型,我正在尝试将其与 SpecFlow 结合使用。我正在尝试在对象中添加一个标识符,并且有数百个页面对象,如果我接受您的最后建议,这意味着要编写数百个步骤。如果它在网站上,Reflection 是否仍然有效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多