2015-09-14 47 views
2

我是新來的C#,我試圖爲我所給予的唯一名稱的項目,然後通過在名稱中的步驟定義使用小黃瓜用SpecFlow通過。我的問題是如何在創建對象時添加標識符,這樣我就可以調用該對象,而無需在每次創建步驟時都傳入對象的實際名稱。設置SpecFlow在標識符

因此,例如代碼將是這個樣子:

[When(@"I click the (.*) button")] 
    public void ClickTheButton(string ButtonName) 
    { 
     driver.Click(ButtonName) 
     //ButtonName would be a string that would call to the ID for the ADD button 
    } 

我希望能夠把像「添加」(太行就寫着「當我點擊添加按鈕」 ),然後讓代碼搜索「ADD」標識符。

我知道在Ruby/Cucumber中這可以通過使用DOM然後傳遞帶有小黃瓜名稱的XML。在Ruby /黃瓜的對象會是這個樣子:

<button gherkin_name="ADD" key="id" value="add_button_12685"/> 

然而,我發現絕對沒有做,在C#與SpecFlow的方式,這是一件我真正需要的是能夠做到的。

有沒有辦法做到這一點?我真正想要做的就是將業務用戶實際可以使用的句柄/參數名稱鏈接到Ruby/Cucumber中的頁面對象,而無需讓用戶知道背景中的代碼。順便說一下,這些對象的名稱幾乎與我添加的小黃瓜線相似,因此它們對於用戶編寫而言非常奇怪。這就是我想爲用戶提供一個標識符的原因。

在此先感謝您的幫助。

編輯:我意識到現在我不太清楚我的原始文章,所以也許一些背景將有所幫助。我使用Selenium-Webdriver來測試一個網站上有數百個項目。爲每一頁上的每一個項目寫一個不同的步驟將會非常繁瑣和耗時。因爲有很多具有完全相同的特性完全相同的物品(例如有類似50個按鈕,所有類似的行爲在一個頁面並在網站上是幾十頁)上的網頁,寫了一個方法來測試他們似乎是最合乎邏輯的想法。確定這些項目與企業可以使用將減少對大宗步內的標識,步數寫入,且其可能性,企業用戶會使用這是最終的目標代碼感覺很舒服。

回答

2

SpecFlow只是BDD框架。它不會驅動瀏覽器本身,您需要安裝驅動瀏覽器的其他軟件包。

在C#中,你有幾種選擇:

  • Selenium,最有名的和你習慣於Page對象的作品。
  • Fluent Automation,這可以作爲對硒的一種包裝,並且使接口更容易(更自然語言)
  • CodedUI,微軟的網絡和用戶界面測試解決方案,與Visual Studio的測試版原生自帶即將到來的庫。

就我個人而言,我認爲硒(帶或不流利自動化)的最佳擬合如果你想安裝硒或其他封裝,SpecFlow(comparisson

工作,你可以安裝的NuGet軟件包管理器可以爲您輕鬆搜索,安裝和更新軟件包。

最後,你有沒有考慮過使用更多的域特定的小黃瓜短語,如When I add a Wabberjock而不是When I press the Add button?這就是BDD的力量所在:在隱藏實現細節的同時暴露意圖。

+0

+ l爲最後一段。 –

+0

對不起,我原本沒有明確表態。我的確在使用Selenium,我正在測試一個Web界面。我們有一個頁面對象模型,我試圖與SpecFlow結合使用。我試圖在對象中添加一個標識符,並且有數百個頁面對象,這意味着如果我採用了最後的建議,就會寫出數百個步驟。如果它在網站上,反射仍然有效嗎? – DAP

3

如果您使用的是PageObject模式,並且有一個屬性Buttons(可能在基類PageObject類中)將可用按鈕公開爲集合(可以通過反射完成),然後您可以只是這樣做:

[When(@"I click the (.*) button")] 
public void ClickTheButton(string ButtonName) 
{ 
    myPage.Buttons.First(button=>button.Name==ButtonName).Click;   
} 

,但我會採取什麼AutomatedChaos說,考慮到與在gerkin一步不使用這個只是有這個作爲一個輔助方法是這樣的

[When(@"I add a widget")] 
public void AddAWidget(string ButtonName) 
{ 
    ClickTheButton("Add")   
} 

private void ClickTheButton(string ButtonName) 
{ 
    myPage.Buttons.First(button=>button.Name==ButtonName).Click;   
} 

Buttons財產不必與反射做,最簡單的實現是這樣的:

public IEnumerable<IWebElement> Buttons 
{ 
    yield return AddButton; 
    yield return RemoveButton; 
    yield return SomeOtherButton; 
    //etc etc 
} 

但使用反射將意味着,當你添加按鈕的頁面對象,你不需要記住要將它們添加到此方法中,它們將自動找到。

+0

啊,我慢慢地意識到DAP沒有使用Web,而是WPF。這應該是正確的答案。 – AutomatedChaos

+0

謝謝你的回答。反射是否適用於網站?我很抱歉,如果它看起來像一個愚蠢的問題,但我只使用C#幾天,並不確定什麼平臺上的工作。 – DAP

+0

yes反射仍然適用於網站,但您不必使用反射。你可以返回每個按鈕。我將編輯我的答案 –