martes, 24 de septiembre de 2013

Primeros pasos con Seleno

Primeros pasos con Seleno 


 Traducción del artículo Getting started with Seleno .

 Seleno es un proyecto Open Source de la empresa TestStack que puede ayudarnos a escribir test automatizados de UI con Selenium. Seleno utiliza las metodologías “Page Objects” y “Page components” y permite leer y escribir en páginas Web usando modelos para vistas fuertemente tipados. Este artículo es un resumen de lo que necesita saber para empezar a utilizar Seleno.

Configuración


 La configuración más sencilla que puede utilizar a la hora de usar Seleno ocupa una línea. Si está usando una aplicación Web ASP .NET dentro de la misma solución en la que tiene el proyecto de testing todo lo que necesita saber Seleno es el nombre del proyecto Web a testear y el número de puerto en el que se ejecuta. Sólo necesita suministrar esta información antes de ejecutar cualquier test con Seleno, de tal forma que si está usando NUnit puede configurar Seleno en el SetUpFixture.

[SetUpFixture]

public class AssemblySetupFixture
{

 [SetUp]

 public void SetUp()
    {

 SelenoHost.Run("TestStack.Seleno.Samples.Movies", 19456);

 }

}


Con la configuración anterior su aplicación se desplegará en IIS Express y se abrirá con FireFox para ejecutar los tests. Además cerrará el navegador y el servidor Web cuando el dominio de la aplicación se cierre. Tenemos previsto que los programadores tengan más control sobre el ciclo de vida de Seleno, pero por ahora esta opción está cerrada – si esto es realmente importante para usted por favor cree una petición en el sitio de GitHub.

 Por defecto Seleno usa:

 • Firefox como navegador
 • IIS Express como servidor web
 • No logger – (registro)
 • No cámara para tomar screenshots.

Si quiere cambiar esta configuración puede usar una configuración fluida. Por ejemplo, si quiere utilizar Chrome en vez de Firefox (por defecto) y registrar mensajes a la consola, puede escribir lo siguiente:

SelenoHost.Run("TestStack.Seleno.Samples.Movies", 19456,
    configure => configure
     .WithRemoteWebDriver(BrowserFactory.Chrome)
     .UsingLoggerFactory(new ConsoleFactory())
)
;

Observación: Para usar el WebDriver de Chrome necesita descargar ChromeDriver.exe y asegurarse de que este está en su directorio bin cuando ejecute los tests. Hay más cosas que puede configurar. El uso original de seleno era realizar testing de proyectos Web de Visual Studio para ASP .Net y ASP .Net MVC y por defecto hacer esta tarea con IIS Express. Intentamos que Seleno sea modular y fácilmente configurable de tal forma que si lo que quiere es testear cualquier sitio Web simplemente tendremos que cambiar el servidor IisExpressWebServer por el servidor InternetWebServer en la configuración. Por ejemplo para testear el sitio web de Google en Reino Unido:

SelenoHost.Run(configure => configure
    .WithWebServer(new InternetWebServer("www.google.co.uk")));


Page Objects 

Seleno utiliza la metodología de Page Objects para modelar sus páginas Web. La idea es modelar cada página (o parte de una página) como una clase y usar instancias de estas clases en los tests. Como ejemplo vamos a utilizar la página inicial de Google que todo el mundo conoce.


 En Seleno puede modelar esta página heredando de la clase “Page” y entonces encapsular la interacción con la página dentro de métodos. Seleno suministra métodos para encontrar elementos en la página (Find) e introducir datos en los cuadros de texto (SendKeys). El método Navigate le permite navegar a la página de resultados haciendo clic en el botón de búsqueda (btnG).

public class SearchPage : Page
{
    public SearchPage InputSearchTerm(string term)
    {
        Find()
            .Element(By.Name("q"))
            .SendKeys(term);
        return this;
    }

    public ResultsPage Search()
    {
        return Navigate().To(By.Name("btnG"));
    }
}  

 
 
  public class ResultsPage : Page
{
    ...
}  

 
 
 
 
Ahora sus tests solo tienen que interactuar con los métodos de los “Page Objects”, sin tener que saber nada sobre la interacción de la página o del uso de Selenium. 



 [SetUpFixture]
public class AssemblySetUpFixture
{ 

 [SetUp]
    public void SetUp()
    {
        SelenoHost.Run(configure => configure
            .WithWebServer(new InternetWebServer("http://www.google.co.uk")));
    }
}



 [TestFixture]

public class GoogleSearchTests
{

 [Test]
    public void should_be_able_to_search()
    {

 var searchPage = SelenoHost.NavigateToInitialPage ();  

 var resultsPage = searchPage
            .InputSearchTerm("BDDfy")
            .Search();
        resultsPage.Title.Should().Be("Google");
    }  

} 



 Page Objects fuertemente tipados 

No está mal para comenzar, pero las cosas se vuelven realmente interesantes si usa el patrón vista modelo (view models). Seleno también suministra Page objects fuertemente tipados, de tal forma que puede leer y escribir a la página. Pongamos un ejemplo a partir del ejemplo MvcMusicStore de Seleno. Como Seleno conoce el patrón vista modelo, puede tomar una instancia ya generada y cargada con datos de dicho modelo e introducir esta información en la página Web usando el método Input().Model. 



public class RegisterModel {
 public string UserName { get; set; } 
 public string Email { get; set; } public string Password { get; set; } public string ConfirmPassword { get; set; } } public class RegisterPage : Page { public HomePage CreateValidUser(RegisterModel model) { Input().Model(model); return Navigate().To (By.CssSelector("input[type='submit']")); } } 

Puede utilizar esto en un test mediante un modelo generado y cargado mediante el método CreateRegisterModel del patrón ObjectMother. 


public class StronglyTypedPageObjectWithComponent { [Test] public void Can_buy_an_Album_when_registered() { var orderedPage = SelenoHost.NavigateToInitialPage (x => x.Index()) .Menu .GoToAdminForAnonymousUser() .GoToRegisterPage() .CreateValidUser(ObjectMother.CreateRegisterModel()) .GenreMenu .SelectGenreByName("Disco") .SelectAlbumByName("Le Freak") .AddAlbumToCart() .Checkout() .SubmitShippingInfo(ObjectMother.CreateShippingInfo(), "Free"); orderedPage.Title.Should().Be("Checkout Complete"); } } 


Acciones y localizadores 


El patron Page Objects se utiliza para realizar acciones en una página o bien para encontrar ítems en una página. Seleno suministra acciones y localizadores que usted puede utilizar. 


Acciones 

Navigator 

Utilizado para realizar acciones que le llevará a otra página, como hacer clic en un botón o en un enlace o navegar a una URL. Hay una opción fuertemente tipada para navegar utilizando un controlador usando enrutamiento. Page Objects expone la clase Navigator con el método Navigate(). 

Navigate().To (By.LinkText("Register")); 


Page Reader 

Lee valores de la página usando métodos fuertemente tipados basados en el patrón vista modelo. Los Page Objects que utilizan Page pueden utilizar el método Read() de la clase Page Reader. Por ejemplo para leer todos los campos en una nueva instancia del tipo (T) del modelo actual en una página puede usar el método ModelFromPage: var model = Read().ModelFromPage(); Read() actualmente solo está disponible por el momento con objetos Page tipados genéricos, pero si necesita esta funcionalidad para objetos Page no genéricos (por ejemplo suministrando cadenas para el id) añada un issue en nuestro sitio Github de tal forma que podamos priorizarlo. 


Page Writer 

Escribe valores a la página usando métodos fuertemente tipados basados en el patrón vista modelo. Los Page Objects que usen Page exponen la clase Page Writer con el método Input(). Por ejemplo para rellenar todos los campos de un modelo del tipo (T) actual desde el formulario puede usar el método Model: Input().Model(modelInstanceToFillInFormUsing); Input() actualmente solo está disponible por el momento con objetos Page tipados genéricos, pero si necesita esta funcionalidad para objetos Page no genéricos (por ejemplo suministrando cadenas para el id) añada un issue en nuestro sitio Github de tal forma que podamos priorizarlo. 


Script Executor 

Si nada de lo descrito anteriormente cumple sus expectativas entonces puede usar JavaScript con la clase “Script Executor”. Los objetos “Page Objects” exponen la clase “Script Executor” con el método Execute() return Execute().ScriptAndReturn (string.Format("$('#{0}').attr('{1}')",Id,attributeName)); 


Locators


 Localizador de elementos (Element Finder) 
Localiza elementos IWebElement de Selenium en la página utilizando los selectores By de Selenium o los selectores JQuery de Seleno. Los “Page Objects” exponen la clase “Element Finder” con el método Find(). var selector = string.Format("$('#{0} option:selected')", Id); return Find().Element(By.jQuery(selector), WaitInSecondsUntilElementAvailable); Navigation Una Buena forma de ralentizar sus tests es empezar cada test en la página inicial y entonces navegar a la página que quiere testear. Es mucho mejor navegar directamente a la página que quiere testear. Puede conseguir esto llamando al método NavigateToInitialPage de SelenoHost y pasándole una URL relativa (a la raíz del sitio que esté testando). 

var page = SelenoHost.NavigateToInitialPage ("/Account/Register"); 

Además, si está usando ASP .NET MVC puede también utilizar expresiones de acción de controlador fuertemente tipadas para navegar a la página mediante enrutamiento. 

var page = SelenoHost.NavigateToInitialPage (x => x.Register()); 

Si usa estas expresiones MVC, simplemente recuerde registrar las rutas de la aplicación cuando inicialice Seleno. 

SelenoHost.Run("MvcMusicStore", 12345); MvcApplication.RegisterRoutes(RouteTable.Routes); 

Si desea saber más Puede conseguir la última version de Seleno con NuGet o bien chequear nuestro github repository para ver el último código fuente.

No hay comentarios:

Publicar un comentario