web-dev-qa-db-fra.com

Comment capturer toutes les demandes faites par page dans le pilote Web? Existe-t-il une alternative à Browsermob?

J'utilise Selenium2/WebDriver pour tester mes applications Web. Tous les tests sont écrits en Java et exécutés avec Maven.

Lors de l'ouverture d'une page avec un webdriver, j'aimerais capturer toutes les demandes faites par page (images, fichiers js et css, etc.). J'utilise ces données principalement pour deux raisons

  • vérification des 404 (et autres erreurs) dans les appels
  • vérifier si le code analytique fonctionne (vérifier s'il envoie des requêtes appropriées)

Selon le projet, j'utilise Firebug avec Netexport ou le proxy Browsermob. Dans les deux cas, je peux facilement obtenir un fichier HAR (Html ​​ARchive), l'analyser et extraire les données que je veux.

Voici le problème: je ne suis satisfait d'aucune de ces solutions. J'ai particulièrement des problèmes pour obtenir le fichier HAR lorsqu'une page contient une vidéo qui est chargée trop longtemps. Je cherche quelque chose de plus stable.

Donc, les questions sont:

Existe-t-il une alternative à Browsermob? Je connais FiddlerCore mais c'est une bibliothèque .NET et mes tests sont écrits en Java. J'ai également entendu parler d'Ajax DynaTrace et je sais qu'il existe un moyen de l'intégrer à Selenium, mais la documentation que j'ai trouvée concernait Selenium-RC et non WebDriver.

Existe-t-il un moyen d'intégrer DynaTrace à WebDriver ou d'utiliser FiddlerCore avec Java?

Existe-t-il un autre moyen d'atteindre les objectifs que j'ai mentionnés? Je recherche un proxy que je peux facilement contrôler à partir de mon code. L'exportation de données vers HAR serait un grand avantage.

24
JacekM
12
r-sal

Il existe une alternative avec firefox ver 42+, il existe un addon appelé Firefox HarExport

File harExportApi = new File(System.getProperty("user.dir")
                     + "/src/main/resources/firebug/harexporttrigger-0.5.0-beta.7.xpi");

netExportProfile.addExtension(harExportApi);
netExportProfile.setPreference("extensions.netmonitor.har.enableAutomation", true);
    netExportProfile.setPreference("extensions.netmonitor.har.contentAPIToken", "test");
    netExportProfile.setPreference("extensions.netmonitor.har.autoConnect", true);

cap.setCapability(FirefoxDriver.PROFILE, netExportProfile);

et exécuter le script suivant nous donnera toutes les réponses aux demandes

 String getHarLogScript = "var options = {\n" +
                "    token: \"test\",\n" +
                "    getData: true,\n" +
                "    title: \"my custom title\",\n" +
                "    jsonp: false,\n" +
                "  };\n" +
                "\n" +
                "  HAR.triggerExport(options).then(result => {\n" +
                "    var har = JSON.parse(result.data);\n" +
                "\n" +
                "    // Use performance.timing to provide onContentLoad\n" +
                "    +
                "     +
                "    var t = performance.timing;\n" +
                "    var pageTimings = har.log.pages[0].pageTimings;\n" +
                "    pageTimings.onContentLoad = t.domContentLoadedEventStart - t.navigationStart;\n" +
                "    pageTimings.onLoad = t.loadEventStart - t.navigationStart;\n" +
                "\n" +
                "    window.HarEntries=har.log.entries\n" +
                "\n" +
                "    console.log(\"HAR log (\" + result.data.length + \") \", har.log);\n" +
                "  }, err => {\n" +
                "    console.error(err);\n" +
                "  });"

LOG.info("Loading HAR log entries object into browser HarEntries object");
SeleniumUtils.executeScript(driver, getHarLogScript);

harEntries = ((List<Object>) SeleniumUtils.executeScript(driver, "return window.HarEntries"));
5
Mahesh Dani

J'ai récemment travaillé sur ce type de proxy. Le projet est assez frais, je travaille toujours sur la documentation mais ça vaut peut-être la peine d'être vérifié. Les sources et exemples sont ici

  1. Ajoutez de la dépendance à votre projet
    <dependency>
       <groupId>com.moxproxy</groupId>
       <artifactId>moxproxy.core</artifactId>
       <version>1.0.2</version>
    </dependency>
  1. Démarrer le proxy
    MoxProxy proxy = LocalMoxProxy.builder()
                .withPort(89)
                .build();
    proxy.startServer();
  1. Configurer le pilote Web Selenium pour utiliser le proxy sur l'hôte local avec le port 89 et exécuter le test

  2. Recueillir du trafic

    List<MoxProxyProcessedTrafficEntry> requestTraffic = proxy.getAllRequestTraffic();
    List<MoxProxyProcessedTrafficEntry> responseTraffic = proxy.getAllResponseTraffic();

Outre la collecte de proxy de trafic, il est possible de modifier les demandes et les réponses - détails sur github

1
Lukasz A