2015-10-12 49 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共享數據,因爲我發現這允許數據的強類型(所以不需要像上例中的類型轉換),它允許您知道存儲了哪些數據,而不僅僅是一個數據隨機袋東西)。