Comparando fechas en TruClient

Lo malo de que te pregunten si algo se puede monitorizar con BPM es que generalmente la respuesta es “sí”, y luego te toca buscarte un poco la vida para ver cómo.

Normalmente los monitores web suelen ser bastante sencillos de implementar, y si podemos usar TruClient además es bastante intuitivo. Aun así hay veces que toca ponerse a investigar el código fuente de la web al no tener documentación de qué es lo que hay que validar (para quien pide la monitorización, un “que esto esté en verde” puede parecerle suficiente información), o meter javascript cuando se necesita hacer verificaciones un poco más “elaboradas”.

En este caso se trata de verificar que una fecha mostrada en un campo concreto de una web no tenga una diferencia mayor de 30 minutos respecto a la hora actual.

En principio no tiene mucha dificultad: capturas el texto de la fecha y la hora de la web y lo comparas con la actual. Una pequeña complicación aparece cuando ves que el que esto funcione depende de que tengas en cuenta los posibles formatos de hora según la localización.

Una vez realizada la grabación completa de la web con TruClient podemos volver a navegar hasta el paso en el que aparece la fecha a comprobar, y añadiremos un paso “Evaluate JS on Object” dentro de las acciones de navegación. Seleccionamos como target el elemento donde se encuentra la fecha, y con el siguiente código en el campo “Arguments” del paso realizamos la verificación:


var datestring = object.innerHTML;

var datetimeparts = datestring.split(” “);
var dateparts = datetimeparts[0].split(“/”);
var usdatestring = dateparts[1]+’/’+dateparts[0]+’/’+dateparts[2]+’ ‘+datetimeparts[1];

var webEpochTime = new Date(usdatestring).getTime();
var d = new Date();
var currentEpochTime = d.getTime();

var timeDiff = Math.floor(((currentEpochTime – webEpochTime) / 1000) / 60);

if ( timeDiff > 30 ) {
TC.MasDe30Minutos();
}

Aquí estamos haciendo lo siguiente:

Capturamos el texto de la fecha en una variable a través de object.innerHTML y troceamos esta variable haciendo splits en base a los separadores ” ” y “/”.

En este caso uso estos separadores porque la fecha en la web tiene este aspecto:

07/11/2017 13:10:00

Lo que necesito es separar los datos de día, mes, año y hora, para poder reordenar día y mes con formato en-US y poder convertirlo luego a epoch. Si no hago esto, al estar la hora en formato es-ES con el día primero y luego el mes, me interpreta incorrectamente la fecha.

Esta fecha reorganizada es la que guardo en la variable usdatestring, que en el caso del ejemplo anterior quedaría así:

11/07/2017 13:10:0

Esta fecha ya la puedo convertir a epoch pasándosela a un new Date().getTime(), y hacer lo mismo pero sin pasar nada por parámetro al Date() para generar el epoch de la fecha actual.

Con esto ya sólo queda hacer una resta y verificar si el resultado es efectivamente mayor que esos 30 minutos que me pedían como condición para el script.

Dentro de esta validación resulta que de momento no he encontrado una forma limpia de provocar un fallo en el script de BPM desde un código Javascript, con lo que lo que hago es meterle una función que va a generar un error de Javascript (ya que ese TC.MasDe30Minutos() no está definido) y provocar el fallo del script dentro de la transacción que hace esta comprobación.