gpt4 book ai didi

c# - 设置 SpecFlow 以传入标识符

转载 作者:行者123 更新时间:2023-12-03 09:29:39 24 4
gpt4 key购买 nike

我是 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,然后传入带有小 cucumber 名称的 XML。在 Ruby/Cucumber 中,对象看起来像这样:

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

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

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

预先感谢您的帮助。

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

最佳答案

如果您使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com