O ChromeDriver oferece suporte à geração de registros de desempenho, de onde é possível receber eventos dos domínios "Timeline", "Network" e "Page", bem como dados de rastreamento para categorias de rastreamento especificadas.
Ativar registros de desempenho
A geração de registros de desempenho NÃO está ativada por padrão. Ao criar uma nova sessão, é preciso 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 eventos de linha do tempo, rede e página. Para ativar o rastreamento ou personalizar a geração de registros de desempenho, continue lendo.
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, use o recurso perfLoggingPrefs (via ChromeOptions). O rastreamento pode ser ativado especificando uma ou mais categorias de rastreamento do Chrome. Leia mais informações sobre o rastreamento do Chrome.
Quando o rastreamento está ativado, o domínio da linha do tempo é desativado implicitamente. Você ainda
precisa 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);
Você também pode usar perfLoggingPrefs
para ativar ou desativar os domínios de rede e de página individualmente. Por exemplo, é possível ativar explicitamente o domínio de rede
durante o rastreamento:
...
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 rastro em todo o navegador quando o Chrome for iniciado e continuará o rastreamento até o Chrome ser fechado. Quando um trace está em execução, o Chrome armazena em buffer os eventos de rastreamento na memória até que ele seja interrompido.
Quando o buffer de rastreamento está cheio, os eventos de rastreamento não são mais registrados. Para evitar um buffer completo (e, portanto, a perda de dados de rastreamento), o ChromeDriver interrompe periodicamente o rastreamento atual, coleta os eventos armazenados em buffer e reinicia o rastreamento em determinados pontos durante um teste.
A coleta de eventos de rastreamento pode adicionar sobrecarga a um teste. Assim, o ChromeDriver só coleta eventos de rastreamento em pontos apropriados durante um teste. Atualmente, os eventos de rastreamento só são coletados em eventos de navegação nas páginas e quando qualquer registro do ChromeDriver (como o registro de desempenho) é solicitado. Sempre é possível que o buffer ainda seja preenchido. Portanto, o ChromeDriver monitora o uso do buffer em versões compatíveis do Chrome (r263512 e mais recentes). Se o buffer for preenchido, o ChromeDriver registrará um aviso e adicionará uma entrada ao registro de desempenho.
Como coletar entradas de registro
No teste, é possível receber entradas de registro de desempenho. Leia a 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 DevTools.
Por exemplo, os eventos da linha do tempo têm um método Timeline.eventRecorded
para todas
as versões do protocolo até a versão 1.1 (a mais recente na época
em que isso foi escrito).
Entradas de registro de rastreamento
O rastreamento não faz parte do protocolo do DevTools publicado a partir da versão 1.1, então os detalhes são fornecidos aqui.
Todos os eventos de trace têm um valor de WebView de "browser", já que os eventos são coletados em todo o navegador.
Há dois métodos de evento de rastreamento possíveis:
- tracing.dataCollected: os parâmetros são um único evento de rastreamento 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
}
}
}