Tuesday, January 26, 2016

Javascript Herramienta Poderosa de Ayuda Automation

Javascript esta muy de moda en estos días, y no es para menos, las potencialidades que tiene con WEB son impresionantes y van creciendo día a día.

Tengo este formulario grande de llenar, y debo automatizarlo. Imaginense que me pidieron automatizar el siguiente formulario:

Click aca


Largo, aburrido y tedioso de automatizar, una de las cosas mas tediosas es buscar elemento por elemento para ser reconocido luego por selenium, explorar los objetos, obtener su ID, o su XPATH, tomaría buen tiempo, pero porque no aplicar un simple truco Javascript, y obtener todos los XPATHs + ID's de los objetos y así los tenemos todos para automatizarlos directamente?

Copy Paste del script de abajo en el console de un browser, y ya esta hecho, el resultado como se muestra en la figura, son mas de 30 campos, que explorando objeto por objeto nos llevaría demasiado tiempo, con un simple script se pueden hacer cosas realmente interesantes. Nos ahorramos el trabajo de minimo 4 horas a 2 mins.  Saludos.:


//Script:

var elements = document.getElementsByTagName('input');
for(var index = 0;index<elements.length;index++)
{
    var element = elements.item(index);
    console.log(createXPathFromElement(element) + ' ' + element.value);
}


function createXPathFromElement(elm) {
    var allNodes = document.getElementsByTagName('*');
    for (var segs = []; elm && elm.nodeType == 1; elm = elm.parentNode)
    {
        if (elm.hasAttribute('id')) {
                var uniqueIdCount = 0;
                for (var n=0;n < allNodes.length;n++) {
                    if (allNodes[n].hasAttribute('id') && allNodes[n].id == elm.id) uniqueIdCount++;
                    if (uniqueIdCount > 1) break;
                };
                if ( uniqueIdCount == 1) {
                    segs.unshift('id("' + elm.getAttribute('id') + '")');
                    return segs.join('/');
                } else {
                    segs.unshift(elm.localName.toLowerCase() + '[@id="' + elm.getAttribute('id') + '"]');
                }
        } else if (elm.hasAttribute('class')) {
            segs.unshift(elm.localName.toLowerCase() + '[@class="' + elm.getAttribute('class') + '"]');
        } else {
            for (i = 1, sib = elm.previousSibling; sib; sib = sib.previousSibling) {
                if (sib.localName == elm.localName)  i++; };
                segs.unshift(elm.localName.toLowerCase() + '[' + i + ']');
        };
    };
    return segs.length ? '/' + segs.join('/') : null;
};

function lookupElementByXPath(path) {
    var evaluator = new XPathEvaluator();
    var result = evaluator.evaluate(path, document.documentElement, null,XPathResult.FIRST_ORDERED_NODE_TYPE, null);
    return  result.singleNodeValue;
}