【问题标题】:pass variables as array specflow c#将变量作为数组specflow c#
【发布时间】:2015-10-13 14:54:59
【问题描述】:

我正在尝试使用 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();

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

提前致谢。

【问题讨论】:

    标签: c# arrays specflow


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2011-01-19
      • 2011-01-11
      相关资源
      最近更新 更多