14/5/14

Selenium (JAVA)


Vamos a repasar un poco por encima algunas cosas que podemos realizar gracias a Selenium y una breve introducción para saber que es Selenium.

Selenium.

Es un conjunto de utilidades que facilita la labor de obtener juegos de pruebas para aplicaciones web. Permitiendo grabar, editar y depurar casos de prueba, que podrán ser ejecutados de forma automática e iterativa posteriormente.

Permite registrar acciones y editarlas manualmente, e incluso crearlas desde cero.

Esta basado en el uso de diferentes API's en diferentes lenguajes (PHP, Ruby, JAVA, Javascript, etc).

Entre sus principales características podemos nombrar:
  • Facilidad de registro y ejecución de los test. 
  • Referencia a objetos DOM en base al ID, nombre o a través de XPath. 
  • Auto-completado para todos los comandos. 
  • Las acciones pueden ser ejecutadas paso a paso. 
  • Herramientas de depuración y puntos de ruptura (breakpoints). 
  • Los test pueden ser almacenados en diferentes formatos. 

Introducción a XPath.

XPath es una especificación de la World Wide Web Consortium W3C, que facilita enormemente la navegación y la lectura a través de un documento XML.

Cuando comenzó la implantación de XML en los desarrollos, se inventaron infinidad de libreraias para parsear y acceder a los documentos XML, por lo que existen muchas librerias poco eficientes, cada una diferente en cuanto a filosofía y a tratamiento.

XPath tiene una filosofía muy simple, ya que se basa de utilizar expresiones al estilo de un path, como el de un directorio de disco, a través de los nodos del archivo XML. A ésto se le une una multitud de posibilidades, como búsqueda de ciertos elementos a partir de un valor o una máscara.

En la siguiente URL podemos ver algo de la sintaxis XPATH http://www.w3schools.com/XPath/xpath_syntax.asp

Selenium es compatible con la mayoría de navegadores:
  • Explorer 
  • Mozilla Firefox 
  • Google Chrome 
  • Safari 

Próximamente iremos añadiendo información sobre este tema.

Un saludo, gracias.

Ejemplo fechas (JAVA)

Estos son algunos ejemplos que he encontrado en la red, la verdad que esta bastante bien para ver las diferentes clases que se pueden usar para trabajar con fechas.

PasosObtener la fecha y hora actual.
  1. Crear un Date:
    Date d= new date();
  2. Obtener su valor:
    String s = d.toString();
Obtener un objeto que permita ejecutar calculos en la fecha y hora de un Locale.
  1. Crear un Calendar:
    Calendar c = Calendar.getInstance();
  2. Usar c.add(...) y c.roll(...) para manipular la fecha y la hora.
Obtener un objeto que permita ejecutar calculos de la fecha y la hora en diferentes Locale.
  1. Crear un Locale:
    Locale loc = new Locale(language);
    o
    Locale loc = new Locale(languahe, country);
  2. Crear un Calendar para ese Locale:
    Calendar c = Calendar.getInstance(loc);
  3. Usar c.add(...) y c.roll(...) para manipular la fecha y la hora.
Obtener un objeto que te permita ejecutar calculos de fecha y hora y que en su salida se muestre la fecha y la hora en varios Locale distintos.
  1. Crear un Calendar:
    Calendar c = Calendar.getInstance();
  2. Crear un Locale para cada localizacion:
    Local loc = new Locale(...);
  3. Convertir tu Calendar a Date:
    Date d = c.getTime();
  4. Crear un DateFormat para cada Locale:
    DateFormat df = DateFormat.getDateInstance(style,loc);
  5. Usar el metodo format() para crear fechas formateadas:
    String s = df.format(d);
Conseguir un objeto que te permita formatear numeros o monedas a traves de Locales distintos.
  1. Crear un Locale para cada localizacion:
    Locale loc = new Locale(...);
  2. Crear un NumberFormat:
    NumberFormat nf = NumberFormat.getInstance(loc);
    o
    NumberFormat nf = NumberFormat.getCurrencyInstance(loc);
  3. Usar el metodo format() para crear una salida formateada:
    String s = nf.format(someNumber);
Un saludo.

Fechas (JAVA)

Buena a todos, en esta entrado voy a intentar expliar como funcionan las fechas en java, esta entrada la he creado a raiz de necesitar en un robot (o crawler) una clase que comparase las fechas recuperadas de entradas de blog con la fecha actual.

Al ahcer esto me encontre con varios puntos interesantes de ver.

Lo primero que hice fue crear un método al que le pasaba un webElement de donde recuperaba la fecha y un String indicando como realizar la busqueda. Retorna true si la fecha del blog que tiene el webElement es anterior a la actual:

public Boolean isInRange(WebElement we,String rangeLocator){
      WebElement rangeElement=  we.findElement(By.className(rangeLocator) );
      Date now = new Date();
      Date fecha = new Date(rangeElement.getText());
      return (now.compareTo(fecha) > 0);


}

El priemer problema que me encontre es que cada blog tenia la fecha informada de una forma distinta, este método funcionaria para el blog que presentaba la fecha de forma "dd/mm/yyyy", pero al realizar algunas pruebas encontre otro blog que presentaba la fecha "dd MMM yyyy" donde MMM es ABR o MAY o JUN ..... por lo que me fallaba.

Para resolver este probleme capture la excepcion y realice el siguiente tratamiento de fechas:

public Boolean isInRange(WebElement we,String rangeLocator){
      WebElement rangeElement=  we.findElement(By.className(rangeLocator) );
      Date now = new Date();
      Date fecha;
      try {
          fecha = new Date(rangeElement.getText());
      }catch (java.lang.IllegalArgumentException e1){
          DateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
          DateFormat df2 = new SimpleDateFormat("dd-MM-yyyy");
          String fecha1 = we.findElement(By.className(rangeLocator)).getText();
          String fecha2= fecha1.replaceAll("\n","-");
          Date date = null;
          try {
              fecha = df.parse(fecha2);
          } catch (ParseException e2) {
              e2.printStackTrace();
              fecha = null;
          }
      }
      return (now.compareTo(fecha) > 0);


}

Para comprender este método vamos a explicar el código.

Primero vamos a estudiar las clases Date, SimpleDateFormat, y ya que estamos DateFormat también.

Antes de nada comento que las lineas en la que extraigo la fecha del webElement, no voy a entrar en detalle de explicar que es esto, simplemente os comento que estas lineas:

WebElement rangeElement=  we.findElement(By.className(rangeLocator) );
String fecha1 = we.findElement(By.className(rangeLocator)).getText();

Donde rangeLocator es "date-header", aqui lo único que hace es recuperarnos las fechas en su formato original del código de la web, blog,... según estemos trabajando, estamos usando Selenium (XPATH). En futuro incluiremos en el blog alguna entrada sobre este tema, que es también bastante interesante.

La clase Date, del paquete java.util, encapsula un valor Long representando un momento específico en el tiempo. El constructor más útil es Date(), crea un objeto Date teniendo por valor el día, hora, etc del momento en el cual fue creado.  El método getTime() devuelve un valor Long de un objeto Date. 

En el código creamos now de tipo DATE para poder obtener la fecha actual.

La clase DateFormat se utiliza para poder manejar las feches con facilidad, ya que en todos sitios no se representan las fechas de la misma forma (mascara o idioma), utilizaremos DateFormat para hacerlo como mejor nos convenga. Si utilizamos una instancia de DateFormat sin parámetros, el valor por defecto que se utiliza es el que tiene la máquina donde se ejecuta el programa.

La clase SimpleDateFormat, nos permite construir nuestros propios formatos de fechas, ya que la clase DateFormat tiene limitadas sus instancias. Para construir las fechas con SimlpeDateFormat,  tendremos como referencia un String donde se especificará un patrón para formatear  y/o parsear las fechas.

En el código podemos ver como instanciamos dos veces a esta clase, para poder interpretar la fecha obtenida y para poder asiganar el formato nuevo de fecha donde se almacenará la obtenida.
DateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
DateFormat df2 = new SimpleDateFormat("dd-MM-yyyy");

Proximamente iremos ampliando esta entrada con más información de estas clases.

Os he dejado otra entrada con ejemplos utilizando Calendar, Date, DateFormat.

Un saludo.

6/5/14

Popup selección de fecha. (Android)

Vamos a ver rapiadmente como crear en un activiy un popup para seleccionar una fecha. El popup queda así en el emulador de mi móvil:




Lo que tenemos que usar es la siguiente clase, se puede poner como interna dentro de un Activity o usarla desde fuera, como cada uno prefierá.

public static class DatePickerFragment extends DialogFragment
                           
implements DatePickerDialog.OnDateSetListener {

   
@Override
   
public Dialog onCreateDialog(Bundle savedInstanceState) {
       
// Use the current date as the default date in the picker
       
final Calendar c = Calendar.getInstance();
       
int year = c.get(Calendar.YEAR);
       
int month = c.get(Calendar.MONTH);
       
int day = c.get(Calendar.DAY_OF_MONTH);

       
// Create a new instance of DatePickerDialog and return it
       
return new DatePickerDialog(getActivity(), this, year, month, day);
   
}

   
public void onDateSet(DatePicker view, int year, int month, int day) {
       
// Do something with the date chosen by the user
   
}
}

Tengo que decir que esta clase me la paso un compañero de trabajo que también estaba aprendiendo Android, pero esta muy pero que muy bien para crear de forma rápida y sencilla un popup que permita seleccionar una fecha.

El evento onDateSet es el que recuperará la fecha seleccionada por el usuario. Hay que tener en cuenta que enero es el mes 0.

Para llamar al popup de seleccionar la fecha sólo tienes que hacer esto


DialogFragment newFragment = new DatePickerFragment();

newFragment.show(getFragmentManager(), "datePicker");
En estos momentos ya solo tendriamos que crear un botón o lo que queramos, para cuando se pulse, muestre el popup.

Yo en la APP que estaba haciendo, he creado dos botones con dos editText, para seleccionar la fecha desde y fecha hasta, y lo he implementado de la siguiente forma.

En el metodo onManejadorEventoFecha capturo el botón que se pulsa y llamo a la clase que hemos creado.

public void onManejadorEventoFecha(View v) {                                    
  DialogFragment newFragment = new DatePickerFragment();
  Bundle args = new Bundle();
  int vista = v.getBottom(); //.getId();
  args.putLong("vista",vista);
  newFragment.setArguments(args);
  newFragment.show(getFragmentManager(), "datePicker");

 }


Y en el método de OnDataSet de la clase que hemos creado, recuperamos las fechas seleccionadas en el evento y en función del id del botón pulsado las cargamos en un elemento de texto u otro.

public void onDateSet(DatePicker view, int year, int month, int day) {
  long vista = getArguments().getLong("vista");
  
  // Do something with the date chosen by the user
  DateFormat df =  DateFormat.getDateInstance();
  Date fecha = new Date(year,month,day);
  if (vista == 158){
      et_fechIni.setText(String.valueOf(df.format(fecha)));
  }else if (vista == 309){
      et_fechast.setText(String.valueOf(df.format(fecha)));
  }

}

Un saludo, gracias.


Crear un fichero y escribir en el. (JAVA)

Con esta entrada vamos a ver rapidamente como crear un fichero y como podemos escribir en el, para usarlo de Log, o para lo que necesitemos:

Primer paso deberemos crear un fichero, en este caso creamos un txt:.

        String url_log = "C:\misLogs\milog.txt";
        File fich_log = new File(url_log);


Ahora vamos a crear un método para que cada vez que queramos escribir en el fichero sea más rápido, simplemente lo llamemos.

 public static void EcribirFichero(File fichero,String texto){
        try {
            //Si no Existe el fichero lo crea
            if(!fichero.exists()){
                fichero.createNewFile();
            }
            /*Flujo de escritura sobre el fichero con codificacion utf-8.*/
            BufferedWriter mibuffer =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fichero,true), "utf-8"));
            /*Escribe la cadena en el fichero y añadimos un salto de linea*/
            mibuffer.write(texto) + "\r\n");
            //Cierra flujo
            mibuffer.close();
        } catch (Exception e1) {
            //Capturamos errores
            System.out.println(e1.getMessage());
        }
    }

En este momento ya podriamos llamar a este método para escribir en el fichero.

        String miTexto= "Inicio del fichero";
        EcribirFichero(fich_log,miTexto);

Un saludo, espero que esta entrada es sea de utilidad.

Tratamiento de carpetas o directorios en java (JAVA)

Con esta entrada vamos a aprender a manejarnos con carpetas en java, veremos como crear, borrar y copiar contenido de una carpeta.

Lo primero que vamos a ver es como se crea un directorio, vamos a utilizar la clase FILE:

/* Ruta del directorio a crear*/
String directActual = "c:\mi_directorio_nuevo"; 
/* Pasamos a tipo file*/
File folderActual = new File(directActual);
/* creamos el directorio*/
folder.mkdir();

Una vez que tenemos creado el directorio vamos a ver como podríamos copiar el contenido de otro directorio en este creado:
/* copiamos el directorio origen en el directorio actual*/
copyDirectory(new File(directorioOrigen), new File(directActual));

Para copiar un directorio basta con esta sentencia:
copyDirectory(new File(directorioOrigen), new File(directActual));

Para borrar un directorio bastaría con la sentencia siguiente:
 directOld.delete();

Donde directold es de tipo file.

Si el directorio que queremos borrar, contiene carpetas (o subdirectorios), hay que tener en cuenta que antes hay que borrar estos:

Para ello creamos el metodo siguiente

  private boolean deleteChildren(File dir) {
        File[] children = dir.listFiles();
        boolean childrenDeleted = true;
        for (int i = 0; children != null && i < children.length; i++) {
            File child = children[i];
            if (child.isDirectory()) {
                childrenDeleted = this.deleteChildren(child) && childrenDeleted;
            }
            if (child.exists()) {
                childrenDeleted = child.delete() && childrenDeleted;
            }
        }
        return childrenDeleted;
    }

Ahora si podriamos borrar primero las subcarpetas llamando a este método y a continuacion borrar el directorio.

 File directOld = new File(directorioOrigen);
 deleteChildren(directOld);
 directOld.delete();

Un saludo, espero os sea útil esta entrada.

3/5/14

Utilizar móvil como emulador. (Android)

Buenas a todos, como estoy aqui liado aprendiendo Anadroid, antes de nada queria comentar que el emulador virtuar de eclipse es muy pero que muy lento para realizar las pruebas de nuestra APP, por lo que os recomiendo que utiliceis el móvil para ello.

Antes de nada tendremos que tener activa el móvil en modo de desarrollador, y para ello, tendremos que al ménu de ajustes / ... / acerca del dispositivo, pulsaremos siete veces sobre el número de compilación que aparece en este menú. Cuando hagamos esto aparecera un mensaje de android informandonos de que se ha activado el modo desarrollador, y en ajustes a partir de ahora tendremos disponible esta opción.

Una vez tenemos hecho esto en el móvil, y los drivers del móvil instalados en el ordenador, podemos abir eclipse, ahora cuando conectemos el móvil por USB, en eclipse se nos habilitará una nueva perspectiva "DDMS".

Si accedemos sobre esta perspectiva y el móvil ha sido reconocido correctamente, veremos algo así:

En este caso tengo conectado mi samsumg Galaxy SIII.

Cuando vayamos a ejecutar una apliación, nos debe aparecer una pantalla donde nos de la opción de hacerlo con el emulador virtual o con el móvil:


Por defeco tengo seleccionado el móvil porque es mucho más rápido.

Si la versión de andorid del móvil es posterior a JellyBean, debereís desactivar la opción MTB.

También se podría conectar el mçovil para usar como emulador a través de wifi, proximamente cuando lo probemos subiremos como se hace al blog.

Un saludo, gracias por vuestra atención.