Panoramica

Il linguaggio di scripting di JuliuS è un JavaScript esteso con direttive speciali. Ogni script è un file di testo (.js) composto da due tipi di istruzioni che coesistono:

  • Direttive JuliuS — righe che iniziano con //#*#, interpretate dal motore Delphi per controllare browser, timing, OS e flusso.
  • Blocchi JavaScript — codice JS puro racchiuso tra //#*#SNIPPET=BEGIN e //#*#SNIPPET=END, eseguito nel browser Chromium.
Nota: Le direttive //#*# sembrano commenti JS ma vengono intercettate dall'engine prima di qualsiasi valutazione JavaScript, garantendo piena compatibilità con editor JS standard.

Struttura di uno script

1

Intestazione / Commento

Titolo, descrizione, nome della compagnia/target.

2

GLOBALV — Dichiarazione variabili

Blocco GLOBALV=BEGIN / END con tutte le variabili di input.

3

Configurazione iniziale

SCREEN_SIZE, WAIT, TARGET_FRAME=MAIN.

4

Navigazione verso l'URL target

URL_GOTO seguito da WAIT per il caricamento.

5

Interazione con la pagina

Sequenza di SNIPPET, MOUSE_CLICK, WRITETO, IF/ELSE/ENDIF, WAIT.

6

Estrazione del risultato

Definizione della funzione JS di estrazione, EVALJS, CAPTURE_SCREENSHOT.

Ciclo di esecuzione

L'engine legge lo script riga per riga in un thread separato. Per ogni riga:

  • Se inizia con //#*# → viene interpretata come direttiva JuliuS.
  • Se è compresa tra SNIPPET=BEGIN e SNIPPET=END → viene accumulata e inviata al browser come JavaScript.
  • Se inizia con /* → l'engine salta tutte le righe fino al corrispondente */.
  • Altrimenti → la riga viene ignorata dall'engine.
⚠ Attenzione: Il codice JavaScript al di fuori dei blocchi SNIPPET non viene eseguito nel browser. Tutto il JS da eseguire va obbligatoriamente dentro un blocco SNIPPET.

GLOBALV — Variabili globali

dati
//#*#GLOBALV=BEGIN … //#*#GLOBALV=ENDDichiara le variabili dello script
Definisce il blocco delle variabili globali dello script. Tutto ciò che è compreso tra GLOBALV=BEGIN e GLOBALV=END viene caricato nella lista interna GlobalV di JuliuS e può essere iniettato nel browser con GLOBALV=INJECT. Ogni riga deve essere una dichiarazione JavaScript valida var nome="valore";. I valori vengono estratti dall'engine per l'interpolazione con la sintassi {{{NOME}}}.
//#*#GLOBALV=BEGIN var marca="HONDA"; var modello="XL 650 V TRANSALP"; var data_nasc="10/01/1986"; var cu="1"; //#*#GLOBALV=END

GLOBALV=INJECT

javascript
//#*#GLOBALV=INJECTInietta le variabili nel contesto JS del browser
Esegue il testo del blocco GlobalV nel contesto JavaScript del browser. Dopo l'inject, tutte le variabili del blocco GLOBALV sono disponibili come variabili JS nella pagina corrente e possono essere usate nei successivi blocchi SNIPPET. Poiché ogni navigazione azzera il contesto JS, è necessario re-iniettare dopo ogni cambio pagina.
//#*#GLOBALV=INJECT //#*#WAIT=1 //#*#SNIPPET=BEGIN document.getElementById('inputMarca').value = marca; //#*#SNIPPET=END
💡 Best practice: Ri-iniettare GLOBALV=INJECT dopo ogni navigazione verso una nuova pagina.

Interpolazione {{{VAR}}}

dati

Le variabili definite in GLOBALV possono essere interpolate nei parametri delle direttive JuliuS usando {{{NOME_VARIABILE}}}. L'engine sostituisce il placeholder con il valore prima di eseguire il comando. I nomi sono case-insensitive.

//#*#WRITETO="TEXT={{{MARCA}}}{{TAB}}"&"CHAR_INT_MS=200" // Se il placeholder racchiude una espressione JS, viene valutata a runtime: //#*#WRITETO="ELEMENTID={{{document.querySelector('.active').id}}}"&"TEXT=ciao"

URL_GOTO

navigazione
//#*#URL_GOTO=<url>Naviga il browser verso un URL
Forza il browser Chromium embedded a navigare verso l'URL specificato. L'operazione è asincrona: usare sempre WAIT subito dopo per attendere il caricamento completo della pagina prima di interagire con il DOM.
//#*#URL_GOTO=https://www.esempio.it/pagina-target //#*#WAIT=5

WAIT

controllo flusso
//#*#WAIT=<secondi>Pausa l'esecuzione per N secondi interi
Mette in pausa l'esecuzione dello script per il numero di secondi interi specificato. Usare attese brevi (1–3 s) per operazioni UI locali, attese più lunghe (5–15 s) dopo navigazioni o submit di form con round-trip server.
//#*#WAIT=3 //#*#WAIT=10

BACK

navigazione
//#*#BACKTorna alla pagina precedente
Equivale al pulsante "Indietro" del browser. Naviga alla pagina precedente nella history del browser. Seguire sempre con un WAIT e un GLOBALV=INJECT per ripristinare il contesto JS.
//#*#BACK //#*#WAIT=3 //#*#GLOBALV=INJECT

SCREEN_SIZE

navigazione
//#*#SCREEN_SIZE=<width>,<height>Imposta le dimensioni del pannello browser
Ridimensiona il pannello del browser embedded. Tutte le coordinate dei successivi MOUSE_CLICK e OS_BROWSER_CLICK devono essere calibrate sulla risoluzione impostata con questo comando.
//#*#SCREEN_SIZE=1024,768

MOUSE_CLICK

interazione CEF
//#*#MOUSE_CLICK=<X>,<Y>Click sintetico CEF a coordinate relative al browser
Simula un click del mouse nel browser CEF alle coordinate pixel specificate, relative al pannello. Agisce tramite l'API interna CEF. Per click su elementi che non rispondono agli eventi CEF (es. elementi con pointer-events:none, scrollbar native, dialog Windows) usare OS_BROWSER_CLICK.
//#*#MOUSE_CLICK=374,494 //#*#WAIT=1

WRITETO

interazione CEF
//#*#WRITETO="..."&"..."Simula digitazione da tastiera nel browser CEF
Simula la digitazione di testo in un campo HTML del browser CEF. I parametri sono separati da & e racchiusi tra virgolette doppie. Supporta interpolazione {{{VAR}}} e tasti speciali {{TASTO}}.

Parametri

ParametroTipoDescrizione
ELEMENTIDstringID HTML dell'elemento su cui mettere il focus. Usare none per saltare il focus.
FRAMENAMEstringNome del frame/iframe target. Se omesso usa il frame con focus corrente.
TEXTstringTesto da digitare. Supporta {{{VAR}}} e {{KEY}}.
CHAR_INT_MSintegerIntervallo ms tra un carattere e l'altro (default: 200).
CHAR_INT_RANDOMS / NSe S, introduce variazioni casuali per simulare digitazione umana.
//#*#WRITETO="ELEMENTID=ctl00_txtNome"&"TEXT={{{NOME}}}{{TAB}}"&"CHAR_INT_MS=150" //#*#WRITETO="TEXT={{SELECT_ALL}}{{CANC}}{{{MODELLO}}}"&"CHAR_INT_MS=200"&"CHAR_INT_RANDOM=N"

Tasti speciali

interazione CEF

All'interno del parametro TEXT del comando WRITETO:

{{ENTER}}Invio (↵)
{{TAB}}Tabulazione
{{CANC}}Canc (Delete)
{{BACK_SPACE}}Backspace (←)
{{ESC}}Escape
{{ESCAPE}}Escape (alias)
{{END}}Fine riga
{{ARROW_DOWN}}Freccia giù
{{ARROW_UP}}Freccia su
{{ARROW_LEFT}}Freccia sinistra
{{ARROW_RIGTH}}Freccia destra
{{SELECT_ALL}}Seleziona tutto

SNIPPET

javascript
//#*#SNIPPET=BEGIN[&NOFRAME] … //#*#SNIPPET=ENDEsegue un blocco JavaScript nel browser
Tutto il codice tra SNIPPET=BEGIN e SNIPPET=END viene eseguito nel contesto JavaScript del browser Chromium. È il meccanismo principale per interagire con il DOM. L'opzione NOFRAME forza l'esecuzione nel frame principale (window) invece del frame con focus corrente.
//#*#SNIPPET=BEGIN $('#ddlMarca').val(marca).keydown(); //#*#SNIPPET=END //#*#SNIPPET=BEGIN&NOFRAME window.scrollTo(0, 0); //#*#SNIPPET=END
⚠ Attenzione: I blocchi SNIPPET non possono essere annidati. Ogni SNIPPET=BEGIN deve avere il suo SNIPPET=END.

EVALJS

javascript
//#*#EVALJS=<espressione JS>Valuta un'espressione JS e ne memorizza il risultato
Esegue una singola espressione JavaScript nel browser (timeout 10 s) e memorizza il valore restituito come risultato dell'operazione corrente, recuperabile poi via API con ?operation=getresult. Pensato per chiamare funzioni di estrazione già definite in un SNIPPET precedente.
//#*#EVALJS=preventivo(); //#*#EVALJS=document.getElementById("risultato").innerText

TARGET_FRAME

navigazione
//#*#TARGET_FRAME=MAIN | POPUPSeleziona il frame/finestra target
Imposta il contesto di esecuzione per i successivi comandi. MAIN seleziona il frame principale; POPUP seleziona una finestra popup figlia identificata dall'URL nella riga successiva.
ValoreDescrizione
MAINFrame principale della finestra browser corrente.
POPUPPopup figlio. Deve essere seguito da //#*#TARGET_URL=<url>.
//#*#TARGET_FRAME=MAIN //#*#TARGET_FRAME=POPUP //#*#TARGET_URL=https://www.esempio.it/popup-login
⚠ Attenzione: Se il popup con l'URL specificato non è aperto, l'engine lancia un'eccezione e interrompe lo script.

IF / ELSE / ENDIF

controllo flusso
//#*#IF= … //#*#ELSE … //#*#ENDIFEsecuzione condizionale basata su espressione JS
Permette di eseguire blocchi di direttive in modo condizionale. L'espressione dopo IF= viene valutata nel browser tramite EvalJS: se il risultato è truthy il blocco IF viene eseguito e il blocco ELSE saltato; se è falsy il blocco IF viene saltato e il blocco ELSE (opzionale) eseguito. Il blocco ELSE è opzionale. Gli IF possono essere annidati: l'engine gestisce correttamente la profondità di annidamento.

Valori considerati falsy

Stringa vuota "", "false", "0", "null", "undefined". Qualsiasi altro valore è considerato truthy.

// Esempio base: IF senza ELSE //#*#IF=document.querySelector('#btnAccetta') !== null //#*#SNIPPET=BEGIN document.querySelector('#btnAccetta').click(); //#*#SNIPPET=END //#*#WAIT=2 //#*#ENDIF // Esempio con ELSE //#*#IF=document.querySelector('.errore-pagina') !== null //#*#PAUSE // c'è un errore: sospende per intervento manuale //#*#ELSE //#*#SNIPPET=BEGIN $('#btnAvanti').click(); //#*#SNIPPET=END //#*#WAIT=8 //#*#ENDIF // Esempio con variabili GlobalV //#*#IF=guida === "Libera" //#*#SNIPPET=BEGIN $('#rdoGuidaLibera').click(); //#*#SNIPPET=END //#*#ENDIF // Esempio con IF annidati //#*#IF=cu < 5 //#*#IF=guida === "Libera" //#*#MOUSE_CLICK=200,300 //#*#ELSE //#*#MOUSE_CLICK=250,300 //#*#ENDIF //#*#ENDIF
Note tecniche: L'espressione viene valutata via EvalJS nel thread principale. Le variabili iniettate con GLOBALV=INJECT sono disponibili nell'espressione. Il risultato della valutazione viene scritto nel log di JuliuS per facilitare il debug (IF [expr] = valore → true/false).

PAUSE

controllo flusso
//#*#PAUSESospende l'esecuzione fino a ripresa manuale
Sospende l'esecuzione dello script fino a quando l'utente non riprende manualmente (tramite UI o API ?operation=start). Utile per interventi manuali (es. risoluzione captcha, login manuale) in punti critici del flusso. Spesso usato in combinazione con IF per sospendere solo in caso di condizioni anomale.
//#*#IF=document.querySelector('.captcha-box') !== null //#*#PAUSE // sospende: l'operatore risolve il captcha //#*#ENDIF

Commenti

controllo flusso

JuliuS supporta entrambe le sintassi di commento JavaScript. I blocchi /* ... */ sono utili per disabilitare temporaneamente intere sezioni, incluse direttive JuliuS.

// Commento su riga singola — ignorato dall'engine /* Blocco multi-riga — tutto ciò che è compreso tra /* e */ viene saltato dall'engine JuliuS, incluse eventuali direttive //#*# al suo interno. */

CAPTURE_SCREENSHOT

output CEF
//#*#CAPTURE_SCREENSHOTScreenshot del pannello browser CEF
Cattura lo stato visuale corrente del browser CEF e salva il file JPG nella cartella Settings.Data.screenShotPath. Il nome file è costruito automaticamente come ExcelLogLineNameBase_N.jpg. Il percorso viene aggiunto alla screenShotList del risultato operazione, recuperabile via API.
//#*#CAPTURE_SCREENSHOT //#*#SNIPPET=BEGIN $('#btnAvanti').click(); //#*#SNIPPET=END

OS_SCREENSHOT

output OS
//#*#OS_SCREENSHOT[=nomeFile]Screenshot dell'intero desktop Windows
Cattura l'intero desktop Windows (non solo il browser CEF) e salva il file JPG. Utile per catturare dialog nativi, popup di sistema e qualsiasi finestra fuori dal browser. Il percorso generato viene aggiunto alla screenShotList del risultato operazione.
VarianteDescrizione
//#*#OS_SCREENSHOTNome file automatico: ExcelLogLineNameBase_OS_N.jpg
//#*#OS_SCREENSHOT=nomeFileNome file personalizzato: nomeFile.jpg
//#*#OS_SCREENSHOT //#*#OS_SCREENSHOT=popup_conferma
Differenza con CAPTURE_SCREENSHOT: CAPTURE_SCREENSHOT cattura solo il pannello CEF. OS_SCREENSHOT cattura l'intero desktop Windows incluse finestre native, taskbar e popup di sistema.

Funzione di risultato

javascript

Per restituire un risultato recuperabile via API, definire una funzione JS in un blocco SNIPPET e richiamarla con EVALJS. Per convenzione si chiama preventivo(), ma è possibile usare qualsiasi nome.

//#*#SNIPPET=BEGIN function preventivo() { var el = document.querySelector('#tabs-Proposta0-label font'); return el ? el.innerHTML : 'non trovato'; } //#*#SNIPPET=END //#*#WAIT=2 //#*#EVALJS=preventivo(); // Recupera via API: GET /?operation=getresult // GET /?getresult=preventivo

OS_MOUSE_MOVE

OS — mouse
//#*#OS_MOUSE_MOVE=<X>,<Y>Sposta il cursore a coordinate assolute di schermo
Sposta il cursore del mouse alle coordinate assolute di schermo usando le API del sistema operativo. Agisce sull'intero desktop, non solo sul browser CEF. Utile per interagire con dialog nativi Windows, popup di sistema o altre applicazioni.
//#*#OS_MOUSE_MOVE=640,480 //#*#WAIT=1

OS_MOUSE_CLICK

OS — mouse
//#*#OS_MOUSE_CLICKClick sinistro nella posizione corrente del cursore SO
Simula un click sinistro del mouse nella posizione corrente del cursore di sistema. Usare dopo OS_MOUSE_MOVE. Agisce a livello SO e può interagire con qualsiasi finestra visibile sul desktop.
//#*#OS_MOUSE_MOVE=500,350 //#*#OS_MOUSE_CLICK

OS_MOUSE_RCLICK

OS — mouse
//#*#OS_MOUSE_RCLICKClick destro nella posizione corrente del cursore SO
Simula un click destro del mouse nella posizione corrente del cursore di sistema, per aprire menu contestuali nativi del SO o di applicazioni Windows.
//#*#OS_MOUSE_MOVE=500,350 //#*#OS_MOUSE_RCLICK //#*#WAIT=1

OS_MOUSE_MOVE_CLICK

OS — mouse
//#*#OS_MOUSE_MOVE_CLICK=<X>,<Y>Move + click sinistro SO in un'unica istruzione
Combina OS_MOUSE_MOVE e OS_MOUSE_CLICK in una sola direttiva usando coordinate assolute di schermo. Le coordinate dipendono dalla posizione della finestra JuliuS sul desktop: se la finestra viene spostata, le coordinate devono essere ricalcolate. Per click indipendenti dalla posizione della finestra, preferire OS_BROWSER_CLICK.
//#*#OS_MOUSE_MOVE_CLICK=640,400 //#*#WAIT=1

OS_MOUSE_DOUBLE_CLICK

OS — mouse
//#*#OS_MOUSE_DOUBLE_CLICK=<X>,<Y>Doppio click a coordinate assolute di schermo
Sposta il cursore a X,Y ed esegue due click sinistri rapidi (con 80ms di pausa tra i due) per simulare un doppio click nativo del sistema operativo. Usa coordinate assolute di schermo.
//#*#OS_MOUSE_DOUBLE_CLICK=300,200 //#*#WAIT=1

OS_BROWSER_CLICK

OS — mouse
//#*#OS_BROWSER_CLICK=<X>,<Y>Click SO a coordinate relative al pannello browser
Esegue un click sinistro a livello sistema operativo usando coordinate relative al pannello browser CEF — la stessa origine di MOUSE_CLICK e degli snapshot. Internamente, JuliuS converte le coordinate browser in coordinate assolute di schermo tramite ClickOnBrowserRelative, quindi il click funziona correttamente indipendentemente da dove è posizionata la finestra JuliuS sul desktop e dal fattore di scala DPI. È la scelta più robusta quando si vuole un click OS su un elemento del browser.

Quando usarlo rispetto alle alternative

DirettivaTipo clickCoordinateQuando usarla
MOUSE_CLICKCEF internoRelative browserCaso generale: elementi DOM standard
OS_MOUSE_MOVE_CLICKSOAssolute schermoClick su finestre esterne al browser
OS_BROWSER_CLICKSORelative browserElementi che non rispondono al CEF, scrollbar, dropdown nativi, pointer-events:none
//#*#OS_BROWSER_CLICK=374,494 //#*#WAIT=1

OS_BROWSER_INFO

OS — debug
//#*#OS_BROWSER_INFOScrive nel log le coordinate della finestra e del browser
Scrive nel log di JuliuS le informazioni sulla posizione e le dimensioni della finestra principale e del pannello browser CEF, incluse le coordinate assolute di schermo e il fattore di scala DPI. Non produce output nello script né interagisce con il browser. È uno strumento di sviluppo e debug: utile per calibrare le coordinate assolute da usare nei comandi OS_MOUSE_MOVE e OS_MOUSE_MOVE_CLICK.
//#*#OS_BROWSER_INFO // Esempio output nel log: // [OS_BROWSER_INFO] {"mainForm":{"left":100,"top":50,"width":1200,"height":800}, // "browser":{"left":0,"top":60,"width":1024,"height":768, // "screenLeft":100,"screenTop":110},"scaleFactor":1.25}

OS_KEY_PRESS

OS — tastiera
//#*#OS_KEY_PRESS=<keycode>Preme un tasto tramite keycode numerico VK
Invia la pressione di un tasto alla finestra attiva del sistema operativo tramite il suo keycode Virtual Key. A differenza di WRITETO che scrive nel browser CEF, questo comando agisce a livello SO e funziona su qualsiasi finestra attiva: dialog nativi Windows, form non web, applicazioni desktop.
KeycodeTastoKeycodeTasto
13ENTER27ESC
9TAB32SPAZIO
8BACKSPACE46DELETE
37← LEFT38↑ UP
39→ RIGHT40↓ DOWN
112–123F1–F1265–90A–Z
//#*#OS_KEY_PRESS=13 // ENTER //#*#OS_KEY_PRESS=27 // ESC

OS_KEY

OS — tastiera
//#*#OS_KEY=<nome_tasto>Preme un tasto per nome (alternativa leggibile a OS_KEY_PRESS)
Alternativa più leggibile a OS_KEY_PRESS: accetta il nome del tasto invece del keycode numerico. Agisce a livello sistema operativo sulla finestra attiva. I nomi non riconosciuti vengono loggati e ignorati senza interrompere lo script.
ValoreTastoValoreTasto
enterENTEResc / escapeESC
tabTABbackspaceBACKSPACE
spaceSPAZIOarrow_up
arrow_downarrow_left
arrow_right
//#*#OS_KEY=enter //#*#OS_KEY=arrow_down //#*#OS_KEY=tab

OS_KEY_COMBO

OS — tastiera
//#*#OS_KEY_COMBO=<modifier>+<key>Combinazione di tasti SO (Ctrl/Shift/Alt + tasto)
Simula una combinazione di tasti a livello SO tramite keybd_event. La sintassi è modificatore+tasto in minuscolo. Disponibile solo su Windows: su altre piattaforme il comando viene loggato come non implementato e ignorato senza interrompere lo script.
CampoValori accettati
modifierctrl, shift, alt
keyLettera singola (az), oppure: f4f12, tab, enter, esc, del, home, end, pageup, pagedown
//#*#OS_KEY_COMBO=ctrl+c // Copia //#*#OS_KEY_COMBO=ctrl+v // Incolla //#*#OS_KEY_COMBO=ctrl+a // Seleziona tutto //#*#OS_KEY_COMBO=alt+f4 // Chiudi finestra //#*#OS_KEY_COMBO=shift+tab // Tab inverso

Best practice

Gestione banner cookie

//#*#SNIPPET=BEGIN&NOFRAME (function() { var btn = document.getElementById('onetrust-accept-btn-handler'); if (btn) { btn.click(); return; } var fallback = Array.from(document.querySelectorAll('button')) .find(function(b) { return b.textContent.trim().toLowerCase().includes('accetta'); }); if (fallback) { fallback.click(); return; } })(); //#*#SNIPPET=END //#*#WAIT=3

Re-inject variabili dopo navigazione

//#*#SNIPPET=BEGIN $('#btnAvanti').click(); //#*#SNIPPET=END //#*#WAIT=8 //#*#GLOBALV=INJECT // ← obbligatorio dopo ogni navigazione

Compilazione dropdown con jQuery

//#*#SNIPPET=BEGIN $('#lblctl00_ddlCampo').val(variabile).keydown(); //#*#SNIPPET=END //#*#WAIT=2 //#*#SNIPPET=BEGIN $('#ulctl00_ddlCampo li a').each(function() { if ($(this).text() == variabile) { $(this).mouseenter().click(); } }); //#*#SNIPPET=END

Esecuzione condizionale con IF

Usare IF per gestire variazioni di pagina o errori senza interrompere il flusso principale:

// Clicca il pulsante solo se è presente e visibile //#*#GLOBALV=INJECT //#*#IF=(function(){ var b=document.querySelector('#btnCalcola'); return b && b.offsetParent!==null; })() //#*#SNIPPET=BEGIN document.querySelector('#btnCalcola').click(); //#*#SNIPPET=END //#*#WAIT=5 //#*#ELSE //#*#OS_BROWSER_CLICK=915,684 // fallback: click OS sulle coordinate //#*#WAIT=3 //#*#ENDIF

Click OS con coordinate relative al browser

Preferire OS_BROWSER_CLICK a OS_MOUSE_MOVE_CLICK per non dover ricalcolare le coordinate assolute se la finestra viene spostata:

// ✗ Fragile: dipende dalla posizione assoluta della finestra //#*#OS_MOUSE_MOVE_CLICK=1015,734 // ✓ Robusto: coordinate relative al browser, indipendenti dalla posizione finestra //#*#OS_BROWSER_CLICK=374,494

Script completo — template con IF

// TEMPLATE: form + condizione + estrazione risultato //#*#GLOBALV=BEGIN var nome="Mario"; var data_nasc="01/01/1985"; var guida="Libera"; //#*#GLOBALV=END //#*#SCREEN_SIZE=1024,768 //#*#TARGET_FRAME=MAIN //#*#URL_GOTO=https://www.esempio.it/form //#*#WAIT=5 //#*#GLOBALV=INJECT // Accetta cookie (solo se presente) //#*#IF=document.getElementById('onetrust-accept-btn-handler') !== null //#*#SNIPPET=BEGIN&NOFRAME document.getElementById('onetrust-accept-btn-handler').click(); //#*#SNIPPET=END //#*#WAIT=2 //#*#ENDIF // Compila nome //#*#WRITETO="ELEMENTID=inputNome"&"TEXT={{{NOME}}}{{TAB}}"&"CHAR_INT_MS=150" //#*#WAIT=1 // Tipo guida condizionale //#*#IF=guida === "Libera" //#*#OS_BROWSER_CLICK=200,400 //#*#ELSE //#*#OS_BROWSER_CLICK=260,400 //#*#ENDIF //#*#WAIT=1 //#*#CAPTURE_SCREENSHOT // Submit //#*#SNIPPET=BEGIN document.getElementById('btnSubmit').click(); //#*#SNIPPET=END //#*#WAIT=10 //#*#GLOBALV=INJECT // Gestione errore post-submit //#*#IF=document.querySelector('.msg-errore') !== null //#*#OS_SCREENSHOT=errore_submit //#*#PAUSE //#*#ENDIF // Estrazione risultato //#*#SNIPPET=BEGIN function preventivo() { return document.querySelector('.risultato-finale')?.innerText || ''; } //#*#SNIPPET=END //#*#WAIT=2 //#*#EVALJS=preventivo(); //#*#CAPTURE_SCREENSHOT