我是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来测试一个包含数百个项目的网站。为每个页面上的每个项目写一个不同的步骤将是非常繁琐和耗时的。因为页面上有许多具有完全相同特征的完全相同的项目(例如,在单个页面上的所有行为类似且网站上有几十个页面),所以编写单个方法来测试它们似乎是最合乎逻辑的想法。使用企业可以使用的标识符识别这些项目将减少步骤内部的批量,写入的步骤数量以及业务用户使用最终目标代码的可能性。
答案 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(有或没有Fluent Automation)最适合使用SpecFlow(comparisson)
如果要安装Selenium或其他软件包,可以安装NuGet软件包管理器,以便轻松搜索,安装和更新软件包。
最后,您是否考虑使用更多特定于域名的Gherkin短语,例如When I add a Wabberjock
而不是When I press the Add button
?这就是BDD的力量所在:在隐藏实现细节的同时公开意图。