17 Browser item
Panoramica
Gli item browser consentono di monitorare siti web e applicazioni web complesse usando un browser.
Il supporto degli item browser è attualmente sperimentale.
Gli item browser raccolgono dati eseguendo codice JavaScript definito dall'utente e recuperando i dati tramite HTTP/HTTPS. Questo item può simulare azioni correlate al browser come fare clic, inserire testo, navigare tra le pagine web e altre interazioni dell'utente con siti web o applicazioni web.
Oltre allo script, è possibile specificare un elenco opzionale di parametri (coppie di nome e valore) e un timeout.
L'item implementa parzialmente lo standard W3C WebDriver con Selenium Server oppure un WebDriver semplice (ad esempio, ChromeDriver) come endpoint di test web.
Per far funzionare l'item, impostare il parametro WebDriverURL nel file di configurazione di Zabbix server/proxy (se si usa ChromeDriver, vedere Security Considerations).
Per prestazioni migliori, valutare l'uso di un server dedicato per l'ambiente di test web.
I controlli degli item browser vengono eseguiti ed elaborati dai browser poller di Zabbix server o proxy.
Se necessario, è possibile regolare il numero di istanze pre-fork dei browser poller nel parametro StartBrowserPollers del file di configurazione di Zabbix server/proxy.
Per il monitoraggio di siti web e applicazioni web complesse, è disponibile il template Website by Browser come template pronto all'uso.
Configurazione
Nel campo Tipo del modulo di configurazione dell'item, selezionare Browser e quindi compilare i campi richiesti.

Tutti i campi di input obbligatori sono contrassegnati da un asterisco rosso.
I campi che richiedono informazioni specifiche per gli item Browser sono:
| Campo | Descrizione |
|---|---|
| Key | Inserire una chiave univoca che verrà utilizzata per identificare l'item. |
| Parameters | Specificare le variabili da passare allo script come coppie attributo-valore. Sono supportate le macro utente. Per vedere quali macro integrate sono supportate, cercare "Browser-type item" nella tabella delle macro supportate. |
| Script | Inserire il codice JavaScript nell'editor modale che si apre facendo clic nel campo del parametro o sull'icona della matita accanto ad esso. Questo codice deve fornire la logica per restituire il valore della metrica. Il codice ha accesso a tutti i parametri, a tutti gli oggetti JavaScript aggiuntivi e agli oggetti JavaScript dell'item Browser aggiunti da Zabbix. Vedere anche: Guida JavaScript. |
| Timeout | Timeout di esecuzione di JavaScript (1-600s; se superato, verrà restituito un errore). Si noti che, a seconda dello script, potrebbe essere necessario più tempo prima che il timeout venga attivato. Per ulteriori informazioni sul parametro Timeout, vedere attributi generali dell'item. |
Esempi
Per un esempio di come configurare Zabbix per il monitoraggio dei siti web utilizzando il template Website by Browser, vedere Monitorare i siti web con gli item del browser.
Script predefinito
Lo script seguente:
- Inizializza una sessione del browser.
- Passa a un URL specificato.
- Raccoglie le voci delle prestazioni e le statistiche della sessione e le restituisce come stringa JSON.
Nel campo Script, inserire:
var browser = new Browser(Browser.chromeOptions());
try {
browser.navigate("http://example.com");
browser.collectPerfEntries();
}
finally {
return JSON.stringify(browser.getResult());
}
Inizializzare il browser con capacità personalizzate
Lo script seguente:
- Inizializza una sessione del browser per il browser disponibile in base al primo browser corrispondente nell'ordine specificato all'interno dello script.
- Definisce le capacità del browser, inclusa la strategia di caricamento della pagina e le opzioni specifiche per ciascun browser, come la modalità headless per i browser Chrome, Firefox e Microsoft Edge.
Nel campo Script, inserire:
var browser = new Browser({
"capabilities":{
"firstMatch":[
{
"browserName":"chrome",
"pageLoadStrategy":"normal",
"goog:chromeOptions":{
"args":[
"--headless=new"
]
}
},
{
"browserName":"firefox",
"pageLoadStrategy":"normal",
"moz:firefoxOptions":{
"args":[
"--headless"
]
}
},
{
"browserName":"MicrosoftEdge",
"pageLoadStrategy":"normal",
"ms:edgeOptions":{
"args":[
"--headless=new"
]
}
},
{
"browserName":"safari",
"pageLoadStrategy":"normal"
}
]
}
});
Inizializzare il browser con GUI
Per impostazione predefinita, le sessioni del browser (Safari escluso) vengono inizializzate in modalità headless, il che significa che l'interfaccia grafica utente (GUI) del browser non viene visualizzata.
Lo script seguente inizializza una sessione del browser con la GUI abilitata.
Nota che, se il WebDriver non riesce a individuare il binario del browser, puoi specificarne manualmente il percorso.
var opts = Browser.chromeOptions();
opts.capabilities.alwaysMatch['goog:chromeOptions'].args = [];
// Per inizializzare una sessione Firefox con GUI, decommenta le seguenti righe:
// var opts = Browser.firefoxOptions();
// opts.capabilities.alwaysMatch['moz:firefoxOptions'].binary = 'usr/bin/firefox';
// opts.capabilities.alwaysMatch['moz:firefoxOptions'].args = [];
// Per inizializzare una sessione Microsoft Edge con GUI, decommenta le seguenti righe:
// var opts = Browser.edgeOptions();
// opts.capabilities.alwaysMatch['ms:edgeOptions'].binary = 'usr/bin/microsoft-edge';
// opts.capabilities.alwaysMatch['ms:edgeOptions'].args = [];
var browser = new Browser(opts);
Se i tuoi test vengono eseguiti su un server remoto o in un container, puoi usare un client Virtual Network Computing (VNC) per connetterti al server VNC della macchina. In questo modo puoi visualizzare e interagire con la GUI del browser da remoto.
Acquisire screenshot
Lo script seguente:
- Inizializza una sessione del browser.
- Imposta le dimensioni del viewport del browser per determinare la dimensione dello screenshot (specificate come parametri, vedere sotto).
- Si sposta a un URL (specificato come parametro, vedere sotto).
- Raccoglie le statistiche della sessione, acquisisce uno screenshot e lo aggiunge alle statistiche raccolte.
- Gestisce gli errori acquisendo i messaggi di errore e uno screenshot.
- Restituisce i risultati raccolti come stringa JSON.
Lo script utilizza anche i parametri del modulo di configurazione dell'item:
- webURL - http://example.com
- width - 1920
- height - 1080
Nel campo Script, inserire:
var browser, result;
var browser = new Browser(Browser.chromeOptions());
try {
var params = JSON.parse(value); // Parse the JSON string containing parameters passed from Zabbix.
browser.setScreenSize(Number(params.width), Number(params.height))
browser.navigate(params.webURL);
result = browser.getResult();
result.screenshot = browser.getScreenshot();
}
catch (err) {
if (!(err instanceof BrowserError)) {
browser.setError(err.message);
}
result = browser.getResult();
result.error.screenshot = browser.getScreenshot();
}
finally {
return JSON.stringify(result);
}
Verifica dell'accesso a Zabbix
Lo script seguente:
- Inizializza una sessione del browser.
- Apre una pagina (specificata come parametro, vedi sotto).
- Inserisce il nome utente e la password (specificati come parametri, vedi sotto).
- Trova e fa clic sul pulsante di accesso.
- Trova e fa clic sul pulsante di disconnessione.
- Raccoglie i dati sulle prestazioni prima e dopo l'accesso, nonché dopo la disconnessione.
- Gestisce gli errori acquisendo i messaggi di errore e una schermata.
- Restituisce i risultati raccolti come stringa JSON.
Lo script utilizza anche i parametri del modulo di configurazione dell'item:
- webURL - http://{HOST.CONN}/index.php
- username - {$USERNAME}
- password - {$PASSWORD}
Nel campo Script, inserire:
var browser, result;
browser = new Browser(Browser.chromeOptions());
try {
var params = JSON.parse(value); // Parse the JSON string containing parameters passed from Zabbix.
browser.navigate(params.webURL);
browser.collectPerfEntries("open page");
var el = browser.findElement("xpath", "//input[@id='name']");
if (el === null) {
throw Error("cannot find name input field");
}
el.sendKeys(params.username);
el = browser.findElement("xpath", "//input[@id='password']");
if (el === null) {
throw Error("cannot find password input field");
}
el.sendKeys(params.password);
el = browser.findElement("xpath", "//button[@id='enter']");
if (el === null) {
throw Error("cannot find login button");
}
el.click();
browser.collectPerfEntries("login");
el = browser.findElement("link text", "Sign out");
if (el === null) {
throw Error("cannot find logout button");
}
el.click();
browser.collectPerfEntries("logout");
result = browser.getResult();
}
catch (err) {
if (!(err instanceof BrowserError)) {
browser.setError(err.message);
}
result = browser.getResult();
result.error.screenshot = browser.getScreenshot();
}
finally {
return JSON.stringify(result);
}
Trovare link
Il seguente script:
- Inizializza una sessione del browser.
- Definisce una funzione per rimuovere gli elementi duplicati da un array (vedere il passaggio 5).
- Si sposta a una pagina (specificata come parametri, vedere sotto).
- Trova i link nella pagina.
- Rimuove i link duplicati per garantirne l'unicità.
- Estrae solo i link che iniziano con "http".
- Formatta i link estratti in una struttura specifica.
- Gestisce gli errori acquisendo i messaggi di errore e uno screenshot.
- Restituisce i risultati raccolti come stringa JSON.
Lo script utilizza anche i parametri del modulo di configurazione dell'item:
- scheme - {$WEBSITE.SCHEME}
- domain - {$WEBSITE.DOMAIN}
- path - {$WEBSITE.PATH}
Nel campo Script, inserire:
var browser, result;
browser = new Browser(Browser.chromeOptions());
try {
var params = JSON.parse(value); // Parse the JSON string containing parameters passed from Zabbix.
function uniq(a) {
return a.sort().filter(function (item, pos, ary) {
return !pos || item != ary[pos - 1];
});
}
browser.navigate(params.scheme + '://' + params.domain + params.path);
var el = browser.findElements("link text", "");
var links = [];
for (var n = 0; n < el.length; n++) {
links.push(el[n].getAttribute('href'));
}
links = uniq(links);
result = [];
for (i = 0; i < links.length; i++) {
if (links[i].match(/^http.*/)) {
var row = {};
row["{#URL}"] = links[i];
result.push(row);
}
}
}
catch (err) {
if (!(err instanceof BrowserError)) {
browser.setError(err.message);
}
result = browser.getResult();
result.error.screenshot = browser.getScreenshot();
}
finally {
return JSON.stringify(result);
}