我是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"/>


但是,我发现使用SpecFlow在C#中绝对无法做到这一点,而这正是我真正需要做的。

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

在此先感谢您的帮助。

编辑:我意识到现在我在原始帖子中还不够清楚,所以也许有一些背景会有所帮助。我正在使用Selenium-Webdriver测试具有数百个项目的网站。为每个页面上的每个项目编写不同的步骤将非常繁琐且耗时。因为页面上有许多具有完全相同特征的完全相同的项目(例如,大约50个按钮在单个页面上的行为都相似,而站点则是数十个页面),所以编写了一种测试它们的方法似乎是最合乎逻辑的想法。使用企业可以使用的标识符来标识这些项目将减少“步骤”中的大量内容,编写的步骤数量以及使用最终目标代码的业务用户感到自在的可能性。

最佳答案

如果您使用的是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
}


但是使用反射意味着将按钮添加到页面对象时,无需记住将按钮添加到此方法中,即可自动找到它们。

关于c# - 设置SpecFlow以传递标识符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32572055/

10-13 05:03