Journal des performances

ChromeDriver est compatible avec la journalisation des performances, à partir de laquelle vous pouvez obtenir les événements des domaines "Timeline", "Network" et "Page", ainsi que des données de trace pour les catégories de trace spécifiées.

Activer les journaux de performances

La journalisation des performances n'est PAS activée par défaut. Lorsque vous créez une session, vous devez l'activer.

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

Lorsque cette option est activée, le journal des performances collecte les événements de chronologie, de réseau et de page. Pour également activer le traçage ou personnaliser la journalisation des performances, poursuivez la lecture.

Consultez un exemple complet de journalisation des performances avec les options par défaut (crédit: Michael Klepikov).

Angular Benchpress utilise également la journalisation des performances.

Traçage et journalisation personnalisée

Si vous devez personnaliser la journalisation des performances, pour activer le traçage par exemple, vous pouvez utiliser la fonctionnalité perfLoggingPrefs (via ChromeOptions). Vous pouvez activer le traçage en spécifiant une ou plusieurs catégories de traces Chrome. En savoir plus sur le traçage dans Chrome

Lorsque le traçage est activé, le domaine de la timeline est implicitement désactivé. Vous devez toujours activer le journal des performances avec la fonctionnalité 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);

Vous pouvez également utiliser perfLoggingPrefs pour activer ou désactiver individuellement les domaines du réseau et de la page. Par exemple, vous pouvez activer explicitement le domaine réseau lors du traçage:

...

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

...

Si le traçage est activé, ChromeDriver lance une trace dans l'ensemble du navigateur au lancement de Chrome et poursuit le traçage jusqu'à la fermeture de Chrome. Lorsqu'une trace est en cours d'exécution, Chrome met les événements de trace en mémoire tampon jusqu'à ce qu'ils soient arrêtés.

Une fois que le tampon de trace est plein, les événements de trace ne sont plus enregistrés. Pour éviter une mémoire tampon complète (et donc perdre des données de trace), ChromeDriver arrête régulièrement la trace actuelle, collecte les événements mis en mémoire tampon et redémarre le traçage à certains points d'un test.

La collecte d'événements de trace peut entraîner une surcharge du test. ChromeDriver ne collecte donc les événements de trace qu'aux points appropriés pendant un test. Actuellement, les événements de trace ne sont collectés que pour les événements de navigation sur les pages et lorsqu'un journal ChromeDriver (tel que le journal des performances) est demandé. Il est toujours possible que le tampon soit toujours rempli. ChromeDriver surveille donc son utilisation pour les versions de Chrome compatibles (r263512 et versions ultérieures). Si le tampon se remplit, ChromeDriver consigne un avertissement et ajoute une entrée au journal des performances.

Collecter des entrées de journal

Lors du test, vous pouvez obtenir des entrées de journal des performances. Pour en savoir plus, consultez la documentation sur la journalisation WebDriver.

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

Chaque entrée est une chaîne JSON de la structure suivante:

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

La valeur de la méthode correspond à la méthode de l'événement DevTools. Par exemple, les événements de chronologie ont une méthode Timeline.eventRecorded pour toutes les versions du protocole jusqu'à la version 1.1 incluse (la plus récente au moment de l'écriture).

Entrées de journal Trace

Le traçage ne fait pas partie du protocole DevTools publié à partir de la version 1.1. Des détails sont donc fournis ici.

Tous les événements de trace ont la valeur WebView "browser", car ils sont collectés à l'échelle du navigateur.

Il existe deux méthodes pour les événements de trace:

  • tracing.dataCollected: les paramètres correspondent à un événement de trace unique, sous la forme d'un dictionnaire.
  • tracing.bufferUsage: les paramètres contiennent une seule clé d'erreur, avec un message indiquant que le tampon de trace des outils de développement a été rempli pendant le test.

Voici un exemple d'événement de trace:

{
    "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
        }
    }
}