将变量作为数组specflow传递c#

时间:2015-10-12 12:12:41

标签: c# arrays specflow

我正在尝试使用Specflow来使用Selenium自动化Web测试。到目前为止,事情进展顺利,但我现在遇到了问题。我的一个步骤允许用户输入变量,步骤如下:

     Given I click the (VARIABLE) Menu

它背后的代码非常简单,只需点击基于传递的文本的链接:

     driver.FindElement(By.XPath("Xpath to get to the variable")).Click();

但是,有一个必须使用此信息的后续步骤。没关系,你可以使用" ScenarioContext.Current.Add(string,variable)"我知道并且一直在使用它。它的功能满足了我第一次被告知的需求。

我的问题是,现在企业希望能够同时添加多个项目。这提出了两个问题。尝试再次调用该步骤会抛出异常:"已经添加了具有相同键的项目。"如果我将它放入一个场景大纲,这将允许我在第二次运行中第二次调用变量,我不能在最后一步中使用第一个变量。

逻辑上,这意味着多次传递一个变量就是问题(这是有意义的,因为它以字符串形式传入),因此将变量作为数组传递似乎是合乎逻辑的方法。我的想法是,当我将参数从一个步骤传递到另一个步骤而不是作为一个字符串时,我理论上不会遇到这个错误然后我将能够遍历使用for循环在后面的步骤中的数组中的项目。这似乎是SpecFlow应该能够做到的事情,但我在找到如何实现这一目标时遇到了问题。有没有人知道如何做到这一点?我试图仅使用:

     Scenario.Context.Current.Add(string, variable).ToArray();

然而,这不起作用,以及" ToArray"的所有例子。我可以在SpecFlow文档中找到似乎实际上没有将您从一个步骤传递到另一个步骤的变量更改为一个数组,它似乎只在单个步骤中使用并且从未通过步骤之间。是否可以在SpecFlow中使用ScenarioContext.Current.Add(string,variable)作为数组传递参数?

提前致谢。

1 个答案:

答案 0 :(得分:1)

对您的问题最简单的解决方案是在第一步中向上下文添加一个数组(或列表),然后将其取出并添加到它,然后在以后的步骤中再次替换它:

List<string> list = new List<String>();
list.Add(variable)
ScenarioContext.Current.Add(name, list);

然后再

List<String> currentList = (List<String>) ScenarioContext.Current[string];
currentList.Add(variable);
ScenarioContext.Current[name]=list;

但是我觉得有责任指出当前解决方案的一些问题。您应该调查PageObject pattern并在页面对象中隐藏元素选择XPath。想象一下,企业决定改变存储信息的元素。现在你必须改变执行此操作的每个测试:

driver.FindElement(By.XPath("Xpath to get to the variable")).Click();

表示该变量。使用页面对象模式,它隐藏在页面对象中,您只能有一个地方可以更改。

我个人也会考虑使用context injection共享数据,因为我发现这样可以强类型化数据(因此不需要像上面的示例那样进行强制转换),它可以让您知道存储了哪些数据,不只是一个随机的东西。)