Registro de desempenho

O ChromeDriver oferece suporte ao registro de desempenho, que permite receber eventos de domínios "Linha do tempo", "Rede" e "Página", bem como dados de trace para as categorias de trace especificadas.

Ativar registros de desempenho

O registro de desempenho NÃO é ativado por padrão. Então, ao criar uma nova sessão, você precisa ativá-la.

DesiredCapabilities cap = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), cap);

Quando ativado, o registro de desempenho coleta a linha do tempo, a rede e a página eventos. Para ativar o rastreamento ou personalizar a geração de registros de desempenho, mantenha leitura.

Veja um exemplo completo de geração de registros de desempenho com opções padrão (crédito: Michael Klepikov).

O Angular Benchpress também usa a geração de registros de desempenho.

Rastreamento e geração de registros personalizada

Se você precisar personalizar a geração de registros de desempenho, para ativar o rastreamento, por exemplo, pode usar o recurso perfLoggingPrefs (via ChromeOptions). O rastreamento pode ser ativado especificando um ou mais arquivos categorias de trace. Leia mais informações sobre Rastreamento do Chrome.

Quando o rastreamento está ativado, o domínio da linha do tempo é implicitamente desativado. Você ainda é preciso ativar o registro de desempenho com o recurso loggingPrefs.

DesiredCapabilities cap = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
Map<String, Object> perfLogPrefs = new HashMap<String, Object>();
perfLogPrefs.put("traceCategories", "browser,devtools.timeline,devtools"); // comma-separated trace categories
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("perfLoggingPrefs", perfLogPrefs);
caps.setCapability(ChromeOptions.CAPABILITY, options);
RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), cap);

Também é possível usar perfLoggingPrefs para ativar ou desativar a rede e a página domínios individualmente. Por exemplo, é possível ativar explicitamente o domínio ao rastrear:

...

Map<String, Object> perfLogPrefs = new HashMap<String, Object>();
perfLogPrefs.put("traceCategories", "browser,devtools.timeline,devtools");
perfLogPrefs.put("enableNetwork", true);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("perfLoggingPrefs", perfLogPrefs);
caps.setCapability(ChromeOptions.CAPABILITY, options);

...

Se o rastreamento estiver ativado, o ChromeDriver iniciará um rastreamento em todo o navegador quando o Chrome é iniciado e continua rastreando até que o Chrome seja fechado. Quando um trace é em execução, o Chrome armazena em buffer os eventos de rastreamento na memória até que o rastreamento seja interrompido.

Quando o buffer de rastreamento estiver cheio, os eventos de rastreamento não serão mais gravados. Para evitar um buffer completo (e, portanto, os dados de rastreamento perdidos), o ChromeDriver interrompe periodicamente rastreamento atual, coleta os eventos armazenados em buffer e reinicia o rastreamento em determinadas durante um teste.

A coleta de eventos de rastreamento pode sobrecarregar um teste. Por isso, use apenas o ChromeDriver. coleta eventos de trace em pontos apropriados durante um teste. Atualmente, rastrear são coletados somente nos eventos de navegação nas páginas e quando os eventos (como o registro de desempenho) é solicitado. Há sempre uma possibilidade se o buffer ainda é preenchido, o ChromeDriver monitora o uso do buffer versões compatíveis do Chrome (r263512 e mais recentes). Se o buffer for preenchido, o ChromeDriver registra um aviso e adiciona uma entrada ao registro de desempenho.

Como coletar entradas de registro

No teste, você pode receber entradas de registro de desempenho. Leia o Documentação de geração de registros do WebDriver para mais informações.

for (LogEntry entry : driver.manage().logs().get(LogType.PERFORMANCE)) {
  System.out.println(entry.toString());
}

Cada entrada é uma string JSON com a seguinte estrutura:

{
  "webview": <originating WebView ID>,
  "message": { "method": "...", "params": { ... }} // DevTools message.
}

O valor do método é o método do evento do DevTools. Por exemplo, os eventos da linha do tempo têm um método de Timeline.eventRecorded para todos do protocolo até a versão 1.1 (a mais recente no momento do texto).

Entradas de registro de rastreamento

O rastreamento não faz parte do protocolo DevTools publicado a partir da versão 1.1. Portanto, os detalhes são fornecidos aqui.

Todos os eventos de trace têm um valor de WebView de "navegador", já que os eventos são coletados em todo o navegador.

Há dois métodos possíveis de eventos de rastreamento:

  • tracing.dataCollected: os parâmetros são um único evento de trace na forma de um dicionário.
  • tracing.bufferUsage: os parâmetros contêm uma única chave de erro, com uma mensagem indicando que o buffer de rastreamento do DevTools foi preenchido durante o teste.

Confira um exemplo de evento de rastreamento:

{
    "webview":"browser",
    "message":{
        "method":"Tracing.dataCollected",
        "params":{
            "args":{"layerTreeId":1},
            "cat":"cc,devtools",
            "name":"DrawFrame",
            "ph":"i",
            "pid":11405,
            "s":"t",
            "tid":11405,
            "ts":3846117219.0,
            "tts":1134680
        }
    }
}