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