Ejecute pruebas de Selenium en varios navegadores uno tras otro desde C # NUnit

Estoy buscando la mejor / recomendada manera de hacer que las pruebas de Selenium se ejecuten en varios navegadores uno tras otro. El sitio web que estoy probando no es grande, por lo que aún no necesito una solución paralela.

Tengo los métodos de configuración de prueba habituales con [SetUp] , [TearDown] y [Test] . El SetUp uno, por supuesto, ejemplifica un nuevo objeto ISelenium con cualquier navegador con el que quiera probar.

Entonces, lo que quiero hacer es decir programáticamente: esta prueba se ejecutará en Chrome, IE y Firefox en secuencia. ¿Cómo puedo hacer eso?

EDITAR:

Esto podría ayudar un poco. Estamos usando CruiseControl.NET para comenzar las pruebas de NUnit después de una comstackción exitosa. ¿Hay alguna forma de pasar un parámetro al ejecutable de NUnit y luego usar ese parámetro en la prueba? De esta forma podríamos ejecutar NUnit varias veces con diferentes parámetros del navegador.

NUnit 2.5+ ahora es compatible con los dispositivos de prueba generics que hacen que las pruebas en varios navegadores sean muy sencillas. http://www.nunit.org/index.php?p=testFixture&r=2.5

Ejecutar el siguiente ejemplo ejecutará GoogleTest dos veces, una en Firefox y otra en IE.

 using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Firefox; using OpenQA.Selenium.IE; using System.Threading; namespace SeleniumTests { [TestFixture(typeof(FirefoxDriver))] [TestFixture(typeof(InternetExplorerDriver))] public class TestWithMultipleBrowsers where TWebDriver : IWebDriver, new() { private IWebDriver driver; [SetUp] public void CreateDriver () { this.driver = new TWebDriver(); } [Test] public void GoogleTest() { driver.Navigate().GoToUrl("http://www.google.com/"); IWebElement query = driver.FindElement(By.Name("q")); query.SendKeys("Bread" + Keys.Enter); Thread.Sleep(2000); Assert.AreEqual("bread - Google Search", driver.Title); driver.Quit(); } } } 

Esta es una pregunta recurrente y se resuelve de varias maneras:

  1. El método Factory produce su objeto ISelenium. Tiene una clase auxiliar con un método getSelenium estático. Ese método se lee en una configuración externa, que tiene una propiedad que define el navegador que desea como una cadena. En su getSelenium, entonces configura el navegador en consecuencia. aquí hay una publicación útil sobre el uso de archivos de configuración con NUnit http://blog.coryfoy.com/2005/08/nunit-app-config-files-its-all-about-the-nunit-file/

  2. Otros tienen éxito al inyectar el navegador a través de un contenedor IoC. Me gusta mucho porque TestNG funciona muy bien con Guice en Java, pero no estoy seguro de lo fácil que es mezclar NUnit y Ninject, MEF, etc.

Esto es básicamente una expansión de la respuesta de Alanning (21 de octubre de 2011 a las 20:20). Mi caso fue similar, solo que no quería ejecutar con el constructor sin parámetros (y así utilizar la ruta predeterminada para los ejecutables del controlador). Tenía una carpeta separada que contenía los controladores con los que quería probar, y esto parece funcionar muy bien:

 [TestFixture(typeof(ChromeDriver))] [TestFixture(typeof(InternetExplorerDriver))] public class BrowserTests where TWebDriver : IWebDriver, new() { private IWebDriver _webDriver; [SetUp] public void SetUp() { string driversPath = Environment.CurrentDirectory + @"\..\..\..\WebDrivers\"; _webDriver = Activator.CreateInstance(typeof (TWebDriver), new object[] { driversPath }) as IWebDriver; } [TearDown] public void TearDown() { _webDriver.Dispose(); // Actively dispose it, doesn't seem to do so itself } [Test] public void Tests() { //TestCode } } 

}

Utilizo una lista del controlador IWeb para realizar pruebas en todos los navegadores, línea por línea:

 [ClassInitialize] public static void ClassInitialize(TestContext context) { drivers = new List(); firefoxDriver = new FirefoxDriver(); chromeDriver = new ChromeDriver(path); ieDriver = new InternetExplorerDriver(path); drivers.Add(firefoxDriver); drivers.Add(chromeDriver); drivers.Add(ieDriver); baseURL = "http://localhost:4444/"; } [ClassCleanup] public static void ClassCleanup() { drivers.ForEach(x => x.Quit()); } ..and then am able to write tests like this: [TestMethod] public void LinkClick() { WaitForElementByLinkText("Link"); drivers.ForEach(x => x.FindElement(By.LinkText("Link")).Click()); AssertIsAllTrue(x => x.PageSource.Contains("test link")); } 

..donde estoy escribiendo mis propios métodos WaitForElementByLinkText y AssertIsAllTrue para realizar la operación de cada controlador, y donde algo falla, para generar un mensaje que me ayude a identificar qué navegador (s) pueden haber fallado:

  public void WaitForElementByLinkText(string linkText) { List failedBrowsers = new List(); foreach (IWebDriver driver in drivers) { try { WebDriverWait wait = new WebDriverWait(clock, driver, TimeSpan.FromSeconds(5), TimeSpan.FromMilliseconds(250)); wait.Until((d) => { return d.FindElement(By.LinkText(linkText)).Displayed; }); } catch (TimeoutException) { failedBrowsers.Add(driver.GetType().Name + " Link text: " + linkText); } } Assert.IsTrue(failedBrowsers.Count == 0, "Failed browsers: " + string.Join(", ", failedBrowsers)); } 

El IEDriver es muy lento, pero tendrá 3 de los navegadores principales ejecutando pruebas “uno al lado del otro”

Bien, una solución es tener pruebas de envoltura que configuren el objeto ISelenium con diferentes navegadores. Luego pasan ese objeto a todas las otras pruebas que lo usan en lugar de configurar uno nuevo como lo hicieron anteriormente.

La desventaja es que termino con una gran prueba para cada navegador. No es la mejor solución tampoco. Sigue buscando…

EDITAR:

Pasé más tiempo en esto. La solución que se me ocurrió es tener un archivo de texto en la solución que especifique el navegador que se utilizará para las pruebas. NUnit recupera la configuración al crear una instancia de un objeto Selenium.

Estoy usando CruiseControl.NET para ejecutar comstackciones y pruebas automáticas. Y en lugar de simplemente ejecutar la prueba una vez, la configuré para ejecutarla dos veces. Pero antes de cada prueba ejecuto un comando de línea de comando que cambia el navegador en el archivo de texto de configuración.

  cmd /C echo firefox C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe > F:\...\selenium_browser.txt   F:\...\NUnit 2.5.7\bin\net-2.0\nunit-console.exe F:\...\bin\Debug F:\...\...nunit /xml:"F:\CCXmlLog\Project\nunit-results.xml" /noshadow 0 1200   cmd /C echo googlechrome C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe > F:\...\selenium_browser.txt   F:\...\NUnit 2.5.7\bin\net-2.0\nunit-console.exe F:\...\bin\Debug F:\...\...nunit /xml:"F:\CCXmlLog\Project\nunit-results.xml" /noshadow 0 1200  

Esto me ayudó a resolver un problema similar. ¿Cómo ejecuto un conjunto de pruebas nUnit con dos configuraciones diferentes?

Simplemente configure diferentes navegadores en el método de configuración:]

Me preguntaba sobre el mismo problema y finalmente obtuve una solución

Entonces, cuando instalas el complemento, puedes controlar en qué navegador se debe probar el escenario.

Ejemplo de función:

 @Browser:IE @Browser:Chrome Scenario Outline: Add Two Numbers Given I navigated to / And I have entered  into summandOne calculator And I have entered  into summandTwo calculator When I press add Then the result should be  on the screen Scenarios: | SummandOne | SummandTwo | Result | | 50 | 70 | 120 | | 1 | 10 | 11 | 

Implementación

 [Given(@"I have entered '(.*)' into the commentbox")] public void GivenIHaveEnteredIntoTheCommentbox(string p0) { Browser.Current.FindElement(By.Id("comments")).SendKeys(p0); } 

Más información

Debe haber una manera mejor, pero podría usar plantillas T4 para generar clases de prueba duplicadas para cada navegador, esencialmente automatizando una copia y pegar de las pruebas para cada navegador.