How can I use BrowserMob Proxy with Protractor?

后端 未结 2 1264
野的像风
野的像风 2020-12-16 05:56

I\'d like to capture the network requests made by my application during a Protractor test suite run.

BrowserMob Proxy looks like a great tool for this.

I\'d

相关标签:
2条回答
  • 2020-12-16 06:12

    Protractor easily provides active wait for certain conditions. After starting the proxy on 8887. I used browser.driver.wait for this solution:

    // protractor.conf.js
    
    var browsermob = require('browsermob-proxy').Proxy;
    var webdriver = require('selenium-webdriver');
    var fs = require('fs');
    // ...
    var proxy;
    
    var conf = {
      // Typical protractor configuration
      // ...
    
      beforeLaunch: function(){
        proxy = new browsermob({
          port : 8887
        });
      },
    
      onPrepare: function (){
        browser.driver.get('http://localhost:8080/index.html');
    
        var proxyReady = false;
        proxy.start(8888, function(err, data){
          if (!err) {
            proxy.startHAR(8888, 'test', true, true, function(){
              proxyReady = true;
            });
          } else {
            console.error(err);
          }
        });
    
        browser.driver.wait(function(){
          return proxyReady;
        });
      },
    
      onComplete: function () {
        var proxyDone = false;
    
        proxy.getHAR(8888, function(err, resp) {
          if (!err) {
              console.log('har saved at output.har');
              fs.writeFileSync('test/diagnostics/output.har', resp, 'utf8');
          } else {
              console.err('Error getting HAR file: ' + err);
          }
          proxy.stop(8888, function() {
            proxyDone = true;
          });
        });
    
        return browser.driver.wait(function(){
          return proxyDone;
        });
      },
    }
    
    0 讨论(0)
  • 2020-12-16 06:33

    You need to denodeify callbacks, i.e. turn them into Promises so Protractor will wait for them.

    Alternative 1: Using already included protractor.promise

      //...
      onPrepare: function() {
        var deferred = protractor.promise.defer();
        proxy.doHAR('http://yahoo.com', function(err, data) {
          if (err) {
            deferred.reject('ERROR: ' + err);
          } else {
            deferred.fulfill(data);
          }
        });
        return deferred.promise;
      }
    

    Alternative 2: Using Q library

    var Q = require('q');
    
      //...
      onPrepare: function() {
        var proxy_doHAR = Q.nfbind(proxy.doHAR);
        return proxy_doHAR('http://yahoo.com');
      }
    

    More info here and here.

    0 讨论(0)
提交回复
热议问题