设置SpecFlow以传入标识符

时间:2015-09-14 19:03:56

标签: c# selenium identifier specflow pageobjects

我是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
    }

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

我知道这可以在Ruby / Cucumber中使用DOM,然后使用gherkin名称传递XML。在Ruby / Cucumber中,对象看起来像这样:

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

但是,我发现在使用SpecFlow的C#中完全没办法做到这一点,这是我真正需要做的事情。

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

提前感谢您的帮助。

编辑:我现在意识到我在原帖中不够清楚,所以也许有些背景会有所帮助。我正在使用Selenium-Webdriver来测试一个包含数百个项目的网站。为每个页面上的每个项目写一个不同的步骤将是非常繁琐和耗时的。因为页面上有许多具有完全相同特征的完全相同的项目(例如,在单个页面上的所有行为类似且网站上有几十个页面),所以编写单个方法来测试它们似乎是最合乎逻辑的想法。使用企业可以使用的标识符识别这些项目将减少步骤内部的批量,写入的步骤数量以及业务用户使用最终目标代码的可能性。

2 个答案:

答案 0 :(得分:3)

如果您正在使用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
}

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

答案 1 :(得分:2)

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

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

  • Selenium,最知名的,适用于您习惯使用的Page Object。
  • Fluent Automation,一个即将推出的库,可以作为Selenium之上的包装器,使接口更容易(更自然的语言)
  • CodedUI,Microsofts Web和UI测试解决方案,本身随Visual Studio Test版本一起提供。

就个人而言,我认为Selenium(有或没有Fluent Automation)最适合使用SpecFlow(comparisson

如果要安装Selenium或其他软件包,可以安装NuGet软件包管理器,以便轻松搜索,安装和更新软件包。

最后,您是否考虑使用更多特定于域名的Gherkin短语,例如When I add a Wabberjock而不是When I press the Add button?这就是BDD的力量所在:在隐藏实现细节的同时公开意图。