2014-04-02 10 views
7

Esiste un modo per eseguire più test nello stesso browser utilizzando Webdriver (Selenium) utilizzando Xunit, al momento xunit lancia un nuovo browser per ogni nuovo test , qui di seguito è il codice di esempioXunit crea una nuova istanza della classe di test per ogni nuovo test (utilizzando WebDriver e 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"); 
    } 

} 

risposta

5

Mentre io non lo so selenio, so che xUnit.net crea una nuova istanza della classe di test per ogni metodo di prova, in modo che probabilmente spiega il motivo per cui si sta vedendo la comportamento che stai segnalando: il campo driver viene inizializzato di nuovo per ogni metodo di test, poiché il costruttore viene richiamato ogni volta.

Al fine di riutilizzare un singolo FirefoxDriver esempio, è possibile utilizzare l'interfaccia di xUnit.net IUseFixture<T>:

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

L'unica cosa che suggerirei è che deve essere 'IUseFixture ', in modo che questo permetta l'uso di altri driver (Chrome, Firefox, IE ecc.). Tutti i driver di Selenium implementano 'IWebDriver'. – Arran

+0

L'interfaccia 'IUseFixture ' ha il vincolo generico 'T: new()', quindi sfortunatamente non sarà possibile. –

+0

V neat +1 (domani quando avrò più voti: D) Non ho mai pensato che una classe di terze parti (e/o un gruppo di 'Tuple'd di args) potesse essere usata direttamente in un 'Invocaction' di IUseFixture' . –

0

dopo alcune indagini in grado di trovare la soluzione qui è anche aggiornato FirefoxDriver per IWebDriver ::

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"); 
    } 
}