2015-10-12 52 views
2

我正在尝试使用Specflow来自动化使用Selenium的Web测试。到目前为止,事情总的来说还不错,但我现在遇到了一个问题。我的一个步骤,允许用户输入的变量,步骤如下:传递变量作为数组specflow c#

 Given I click the (VARIABLE) Menu 

和它背后的代码是相当简单的,只是基于传递文本链接上点击:

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

但是,有一个后续步骤必须使用此信息。这很好,你可以使用“ScenarioContext.Current.Add(字符串,变量)”,我知道这一点,并一直在使用它。它起到了我首先通知的需求的作用。

我的问题是,现在企业希望能够同时添加多个项目。这提出了两个问题。试图第二次调用该步骤会引发异常:“已添加具有相同密钥的项目。”如果我把它放到场景纲要中,这将允许我在第二次运行中第二次调用该变量,那么我不能在最后一步中使用第一个变量。

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

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

然而,这并不工作,所有的“ToArray的”的例子我可以SpecFlow文档中发现似乎没有要真正改变的变量传从一个步骤到另一个步骤到一个数组中,它似乎仅用于单个步骤内部,并且从未在步骤之间传递。在SpecFlow中使用ScenarioContext.Current.Add(string,variable)作为数组传递参数?

在此先感谢。

回答

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共享数据,因为我发现这允许数据的强类型(所以不需要像上例中的类型转换),它允许您知道存储了哪些数据,而不仅仅是一个数据随机袋东西)。