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=BEGINe//#*#SNIPPET=END, eseguito nel browser Chromium.
//#*# sembrano commenti JS ma vengono intercettate dall'engine prima di qualsiasi valutazione JavaScript, garantendo piena compatibilità con editor JS standard.Struttura di uno script
Intestazione / Commento
Titolo, descrizione, nome della compagnia/target.
GLOBALV — Dichiarazione variabili
Blocco GLOBALV=BEGIN / END con tutte le variabili di input.
Configurazione iniziale
SCREEN_SIZE, WAIT, TARGET_FRAME=MAIN.
Navigazione verso l'URL target
URL_GOTO seguito da WAIT per il caricamento.
Interazione con la pagina
Sequenza di SNIPPET, MOUSE_CLICK, WRITETO, IF/ELSE/ENDIF, WAIT.
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=BEGINeSNIPPET=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.
SNIPPET non viene eseguito nel browser. Tutto il JS da eseguire va obbligatoriamente dentro un blocco SNIPPET.GLOBALV — Variabili globali
datiGLOBALV=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=INJECT
javascriptGlobalV 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 dopo ogni navigazione verso una nuova pagina.Interpolazione {{{VAR}}}
datiLe 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.
URL_GOTO
navigazioneWAIT subito dopo per attendere il caricamento completo della pagina prima di interagire con il DOM.WAIT
controllo flussoBACK
navigazioneWAIT e un GLOBALV=INJECT per ripristinare il contesto JS.SCREEN_SIZE
navigazioneMOUSE_CLICK e OS_BROWSER_CLICK devono essere calibrate sulla risoluzione impostata con questo comando.MOUSE_CLICK
interazione CEFpointer-events:none, scrollbar native, dialog Windows) usare OS_BROWSER_CLICK.WRITETO
interazione CEF& e racchiusi tra virgolette doppie. Supporta interpolazione {{{VAR}}} e tasti speciali {{TASTO}}.Parametri
| Parametro | Tipo | Descrizione |
|---|---|---|
| ELEMENTID | string | ID HTML dell'elemento su cui mettere il focus. Usare none per saltare il focus. |
| FRAMENAME | string | Nome del frame/iframe target. Se omesso usa il frame con focus corrente. |
| TEXT | string | Testo da digitare. Supporta {{{VAR}}} e {{KEY}}. |
| CHAR_INT_MS | integer | Intervallo ms tra un carattere e l'altro (default: 200). |
| CHAR_INT_RANDOM | S / N | Se S, introduce variazioni casuali per simulare digitazione umana. |
Tasti speciali
interazione CEFAll'interno del parametro TEXT del comando WRITETO:
SNIPPET
javascriptSNIPPET=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 deve avere il suo SNIPPET=END.EVALJS
javascript?operation=getresult. Pensato per chiamare funzioni di estrazione già definite in un SNIPPET precedente.TARGET_FRAME
navigazioneMAIN seleziona il frame principale; POPUP seleziona una finestra popup figlia identificata dall'URL nella riga successiva.| Valore | Descrizione |
|---|---|
| MAIN | Frame principale della finestra browser corrente. |
| POPUP | Popup figlio. Deve essere seguito da //#*#TARGET_URL=<url>. |
IF / ELSE / ENDIF
controllo flussoIF= 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.
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?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.RNDWAIT
controllo flusso[N div 2 .. N]. Il valore minimo viene calcolato automaticamente come N div 2. Utile per simulare comportamento umano e ridurre il rischio di rilevamento anti-bot rispetto a WAIT con tempi fissi.Parametri
| Parametro | Tipo | Descrizione |
|---|---|---|
| N | integer | Secondi massimi. Il minimo effettivo è N div 2. |
RNDWAIT sulle pause lunghe (submit form, caricamento pagina) e mantieni WAIT=1 solo per sincronizzazioni brevi dove la variabilità non serve.RESTART_CHROMIUM
sessioneNaviga su about:blank
Rilascia tutte le risorse attive della pagina corrente.
Network.clearBrowserCache
Svuota la cache HTTP in memoria.
Network.clearBrowserCookies
Elimina tutti i cookie della sessione.
Storage.clearDataForOrigin
Pulisce localStorage, sessionStorage e IndexedDB.
Riapplica preferenze Chromium
User-agent, zoom e altre preferenze impostate.
Torna su about:blank
Sessione pulita pronta per URL_GOTO. Dopo il reset attende automaticamente 3 secondi di reinizializzazione.
DELETE_CHROMIUM_CACHE
sessioneRESTART_CHROMIUM), poi cancella fisicamente la directory cache su disco (GlobalCEFApp.RootCache).Differenza con RESTART_CHROMIUM
RESTART_CHROMIUM | DELETE_CHROMIUM_CACHE | |
|---|---|---|
| Tipo reset | In-memory (DevTools) | In-memory + filesystem |
| Velocità | ~3s | ~5s (I/O disco) |
| Cancella file su disco | — | ✓ |
| Caso d'uso | Reset tra esecuzioni | Cache corrotta, reset pre-sessione |
Risoluzione immagini & captcha — Panoramica
captchaJuliuS dispone di un sistema integrato di risoluzione automatica dei captcha basato su riconoscimento immagini. Il browser non esegue OCR localmente: cattura uno screenshot del pannello CEF e lo invia, tramite WebSocket sicuro (WSS), a un resolver remoto che elabora l'immagine e restituisce la risposta (testo letto, coordinate del click, token di sblocco, ecc.). La risposta viene poi consegnata allo script o direttamente al JavaScript della pagina.
Esistono due canali di risoluzione complementari, attivabili indipendentemente:
Captcha Interceptor (URL-driven)
Attivo quando il toggle Captcha Interceptor è abilitato (AI_ResolverEnabled = true). JuliuS osserva l'URL del frame focalizzato del browser: se rileva la stringa captcha (escludendo le varianti invisibili size=invisible&badge=bottomright) sospende lo script, centra il div captcha alla coordinata configurata con CAPTCHA_Y e invia lo screenshot al resolver. Quando il resolver risponde con "go" lo script riprende automaticamente, oppure il resolver può inviare click remoti (tntRemoteClick) o scroll (tntJuliusScrollY) che JuliuS applica al browser.
Solver Bridge (DOM-driven)
Attivo anche quando l'interceptor è spento. Il JavaScript della pagina può chiamare myextension.solverRequest(reqId, kind, payload, meta) per inviare al resolver una richiesta arbitraria (es. "leggi questa immagine", "risolvi questa sfida") e ricevere la risposta su window.__juliusSolver.responses[reqId] o tramite callback registrata. Vedi Solver Bridge.
csConnectedValidated la richiesta viene scartata e (per il solver bridge) viene consegnato un errore WSS_NOT_CONNECTED al JavaScript chiamante.CAPTCHA_Y
captchaParametri
| Parametro | Tipo | Descrizione |
|---|---|---|
| Y | integer | Coordinata Y in pixel a cui scrollare la pagina per centrare il captcha. |
Settings.Data.CaptchaInterceptor / captchaScrollCoordComma).Captcha Interceptor — Flusso URL-driven
captchaL'interceptor non è una direttiva di script ma un componente sempre-attivo (quando abilitato nelle impostazioni) che osserva il browser e interviene automaticamente. Lo script non deve chiamarlo: deve solo essere consapevole che può sospenderne l'esecuzione e riprenderla.
Ciclo di vita
Frame change
Il browser cambia il frame focalizzato (Setframe_focused_url). L'interceptor verifica se la nuova URL contiene captcha e non contiene size=invisible&badge=bottomright (varianti invisibili di reCAPTCHA, da ignorare).
Pausa script
Lo script in esecuzione viene messo in pausa per fino a 180 secondi (frmScript.pauseExecution(180)) per dare tempo al resolver di rispondere.
Centratura captcha
Viene chiamato centerCaptchaDiv che scrolla la pagina alla coordinata Y impostata con CAPTCHA_Y (o quella di default dalle impostazioni).
Invio screenshot
sendScreenToResolver(notificami=true) cattura lo screenshot JPG del pannello CEF (via getSnapShotAsJPGStream), lo codifica base64 e lo invia al resolver in un messaggio tntJuliusScreenShot con metadati (dimensioni browser, scale factor, offset Y, altezza documento).
Elaborazione resolver
Il resolver remoto analizza l'immagine (riconoscimento testo, click su tile reCAPTCHA, ecc.) e può rispondere in tre modi: con un click remoto (tntRemoteClick) ai pixel calcolati, con uno scroll (tntJuliusScrollY) per esplorare la pagina, o con un messaggio "go" quando ha completato la soluzione.
Ripresa script
Quando arriva il messaggio "go", JuliuS rimuove il flag sstPaused e chiama ExecuteScript('') per riprendere dall'istruzione successiva. Se invece il frame esce dallo stato captcha (wasCaptcha diventa true → false), viene comunque inviato uno screenshot finale con stopLive=true.
Anti-duplicazione
Per evitare di sovraccaricare il resolver con immagini identiche, JuliuS calcola lo SHA2 dello screenshot e lo confronta con l'ultimo inviato (LastSendSha). Se l'hash coincide e c'è già un resolver assegnato (lblResolverGUID non vuoto), lo screenshot viene scartato silenziosamente.
Payload TtntJuliusScreenShot
| Campo | Tipo | Descrizione |
|---|---|---|
| picture | String (base64) | JPEG dello screenshot CEF, qualità 45. |
| BrowserWidth | Integer | Larghezza pannello browser in pixel logici (post-DPI). |
| BrowserHeigth | Integer | Altezza pannello browser in pixel logici. |
| ScaleFactor | Single | Fattore di scala DPI del monitor (es. 1.25). |
| yOffset | Integer | Scroll Y corrente del frame principale. |
| documentHeight | Integer | Altezza totale del documento HTML. |
| notificami | Boolean | true → richiede al resolver di rispondere con click/messaggi; false → fire-and-forget (es. snapshot finale di fine sessione). |
SCREEN_SIZE e divise dal ScaleFactor. JuliuS le applica direttamente con clickOnBrowser senza ulteriori conversioni.Solver Bridge — API JavaScript DOM-driven
javascriptIl Solver Bridge è un canale alternativo all'interceptor, pensato per essere chiamato esplicitamente dal JavaScript della pagina tramite un'estensione iniettata. Funziona anche quando l'interceptor è spento ed è indipendente dal pattern URL del frame. Tipicamente usato dentro un blocco SNIPPET quando lo script sa con certezza che serve una risoluzione su un payload specifico (un'immagine in <img src="data:...">, una sfida JS, un token da generare).
API esposta in pagina
Parametri della richiesta
| Parametro | Tipo | Descrizione |
|---|---|---|
| reqId | string | ID univoco scelto dal chiamante (es. GUID o timestamp). Identifica la richiesta nelle risposte. |
| kind | string | Tipo di risoluzione richiesta. Convenzione libera concordata col resolver: "image-text", "recaptcha-v2", "hcaptcha", "image-classify", ecc. |
| payload | string | Dato da risolvere. Tipicamente un'immagine base64 (data:image/png;base64,...), un URL, un JSON serializzato. |
| meta | string | Metadati opzionali (JSON serializzato): hint, configurazione, contesto. Può essere stringa vuota. |
Flusso completo
JS in pagina
Chiama myextension.solverRequest(reqId, kind, payload, meta).
Renderer CEF
Invia SendProcessMessage('solver_request', [reqId, kind, payload, meta, frameID]) al processo Browser.
Browser Pascal
Chromium1ProcessMessageReceived intercetta SOLVER_REQUEST_MESSAGE_NAME → TThread.Queue(handleSolverRequest). Verifica che WSS sia in csConnectedValidated, altrimenti consegna errore WSS_NOT_CONNECTED.
Mappa pending
JuliuS salva reqId → frameID in FPendingSolverRequests (protetto da FSolverCS) per poter consegnare la risposta nel frame originario.
Invio WSS
dmWSsc.sendSolverRequest(TtntSolverRequest{RequestId, Kind, Payload, Meta}) serializza e invia al resolver.
Risposta resolver
Il resolver elabora e risponde con TtntSolverResponse{RequestId, Success, Answer, Error} sullo stesso canale WSS, conservando lo stesso RequestId.
Consegna a JS
deliverSolverAnswerToJS recupera il frameID originale, costruisce un piccolo JS che popola window.__juliusSolver.responses[reqId] e invoca la callback registrata (se presente), poi lo esegue nel frame corretto (fallback su MainFrame se il frame non è più valido).
JS in pagina
Legge la risposta tramite polling, callback o Promise wrapper, e prosegue la logica della pagina.
Esempio — wrapper Promise lato pagina
Forma della risposta
| Campo | Tipo | Descrizione |
|---|---|---|
| success | boolean | true se la risoluzione è andata a buon fine. |
| answer | string | Risposta del resolver (testo letto, token, JSON con coordinate, ecc.). Vuoto se success=false. |
| error | string | Codice/messaggio errore. Valori speciali generati da JuliuS: WSS_NOT_CONNECTED (connessione WSS non validata al momento della richiesta). |
swCaptchaInterceptor spento. Usa l'interceptor per captcha riconoscibili dall'URL (es. reCAPTCHA standard) e il Solver Bridge per casi custom in cui sai esattamente cosa risolvere.WebSocket Client (WSS) — Panoramica
comunicazioneJuliuS include un client WebSocket sicuro (WSS) che funge da canale di comunicazione bidirezionale con un server remoto. Il client è implementato in uDmWSsc.pas (modulo TdmWSsc) e usa il componente scWS per la connessione TLS. Tutta la risoluzione immagini (Captcha Interceptor + Solver Bridge) passa da questo canale.
Capacità del client
- Connessione TLS al server resolver con autenticazione applicativa (appID + appSecret derivato + credenziali utente).
- Scambio di messaggi strutturati JSON tipizzati (
TWSRawRequest/TWSRawResponse). - Modello broadcast e point-to-point: i messaggi possono essere in broadcast (a tutti i resolver in ascolto) o diretti a un partner specifico (
toGUID). - Pairing automatico col primo resolver libero che risponde via
tntSetResponder. - Stati busy/free per comunicare disponibilità (
sendI_M_busy/sendI_M_free). - Eventi tipizzati per ricezione:
onMessageRecive,onRemoteClick,onRemoteScroll,onProcessJuliusMessage,onSolverResponse.
//#*#. È un servizio sempre-attivo configurato dalla UI principale di JuliuS o dal file JuliuS.conf.json. Lo script ne beneficia automaticamente quando interagisce con captcha o usa il Solver Bridge.Configurazione & login
comunicazioneImpostazioni persistite
I parametri di connessione sono salvati in Settings.Data.CaptchaInterceptor (struttura TCaptchaInterceptor) all'interno di JuliuS.conf.json:
| Campo | Tipo | Descrizione |
|---|---|---|
| WS_Enabled | Boolean | Abilita il client WSS. Mappato sul toggle swWSS nella UI. |
| WS_ServerAddress | String | URI del server WSS (es. wss://resolver.example.com:443/julius). Mappato sul campo edWebSocketServerURL. |
| AI_ResolverEnabled | Boolean | Abilita il Captcha Interceptor URL-driven. Mappato sul toggle swCaptchaInterceptor. |
Sequenza di login
Quando si chiama dmWSsc.doConnect(url, userName, password, appId):
Apertura TLS
scWS.RequestUri := url + scWS.Connect. Se al termine lo stato non è sOpen viene sollevata l'eccezione "Connection to server failed".
Generazione appSecret
genAppSecret(appId) calcola HMAC-SHA2(appID, 'staceppadiminkia'). Il secret non viene mai trasmesso in chiaro — viene usato dal server per derivare l'accessToken.
Invio tntLoginRequest
Viene inviato un TWSRawRequest con msg_type=tntLoginRequest e content = JSON di TtntLoginRequest{appID, appSecret, userName, userPWD}.
Stato csConnected
Alla risposta scWSAfterConnect lo stato passa a csConnected (connesso ma non ancora validato).
Ricezione tntLoginResponse
Se statusCode = 200: lo stato passa a csConnectedValidated, vengono memorizzati accessToken e connGUID (assegnato dal server). Da questo momento in poi tutti i messaggi includono l'accessToken nel campo omonimo.
Auto-connect
Se in JuliuS.conf.json è impostato XtumbleConnection.autoConnect = true, il login viene eseguito automaticamente all'avvio. I parametri usati sono ServerAddress, companyId (come appId), userName, password.
Protocollo messaggi
comunicazioneInviluppo comune TWSRawRequest / TWSRawResponse
Tutti i messaggi scambiati hanno la stessa struttura. TWSRawRequest e TWSRawResponse sono alias dello stesso record (TWSRaw). Il discriminante è msg_type; il payload tipizzato è serializzato come JSON dentro content.
| Campo | Tipo | Descrizione |
|---|---|---|
| msg_type | Tmsg_type | Tipo del messaggio (vedi tabella sotto). |
| accessToken | String | Token rilasciato dal server al login. Obbligatorio dopo la validazione. |
| content | JSON string | Record tipizzato serializzato in JSON, specifico del msg_type. |
| statusCode | Integer | Codice di stato (200 = OK). Convenzioni HTTP-like. |
| broadcast | Boolean | Se true il messaggio è destinato a tutti (es. ricerca primo resolver libero). Se false va al solo toGUID. |
| fromGUID | String | GUID del mittente (assegnato dal server, valorizzato dal server). |
| toGUID | String | GUID del destinatario per messaggi point-to-point. |
| userName | String | Username del mittente (per log e routing applicativo). |
| appId | String | ID applicazione (per multi-tenancy). |
Tipi di messaggio (Tmsg_type)
| Tipo | Direzione | Descrizione |
|---|---|---|
| tntLoginRequest | → server | Login iniziale. content = TtntLoginRequest. |
| tntLoginResponse | ← server | Esito login. content = TtntLoginResponse{accessToken, connGUID, statusCode, welcomeMSG}. |
| tntMessage | ↔ | Messaggio testuale generico. content = TtntMessage{msg_body, msgFrom_userName, msgTo_userName}. Il body "go" è riservato: indica al client di riprendere lo script in pausa. |
| tntJuliusScreenShot | → resolver | Invia uno screenshot del browser per analisi. Vedi payload completo. |
| tntRemoteClick | ← resolver | Il resolver richiede a JuliuS di eseguire un click. content = TtntRemoteClick{X, Y} in pixel logici del browser. |
| tntJuliusScrollY | ← resolver | Il resolver richiede uno scroll verticale. content = TtntJuliusScrollY{Y} (delta in pixel). |
| tntSetResponder | ↔ | Pairing client–resolver. Il primo resolver libero che risponde diventa il partnerGUID dedicato. Successivi screenshot non in broadcast vanno solo a lui. |
| tntBusy / tntNotBusy | → | Notifica al server che il client è occupato o libero. Usato dal resolver per la logica di routing. |
| tntDisconnected | ↔ | Notifica disconnessione di un partner. Resetta partnerGUID. |
| tntBinaryStream | ↔ | Riservato per trasferimenti binari (non attualmente usato dal flusso captcha). |
| tntVideoCall | ↔ | Riservato (non attualmente implementato). |
| tntError | ↔ | Risposta di errore generica. |
dmWSsc.sendSolverRequest / onSolverResponse: TtntSolverRequest{RequestId, Kind, Payload, Meta} e TtntSolverResponse{RequestId, Success, Answer, Error}. La correlazione richiesta/risposta avviene tramite RequestId.API dei client (metodi TdmWSsc)
| Metodo | Scopo |
|---|---|
doConnect(url, user, pwd, appId) | Connette e autentica. |
doDisconnect | Chiude la connessione, reset partnerGUID. |
sendScreenShot(data) | Invia un TtntJuliusScreenShot al partner (o broadcast se partnerGUID = ''). |
sendClick(LClick) | Inoltra al partner una richiesta di click — usato lato resolver. |
sendYScroll(LScroll) | Inoltra al partner uno scroll Y. |
sendCustomMessage(txt) | Invia un tntMessage testuale al partner o in broadcast. |
sendI_M_busy / sendI_M_free | Aggiorna lo stato occupazionale del client. |
joinMeAsResponder(senderGUID) | Si propone come responder per un sender specifico (lato resolver). |
sendDisconnectPartner | Comunica al partner la fine della sessione e si rimette in stato free. |
Stati di connessione
comunicazioneL'enum TConnectionStatus espone tre stati. Lo stato viene aggiornato in tempo reale dalla UI tramite la property dmWSsc.ConnectionStatus e il setter associato.
| Stato | Significato | Operazioni permesse |
|---|---|---|
csDisconnected | Nessuna connessione TCP/TLS attiva. | Solo doConnect. |
csConnected | Socket TLS aperto ma login non ancora confermato. | Solo invio tntLoginRequest (gestito internamente da doConnect). |
csConnectedValidated | Login OK, accessToken e connGUID ricevuti. | Tutti i messaggi applicativi: screenshot, solver, click, scroll, busy/free. |
Comportamento atteso nello script
- Captcha Interceptor: se la connessione non è
csConnectedValidatedal momento dell'intercept,sendScreenToResolverritornafalsee registra "connessione al socketserver non attiva, non posso mandare gli screenshots" nel log. Lo script rimane in pausa fino a timeout (180s) — predisporre un bloccoIF/PAUSEmanuale come fallback. - Solver Bridge: se la connessione non è
csConnectedValidatedal momento dellasolverRequest, viene consegnata immediatamente al JS una risposta consuccess=falseeerror="WSS_NOT_CONNECTED". Lo script JS può intercettare l'errore e mostrare un fallback (PAUSE manuale o tentativo di riconnessione).
IF/PAUSE che verifichi la connessione (es. una variabile globale popolata via API ?operation=connectionstatus se esposta, o un test di richiesta solver dummy).CAPTURE_SCREENSHOT
output CEFSettings.Data.screenShotPath. Il nome file è costruito automaticamente come ExcelLogLineNameBase_N.jpg. Il percorso viene aggiunto alla screenShotList del risultato operazione, recuperabile via API.OS_SCREENSHOT
output OSscreenShotList del risultato operazione.| Variante | Descrizione |
|---|---|
//#*#OS_SCREENSHOT | Nome file automatico: ExcelLogLineNameBase_OS_N.jpg |
//#*#OS_SCREENSHOT=nomeFile | Nome file personalizzato: nomeFile.jpg |
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
javascriptPer 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.
OS_MOUSE_MOVE
OS — mouseOS_MOUSE_CLICK
OS — mouseOS_MOUSE_MOVE. Agisce a livello SO e può interagire con qualsiasi finestra visibile sul desktop.OS_MOUSE_RCLICK
OS — mouseOS_MOUSE_MOVE_CLICK
OS — mouseOS_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_DOUBLE_CLICK
OS — mouseOS_BROWSER_CLICK
OS — mouseMOUSE_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
| Direttiva | Tipo click | Coordinate | Quando usarla |
|---|---|---|---|
| MOUSE_CLICK | CEF interno | Relative browser | Caso generale: elementi DOM standard |
| OS_MOUSE_MOVE_CLICK | SO | Assolute schermo | Click su finestre esterne al browser |
| OS_BROWSER_CLICK | SO | Relative browser | Elementi che non rispondono al CEF, scrollbar, dropdown nativi, pointer-events:none |
OS_BROWSER_INFO
OS — debugOS_MOUSE_MOVE e OS_MOUSE_MOVE_CLICK.OS_KEY_PRESS
OS — tastieraWRITETO 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.| Keycode | Tasto | Keycode | Tasto |
|---|---|---|---|
| 13 | ENTER | 27 | ESC |
| 9 | TAB | 32 | SPAZIO |
| 8 | BACKSPACE | 46 | DELETE |
| 37 | ← LEFT | 38 | ↑ UP |
| 39 | → RIGHT | 40 | ↓ DOWN |
| 112–123 | F1–F12 | 65–90 | A–Z |
OS_KEY
OS — tastieraOS_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.| Valore | Tasto | Valore | Tasto |
|---|---|---|---|
| enter | ENTER | esc / escape | ESC |
| tab | TAB | backspace | BACKSPACE |
| space | SPAZIO | arrow_up | ↑ |
| arrow_down | ↓ | arrow_left | ← |
| arrow_right | → |
OS_KEY_COMBO
OS — tastierakeybd_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.| Campo | Valori accettati |
|---|---|
| modifier | ctrl, shift, alt |
| key | Lettera singola (a–z), oppure: f4–f12, tab, enter, esc, del, home, end, pageup, pagedown |
Best practice
Gestione banner cookie
Re-inject variabili dopo navigazione
Compilazione dropdown con jQuery
Esecuzione condizionale con IF
Usare IF per gestire variazioni di pagina o errori senza interrompere il flusso principale:
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:
Commenti
controllo flussoJuliuS supporta entrambe le sintassi di commento JavaScript. I blocchi
/* ... */sono utili per disabilitare temporaneamente intere sezioni, incluse direttive JuliuS.