Upyou.it The Blog Tech News Blog

3set/09Off

Ancora sull’automatizzazione di Firefox: MozRepl e Javascript

Ho scritto qualche post ( precisamente qui ) riguardo a come utilizzare l'estensione iMacros per automatizzare facilmente alcune operazioni nel browser Firefox. Oggi voglio spingermi un po' più in là.

mozrepl

Ho conosciuto da qualche giorno l'estensione MozRepl, sempre per il fidato Firefox ovviamente. Si tratta di un'estensione che permette di avere una sorta di shell Javascript per comandare il browser. La shell non è direttamente incorporata in una finestra del browser ma è bensì raggiungibile tramite protocollo TELNET all'indirizzo localhost e porta 4242. Per poterla utilizzare è però necessario avviare il "servizio" MozRepl e per farlo navighiamo nel menù Strumenti fino alla voce MozRepl->Start.

A questo punto potremo collegarci alla shell ma dobbiamo munirci di un client TELNET. Vi sconsiglio vivamente il client ufficiale Microsoft contenuto di default nei sistemi operativi Windows. Munitevi piuttosto di Putty e create una nuova sessione di collegamento utilizzando il protocollo Raw come potete vedere nell'immagine seguente.

La configurazione di Putty per MozRepl

La configurazione di Putty per MozRepl

C'è un altro dettaglio a cui fare attenzione prima di connettersi. E' necessario infatti, sempre in Putty, passare nella scheda delle opzioni "Terminal" ( visibile sul lato sinistro dell'interfaccia ) e spuntare la voce "Implicit CR in every LF"; così facendo l'output sarà correttamente visualizzato. A questo punto potete cliccare sul pulsante "Open". Ecco cosa dovreste vedere.

La shell MozRepl in Putty

La shell MozRepl in Putty

Come in una classica shell troviamo il prompt, indicato in questo caso con "repl>". Sfortunatamente la shell di per se non supporta una storia dei comandi, una cosa che può essere molto fastidiosa, specialmente quando si è abituati alla potenza di bash ;-) Per Linux esiste un programmino, tale rlwrap, che agisce come un wrapper per un'applicazione sul modello di una shell fornendo il supporto a funzionalità come la storia dei comandi e anche il completamento automatico con il tasto TAB. Ad esempio per comunicare con la shell di MozRepl potreste dare il comando

rlwrap -c -r nc localhost 4242

dove il parametro -c serve ad indicare a rlwrap di abilitare il completamento automatico per i nomi dei file e per i comandi mentre il parametro -r attiva la storia dei comandi ( che viene salvata anche per sessioni future ). Il comando nc è invece il mitico netcat.

Anche per chi non ha Linux ma non ha paura di sporcarsi un po' le mani è possibile ottenere lo stesso effetto utilizzando la piattaforma Cygwin ed installando i pacchetti rlwrap e netcat presenti nei repository ufficiali.

Andiamo ora a scoprire le potenzialità di questa shell. Innanzitutto appena entrati nel prompt ci troviamo nel contesto Javascript relativo alla window ( la finestra del browser ) corrente, con i privilegi massimi di esecuzione, quelli assegnati alle estensioni per capirci. Dobbiamo dunque stare attenti a quello che scriviamo perchè rischiamo di compromettere il browser.

Sostanzialmente MozRepl è stato pensato per aiutare nello sviluppo e nel debug di applicazioni web per cui un uso tipico che se ne può fare è ad esempio cambiare il colore di un elemento HTML o il valore di altre proprietà:

repl> content.document.getElementById("mioTesto").style.color = "red";

Per evitare di dover specificare ogni volta l'oggetto content potete entrare nel suo contesto con il comando repl.enter(content) mentre per ritornare al contesto window più privilegiato dovete dare il comando repl.home(). Esiste anche il comando repl.back() che ritorna al contesto esattamente precedente a quello attuale ( nel nostro caso sarebbe bastato questo comando dato che il contesto window era esattamente un passo indietro ).

MozRepl mette poi a disposizione anche altri utilissimi comandi come repl.print() che serve a stampare un determinato valore o repl.load(), utile per caricare funzioni personalizzate da file esterni. Ecco un esempio dell'utilizzo di quest'ultimo comando:

repl> repl.load('file:///c:/prova/miofile.js');

Il comando caricherà nel contesto corrente il contenuto del file al percorso "C:\prova\miofile.js" e potrete così accedere alle funzioni in esso descritte. Se il file verrà modificato le modifiche non verranno automaticamente recepite ma il file dovrà essere caricato nuovamente.

Altro utilissimo comando è repl.inspect() che una volta applicato ad un oggetto consente di visualizzarne le proprietà e i rispettivi valori oltre che al tipo delle stesse. Ecco un esempio di esecuzione del comando con relativo output ( tagliato ):

var c = new XMLHttpRequest();
repl> repl.inspect(c);
<object>.dispatchEvent=[function]
<object>.removeEventListener=[function]
<object>.open=[function]
<object>.send=[function]
<object>.responseXML=null
<object>.mozBackgroundRequest=false
...

Sul sito ufficiale di MozRepl potete infine trovare ulteriori risorse e documentazione.

Questa era un'infarinatura sul funzionamento base di questa estensione. Il mio obiettivo iniziale era come ho detto l'automatizzazione del browser, come sfruttare dunque MozRepl a questo scopo? Possiamo prepararci dei file Javascript esterni che includano le istruzioni per comandare una certa azione al browser, utilizzando allo scopo anche tutti i vari componenti XPCOM che Firefox mette a disposizione, proprio come se stessimo sviluppando un'estensione ma con un overhead ridotto al minimo. Al prossimo post per un esempio concreto ;-)

Be Sociable, Share!
Commenti (1) Trackback (1)
  1. Ciao,
    sto provando l’estensione, ma piacerebbe capire una cosa…
    una volta che gli fai caricare una pagina con:

    content.location.href

    come fai sapere che il caricamento e’ stato completato?

    Questo mi serve per mettere in attesa altre seguenti instruzioni
    che potrebbero altrimenti lavorare su html incompleto.

    grazie. ;-)