Last active
February 5, 2016 15:40
-
-
Save leipreachan/6a63405bd5741d0a0f88 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
javascript:(function(){ | |
function attribute(e, t, n) { | |
e.setAttribute(t, n) | |
} | |
function highlight(r) { | |
for (var i = 0; i < r.length; i++) { | |
e = r[i]; | |
try { | |
e.os = e.getAttribute('style'); | |
attribute(e, 'style', e.os + ';border:2px dashed red;') | |
} catch (s) { | |
} | |
console.log(e); | |
t = draw_arrow(e); | |
body.appendChild(t) | |
} | |
return r | |
} | |
function side_menu(t) { | |
function r(t, r) { | |
clr = 'position:fixed;top:' + r + 'px;left:0;padding:5px;background-color:#00293E;color:#fff;z-index:10000;'; | |
e = docu.createElement('span'); | |
attribute(e, 'name', w + '-cmt'); | |
attribute(e, 'style', clr); | |
e.innerHTML = t; | |
return e | |
} | |
sp = r(t, 0); | |
ht = r(['ESC / Q', | |
'close', | |
'R', | |
'redraw', | |
'C', | |
'clean', | |
'→ / P', | |
'prev', | |
'← / N', | |
'next', | |
'D', | |
'dump'].join('<br>'), 30); | |
body.appendChild(sp); | |
body.appendChild(ht) | |
} | |
function iterate_over_elements(e) { | |
var t = [ | |
], | |
n = docu.evaluate(e, docu, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); | |
var r = n.iterateNext(); | |
while (r) { | |
t.push(r); | |
r = n.iterateNext() | |
} | |
return t | |
} | |
function get_cookies(e) { | |
p = docu.cookie.split(e + '='); | |
if (p.length == 2) return p.pop().split(';').shift() | |
} | |
function locate(e, t) { | |
switch (e) { | |
case 0: | |
case 'css': | |
return docu.querySelectorAll(t); | |
case 'xpath': | |
return iterate_over_elements(t); | |
case 'id': | |
return docu.getElementById(t) | |
} | |
} | |
function draw_arrow(e) { | |
try { | |
var t = docu.createElement('img'), | |
r = wndw.pageXOffset + e.getBoundingClientRect().left, | |
i = wndw.pageYOffset + e.getBoundingClientRect().top + (e.getBoundingClientRect().bottom - e.getBoundingClientRect().top) / 2; | |
t.name = w; | |
t.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAAAXCAYAAACswNlYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QwMDAMRpdV9vQAAAp9JREFUWMPt2M1rXGUUx/HPc+eGBCuSauumC8G1GlxYSaHTpNEEhC660f+gvuDGv6C4cOtat25EdyIUMqFOnNgWrO+67KaSpmgtxtIY47wcFzNTb9PpUKRJZzIeuKtzeJ6HH+d8z7knRYSRtPRyifU3aY1jjewqjVUmroozN+4IH1mhIB3dz8QHOLzNs4Er7S9dYfzd0RYK0guPkX1ITPXwXie9Liqf56MnTErMPU02S8zgOWKsR+Qy8YZYuj46pZdmD1CaIc1iBgcK3ibxHZ4lZQi8x5PviPfre5tRafZhxo7TKpPKeOL2gPieVKNVY/Mi+6bwCXGN9JpY+mL7kfneKaeFZ2h2hMmfJ8ZJXWHWUSMtkS2LxV+3ceoE6SLZKVFZ63VFPsRZM0k+T7zI3DTNgx1RoNHOmKhRqvHIT+LjZu9z3s5Il2mcFtXGXa8bmtJLr45xaZqsTJRJT6FUiFgjzpLV2FwRK7/f1+sHWqg0d4jScWIBR7Cv4N3qlNMizZo4e3lHnzJQQvWHcBA//Avh1pei+teuPe2BCnUHhOMwJgoR68QSWYX8gjhz7YE9ddeFSicnudmBsGnSwULS1Mku3BOEd9l2vuvdFcLd1m2VqBIV8nNicWMgcbkjGXULwrdYM1nw3iQ+a3ennYfwYAmVXhpn6xhpvj+EsyX+/rrfvDKo9t9KryeEsyKEf2mXUlajfl5Ufxv64f+eMyqdnGSjTGuedAyPF7x1UgHC0z+K06299PuY95lpcrIjfSD8MxZpVXjoK/Hpn3t6AXFbRqUTh9jqQvgo9hdibxDLwwbh+yeUhUdpnmrvaWKqs5PpcvgSqdpeYm2cE+c3jajlNF/BWx3d/sAKaZl6VVRX/W9doUof0WgR39L6Zhhb927YP7XjHE2XKsCmAAAAAElFTkSuQmCC'; | |
attribute(t, 'style', 'position:absolute;top:' + i + 'px;left:' + (r - 75) + 'px;z-index:10000;'); | |
return t | |
} catch (s) { | |
} | |
} | |
function main() { | |
clean(1); | |
k = get_cookies('locator'); | |
k = typeof k !== undef ? '' : k; | |
var e = prompt('Locator:', k), | |
t = 0, | |
n = 0; | |
if (!e || e == 'null') return; | |
e = e.trim(); | |
dt = new Date; | |
dt.setDate(dt.getDate() + 10); | |
docu.cookie = 'path=/; locator=' + e + '; expires=' + dt.toUTCString(); | |
s = e.split('='); | |
if (s[0] && s[1]) { | |
switch (s[0]) { | |
case 'xpath': | |
case 'css': | |
case 'id': | |
{ | |
t = s[0]; | |
n = s[1]; | |
break | |
} | |
} | |
} | |
if (!t) { | |
if (e.substr(1, 1) == '/') { | |
t = 'xpath' | |
} else { | |
t = 'css' | |
} | |
n = e | |
} | |
var o = locate(t, n); | |
ell = o.length; | |
if (ell == 0) { | |
side_menu('element was not found'); | |
return | |
} | |
side_menu('<b>' + ell + ' candidate' + (ell > 1 ? 's' : '') + '</b> for ' + t + ' locator ' + e); | |
highlight([o[0]]); | |
o.scrl = h(); | |
return o | |
} | |
function clean(e) { | |
var t = locate(0, '*[name' + (e ? '*' : '') + '=' + w + ']'); | |
for (n = 0; n < t.length; n++) { | |
try { | |
t[n].remove() | |
} catch (r) { | |
} | |
} | |
if (typeof y !== undef) for (n = 0; n < y.length; n++) { | |
if (typeof y[n] !== undef) y[n].style = y[n].os | |
} | |
} | |
function h() { | |
var e = 0; | |
return function (t) { | |
if (typeof y[e + t] !== undef) { | |
e += t; | |
clean(0); | |
highlight([y[e]]); | |
y[e].scrollIntoView(1); | |
} | |
} | |
} | |
function dump() | |
{ | |
Array.prototype.slice.call(y).forEach(function(item){console.log(item)}); | |
} | |
function keyboard(e) { | |
console.log(e.keyCode); | |
switch (e.keyCode) { | |
case 27: //esc | |
case 113: //q | |
case 81: //Q | |
clean(1); | |
wndw.onkeyup = old_keyup; | |
return true; | |
case 99: //c | |
clean(1); | |
return true; | |
case 82: // R | |
case 114: //r | |
y = main(); | |
return true; | |
case 110: //n | |
case 78: //N | |
case 39: //→ | |
if (y) { | |
y.scrl(1) | |
} | |
return true; | |
case 112: //p | |
case 80: //P | |
case 37: //← | |
if (y) { | |
y.scrl( - 1) | |
} | |
return true; | |
case 68: //D | |
dump(); | |
return true; | |
} | |
} | |
var docu = document, | |
wndw = window, | |
body = docu.body, | |
y = [ | |
], | |
undef = 'undefined'; | |
var w = 'leipr-tst', | |
old_keyup = wndw.onkeyup; | |
wndw.onkeyup = keyboard; | |
y = main(); | |
})() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment