Haciendo Scripting sobre WatiN usando AjSharp

AjSharp es un lenguaje interpretado que escribí en C#. Es un lenguaje dinámico, con clases y objetos dinámicos, valores funcionales, canales y gorutinas, entidades similares a agentes, acceso a objetos .NET nativos. Fue creado como un derivativode mi trabajo previo en AjBasic, el lenguaje interpretado y dinámico que use como base de AjGenesis, mi proyecto de generación de código. Mi plan es unificar ambos lenguajes usando el núcleo AjLanguage, y agregarlos al AjGenesis, permitiendo también el uso de to otros lenguajes, como plugins. Pero eso todavía está en plan.

El código de esto post está en el trunk del AjCodeKatas Google Project:

http://code.google.com/p/ajcodekatas/source/browse/

en trunk/AjLanguage/Src/AjSharp.Examples

Uno de los objetivos de diseño de AjSharp es servir como un shell liviano para invocar librerías .NET. Como prueba de concepto, escribí una simple clase para acceder a WatiN, la librería de automatización de pruebas web. Esta es la clase que estoy usando (y aplicando en un proyecto de desarrollo actual):

class Wat
{
  var Browser;
  
  function Wat()
  {
    WatiN.Core.Settings.WaitForCompleteTimeOut = 480;
    this.Browser = new WatiN.Core.IE();
  }
  
  sub Browse(url)
  {
    this.Browser.GoToNoWait(url);
    this.Browser.WaitForComplete(480);
  }
  
  function Button(name)
  {
    button = this.Browser.Button(name);
    
    if (button.Exists)
      return button;
      
    button = this.Browser.Button(WatiN.Core.Find.ByName(name));
    
    if (button.Exists)
      return button;
      
    button = this.Browser.Button(WatiN.Core.Find.ByValue(name));
    if (button.Exists)
      return button;
      
    return null;
  }
  
  function TextField(name)
  {
    textfield = this.Browser.TextField(name);
    
    if (textfield.Exists)
      return textfield;
      
    textfield = this.Browser.TextField(WatiN.Core.Find.ByName(name));
    
    if (textfield.Exists)
      return textfield;
      
    return null;
  }
  
  function Link(name)
  {
    link = this.Browser.Link(name);
    
    if (link.Exists)
      return link;
      
    link = this.Browser.Link(WatiN.Core.Find.ByUrl(name));
    
    return link;
    
    if (link.Exists)
      return link;
      
    return null;
  }
  
  function Contains(text)
  {
    return this.Browser.ContainsText(text);
  }
  
  sub Close()
  {
    this.Browser.Close();
  }
}


Se puede extenderla con otras características. Igual deja expuesto el WatiN browser, por si necesitamos algo que no esté expuesto en el código de arriba. Un ejemplo de uso:



Include("Tests.ajs");
System.Reflection.Assembly.Load("WatiN.Core");
Include("Wat.ajs");
wat = new Wat();
wat.Browse("http://google.com");
wat.TextField("q").TypeText("Angel Java Lopez");
wat.Button("Google Search").Click();
Assert(wat.Contains("ajlopez.com"), "No content");
wat.Browse("http://www.ajlopez.net/");
Assert(wat.Contains("Java"), "No content");
Assert(wat.Link("http://ajlopez.zoomblog.com/").Exists, "No link 4");
wat.Link("http://ajlopez.zoomblog.com/").Click();
Assert(wat.Contains("Ciencia"), "No content 2");
wat.Close();
exit;


El único problema que encontré al invocar a WatiN, es su requerimiento de ejecutarse dentro de un STAThread (Single Thread Apartment model). Así que cambié el método de main de AjSharp.Console, agregádole el atributo STAThread (¿habrá forma de elegir ese modelo por código, al lanzar un thread?). Estoy usando este tipo de scripts para probar una aplicación web real en desarrollo en un equipo ágil. Una cosa que podría agregar es soporte de excepciones y logueo de los mensajes de Assert (esto no es de Wat, sino de Test.ajs).



Pueden usar utilitarios más robustos sobre WatiN, como el Wax, que permite escribir tests usando planillas Excel. Por ahora, con lo que uso de arriba, me ha sido suficiente en el proyecto actual. Es un buen ejercicio para ir haciendo dog-fooding y probar las capacidades, fortalezas y debilidades de AjSharp en un requerimiento real.



Nos leemos!



Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 12652, 12677, 1389, 8926. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>