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

pass variables as array specflow c#

我正在尝试使用 Specflow 通过 Selenium 自动执行 Web 测试。到目前为止,一切进展顺利,但我现在 运行 遇到了问题。我的步骤之一允许用户输入变量,该步骤如下所示:

     Given I click the (VARIABLE) Menu

其背后的代码相当简单,只需根据传递的文本单击 link:

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

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

我的问题是,现在企业希望能够同时添加多个项目。这带来了两个问题。尝试再次调用该步骤会引发异常:"An item with the same key has already been added.",如果我将其放入场景大纲中,这将允许我在一秒钟内再次调用该变量 运行,我不能在最后一步使用第一个变量。

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

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

但是,这不起作用,我在 SpecFlow 文档中找到的 "ToArray" 的所有示例似乎都没有真正改变 变量 您从一个步骤传递到另一个数组,它似乎仅在各个步骤内部使用,并且从不在步骤之间传递。在 SpecFlow 中是否可以使用 ScenarioContext.Current.Add(string, variable) 作为数组传递参数?

提前致谢。

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

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 共享数据,因为我发现这允许对数据进行强类型化(因此不需要像上面的示例中那样强制转换)并且它可以让您知道存储了哪些数据,它不仅仅是随机的一袋东西)。