2014-04-02 15 views
7

Gibt es eine Möglichkeit, mehrere Tests im selben Browser mit Webdriver (Selenium) mit Xunit zu starten, startet xunit zur Zeit einen neuen Browser für jeden neuen Test unten ist der BeispielcodeXunit neue Instanz der Test-Klasse für jeden neuen Test erstellen (mit WebDriver und C#)

public class Class1 

{ 
    private FirefoxDriver driver; 
    public Class1() 
    { 
     driver = new FirefoxDriver(); 
    } 

    [Fact] 
    public void Test() 
    { 
     driver.Navigate().GoToUrl("http://google.com"); 
     driver.FindElementById("gbqfq").SendKeys("Testing"); 
    } 

    [Fact] 
    public void Test2() 
    { 
     driver.Navigate().GoToUrl("http://google.com"); 
     driver.FindElementById("gbqfq").SendKeys("Testing again"); 
    } 

} 

Antwort

5

Während ich Selen weiß es nicht, ich weiß, dass xUnit.net für jede Testmethode eine neue Instanz der Testklasse erstellt, so dass wahrscheinlich erklärt, warum sehen Sie die Verhalten, über das Sie berichten: Das Feld driver wird für jede Testmethode erneut initialisiert, da der Konstruktor jedes Mal aufgerufen wird.

Um eine einzelne FirefoxDriver Instanz wieder zu verwenden, können Sie xUnit.net die IUseFixture<T> Schnittstelle verwenden:

public class Class1 : IUseFixture<FirefoxDriver> 
{ 
    private FirefoxDriver driver; 

    public void SetFixture(FirefoxDriver data) 
    { 
     driver = data; 
    } 

    [Fact] 
    public void Test() 
    { 
     driver.Navigate().GoToUrl("http://google.com"); 
     driver.FindElementById("gbqfq").SendKeys("Testing"); 
    } 

    [Fact] 
    public void Test2() 
    { 
     driver.Navigate().GoToUrl("http://google.com"); 
     driver.FindElementById("gbqfq").SendKeys("Testing again"); 
    }  
} 
+0

Das einzige, was ich vorschlagen würde ist, dass es sein muss "IUseFixture ", so dass dies ermöglicht andere Treiber verwendet werden (Chrome, Firefox, IE usw.). Alle Treiber von Selenium implementieren 'IWebDriver'. – Arran

+0

Die 'IUseFixture ' Schnittstelle hat die generische Einschränkung' T: new() ', so dass das leider nicht möglich ist. –

+0

V ordentliche +1 (morgen, wenn ich mehr Stimmen bekomme: D) Dachte nie, dass eine dritte Parteiklasse (und/oder ein 'Tuple'd Satz von Argumenten) direkt in einer' IUseFixture' 'Invocaction' verwendet werden könnte . –

0

nach einigen Untersuchungen der Lage, die Lösung zu finden, hier ist und auch FirefoxDriver zu IWebDriver aktualisiert ::

public class SampleFixture : IDisposable 
    { 
    private IWebDriver driver; 
    public SampleFixture() 
    { 
     driver = new FirefoxDriver(); 
     Console.WriteLine("SampleFixture constructor called"); 

    } 

    public IWebDriver InitiateDriver() 
    { 
     return driver; 
    } 

    public void Dispose() 
    { 
     // driver.Close(); 
     driver.Quit(); 
     Console.WriteLine("Disposing Fixture"); 
    } 
} 

public class Class1 : IUseFixture<SampleFixture> 
{ 
    private IWebDriver driver; 

    public void SetFixture(SampleFixture data) 
    { 
     driver = data.InitiateDriver(); 
    } 

    [Fact] 
    public void Test() 
    { 
     driver.Navigate().GoToUrl("http://google.com"); 
     driver.FindElement(By.Id("gbqfq")).SendKeys("Testing"); 
    } 

    [Fact] 
    public void Test2() 
    { 
     driver.Navigate().GoToUrl("http://google.com"); 
     driver.FindElement(By.Id("gbqfq")).SendKeys("Testing again"); 
    } 
} 
Verwandte Themen