2013-04-10 31 views
2

我正在做UI測試。起初,我只使用Firefox瀏覽器驅動程序開始,所以我將在類下聲明WebDriverWait變量,並在代碼塊中顯示的[SetUp]方法下指定它,並且每個測試都可以使用它。如何在測試驅動程序類型爲測試用例時實例化像WebDriverWait這樣的變量?

public class FirefoxTest { 
public IWebDriver _driver; 
public WebDriverWait _wait; 
    [SetUp] 
    public void SetupTest() { 
      _driver = new FirefoxDriver(); 
      _wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(30)); 
    } 

然後我試圖通過與[TestCaseSource(typeof運算(WebDriverFactory), 「驅動程序」)]屬性指定它們將更多BrowserDrivers。所以現在_driver變量必須從[SetUp]中移出,並且_wait變量不知道要使用哪個_driver。

我試圖在每個測試中實例化它,但這是重複性的,那些測試使用的方法也需要WebDriverWait變量,當另一個測試試圖實現它們時,這些方法不會再運行,因爲WebDriverWait變量已經聲明。

我的問題是我可以在哪裏實例化WebDriverWait和其他驅動程序相關的東西,通常用[SetUp]和[TearDown]寫成,比如driver.Quit(),當驅動程序被賦予[TestCase]時。

現在,我已經試寫的

[TestCaseSource(typeof(WebDriverFactory), "Drivers")] 
public void SomeTest(IWebDriver driver){ 
    driver.Navigate().GoTo.... 
} 

的問題是,然後我必須包括

WebDriverWait _wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); 
driver.Quit() 
在所有的測試

和_wait在所有在重用的方法試驗。我在[SetUp]和[Teardown]中擁有的東西。

回答

1

你有兩種選擇。您不會提及WebDriverFactory上的Drivers屬性是靜態屬性還是實例屬性。如果它是一個靜態屬性,我會添加一個靜態的QuitAll方法,我可以在我的TearDown方法中調用。如果它是一種實例方法,事情就會變得棘手,而且我不確定你可以從這裏用NUnit來實現。

在另一方面,而不是創建一個WebDriverFactory類實例化的驅動程序,還有的TestCaseSource屬性,允許您指定的測試住在類的屬性或字段的另一種形式,它也可能會爲工作屬性或基類的字段,但是你必須嘗試一下才能確定。然後,您可以使用您的測試運行的同一個類的成員,並且可以完全控制驅動程序對象的生命週期。這將是這個樣子:

// WARNING! Untested code written from memory 
// without the aid of an IDE. Not guaranteed to 
// work or even compile without modification. 
// Use private field, public property 
// (personal choice). 
private List<IWebDriver> activeDrivers = new List<IWebDriver>(); 
public List<IWebDriver> ActiveDrivers 
{ 
    get { return this.activeDrivers; } 
} 

[TestFixtureSetUp] 
public void InitializeDrivers() 
{ 
    // Will run once for the class. 
    // Use [SetUp] attribute to run 
    // before each test method. 
    this.activeDrivers.Add(new InternetExplorerDriver()); 
    this.activeDrivers.Add(new FirefoxDriver()); 
    this.activeDrivers.Add(new ChromeDriver()); 
} 

[TestFixtureTearDown] 
public void QuitAllDrivers() 
{ 
    foreach(IWebDriver driver in this.activeDrivers) 
    { 
     driver.Quit(); 
    } 
} 

[TestCaseSource("ActiveDrivers")] 
public void MyTest(IWebDriver driver) 
{ 
    // Test goes here 
} 

通知我不是說你WebDriverWait場什麼。這是因爲WebDriverWait對象相當輕量級,並且構建起來花費不多。如果您認爲有點播長得難看或者在你的代碼太冗長的構造函數,那麼您可以將這到一個單獨的方法,你可以從你的測試中調用,像這樣:

private void WaitUntil<T>(IWebDriver driver, Func<IWebDriver, T> until) 
{ 
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); 
    wait.Until<T>(until); 
} 
+0

這解決了問題我在我特別像WebDriverWait分離方法。謝謝。 – 2013-04-15 14:10:39

0

你可以[TestCase]這樣的實例類型:

[TestCase(typeof(WebDriverWait))] 
public class Test(Type driverType) 
{ 
    _driver = Activator.CreateInstance(type, args); 
} 

我不知道你的所有確切類型和參數,但Activator.CreateInstance可以對你有所幫助。

+0

我不知道你明白了什麼我在問。我編輯了我的帖子以包含我的測試方法。 – 2013-04-11 01:58:55

相關問題