17 item do navegador

Visão geral

Os itens de navegador permitem monitorar sites e aplicações web complexos usando um navegador.

O suporte a itens de navegador está atualmente em caráter experimental.

Os itens de navegador coletam dados executando um código JavaScript definido pelo usuário e recuperando dados via HTTP/HTTPS. Este item pode simular ações relacionadas ao navegador, como clicar, inserir texto, navegar por páginas da web e outras interações do usuário com sites ou aplicações web.

Além do script, é possível especificar uma lista opcional de parâmetros (pares de nome e valor) e timeout.

O item implementa parcialmente o padrão W3C WebDriver com o Selenium Server ou um WebDriver simples (por exemplo, ChromeDriver) como endpoint de teste web. Para que o item funcione, defina o parâmetro WebDriverURL no arquivo de configuração do Zabbix server/proxy (se estiver usando ChromeDriver, consulte Considerações de segurança). Para melhor desempenho, considere usar um server dedicado para o ambiente de teste web.

As verificações de itens de navegador são executadas e processadas pelos browser pollers do Zabbix server ou proxy. Se necessário, você pode ajustar o número de instâncias pré-forked de browser pollers no parâmetro StartBrowserPollers do arquivo de configuração do Zabbix server/proxy.

Para monitorar sites e aplicações web complexos, o template Website by Browser está disponível como um template pronto para uso.

Configuração

No campo Tipo do formulário de configuração do item, selecione Navegador e preencha os campos obrigatórios.

Todos os campos obrigatórios estão marcados com um asterisco vermelho.

Os campos que exigem informações específicas para itens do tipo Navegador são:

Campo Descrição
Chave Insira uma chave exclusiva que será usada para identificar o item.
Parâmetros Especifique as variáveis a serem passadas para o script como pares de atributo e valor.
Macros de usuário são suportadas. Para ver quais macros internas são suportadas, faça uma busca por "item do tipo Navegador" na tabela de macros suportadas.
Script Insira o código JavaScript no editor modal que é aberto ao clicar no campo de parâmetro ou no ícone de lápis ao lado dele. Este código deve fornecer a lógica para retornar o valor da métrica.
O código tem acesso a todos os parâmetros, a todos os objetos JavaScript adicionais e objetos JavaScript do item Navegador adicionados pelo Zabbix.
Veja também: Guia JavaScript.
Timeout Tempo limite de execução do JavaScript (1-600s; se excedido, retornará um erro).
Observe que, dependendo do script, pode levar mais tempo para o timeout ser acionado.
Para mais informações sobre o parâmetro Timeout, consulte atributos gerais do item.

Exemplos

Para um exemplo de como configurar o Zabbix para monitorar sites usando o template Website by Browser, consulte Monitor websites with browser items.

Script padrão

O seguinte script:

  1. Inicializa uma sessão do navegador.
  2. Navega até uma URL especificada.
  3. Coleta entradas de desempenho e estatísticas da sessão, e as retorna como uma string JSON.

No campo Script, insira:

var browser = new Browser(Browser.chromeOptions());

try {
    browser.navigate("http://example.com");
    browser.collectPerfEntries();
}
finally {
    return JSON.stringify(browser.getResult());
}
Inicializar o navegador com capacidades personalizadas

O seguinte script:

  1. Inicializa uma sessão do navegador para o navegador disponível com base no primeiro navegador correspondente na ordem especificada no script.
  2. Define as capacidades do navegador, incluindo a estratégia de carregamento da página e opções específicas para cada navegador, como o modo headless para os navegadores Chrome, Firefox e Microsoft Edge.

No campo Script, insira:

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"
            }
        ]
    }
});
Inicializar o browser com GUI

Por padrão, as sessões do browser (exceto Safari) são inicializadas no modo headless, o que significa que a interface gráfica do usuário (GUI) do browser não é exibida.

O script a seguir inicializa uma sessão do browser com a GUI habilitada.

Observe que, se o WebDriver não conseguir localizar o binário do browser, você pode especificar o caminho manualmente.

var opts = Browser.chromeOptions();
opts.capabilities.alwaysMatch['goog:chromeOptions'].args = [];

// Para inicializar uma sessão do Firefox com GUI, descomente as linhas a seguir:
// var opts = Browser.firefoxOptions();
// opts.capabilities.alwaysMatch['moz:firefoxOptions'].binary = 'usr/bin/firefox';
// opts.capabilities.alwaysMatch['moz:firefoxOptions'].args = [];

// Para inicializar uma sessão do Microsoft Edge com GUI, descomente as linhas a seguir:
// 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 seus testes estiverem sendo executados em um server remoto ou em um contêiner, você pode usar um cliente de Virtual Network Computing (VNC) para se conectar ao server VNC da máquina. Isso permite visualizar e interagir com a GUI do browser remotamente.

Fazer capturas de tela

O seguinte script:

  1. Inicializa uma sessão do navegador.
  2. Define o tamanho da viewport do navegador para determinar o tamanho da captura de tela (especificado como parâmetros, veja abaixo).
  3. Acessa uma URL (especificada como um parâmetro, veja abaixo).
  4. Coleta estatísticas da sessão, captura uma screenshot e a adiciona às estatísticas coletadas.
  5. Trata erros capturando mensagens de erro e uma screenshot.
  6. Retorna os resultados coletados como uma string JSON.

O script também usa parâmetros do formulário de configuração do item:

No campo Script, insira:

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);
}
Verificar login no Zabbix

O seguinte script:

  1. Inicializa uma sessão do navegador.
  2. Navega até uma página (especificada como parâmetro, veja abaixo).
  3. Insere o nome de usuário e a senha (especificados como parâmetros, veja abaixo).
  4. Localiza e clica no botão de login.
  5. Localiza e clica no botão de logout.
  6. Coleta dados de desempenho antes e depois do login, bem como após o logout.
  7. Lida com erros capturando mensagens de erro e uma captura de tela.
  8. Retorna os resultados coletados como uma string JSON.

O script também utiliza parâmetros do formulário de configuração do item:

No campo Script, insira:

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);
}

O seguinte script:

  1. Inicializa uma sessão do navegador.
  2. Define uma função para remover elementos duplicados de um array (veja a etapa 5).
  3. Navega até uma página (especificada como parâmetros, veja abaixo).
  4. Encontra links na página.
  5. Remove links duplicados para garantir que sejam únicos.
  6. Extrai apenas os links que começam com "http".
  7. Formata os links extraídos em uma estrutura específica.
  8. Trata erros capturando mensagens de erro e uma captura de tela.
  9. Retorna os resultados coletados como uma string JSON.

O script também usa parâmetros do formulário de configuração do item:

  • scheme - {$WEBSITE.SCHEME}
  • domain - {$WEBSITE.DOMAIN}
  • path - {$WEBSITE.PATH}

No campo Script, insira:

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);
}