casperJS page.resource.request 和 page.resource.response 回调调用在打开多个 URL 时递增

casperJS page.resource.request and page.resource.response callback calls increment when opening multiple URL

我遇到了一个与以下方法有关的小问题:

这里是这个例子的代码():

var urls = [
  'meine-url.de/home.html',
  'meine-url.de/impressum.html',
  'meine-url.de/rechtliche_hinweise.html',
  'meine-url.de/datenschutz.html',
  'meine-url.de/emissions_verbrauchswerte.html',
  'meine-url.de/probefahrtanfrage.html',
  'meine-url.de/angebotsanfrage.html',
  'meine-url.de/servicekontaktanfrage.html',
  'meine-url.de/serviceterminanfrage.html',
  'meine-url.de/autohaus_aktuell.html',
  'meine-url.de/aktuelles_von_auto.html',
  'meine-url.de/unser_autohaus.html',
  'meine-url.de/unser_team.html',
  'meine-url.de/anfahrt.html',
  'meine-url.de/standorte.html',
  'meine-url.de/oeffnungszeiten.html',
  'meine-url.de/checks_inspektion.html',
  'meine-url.de/auto_service_check.html',
  'meine-url.de/inspektion.html',
  'meine-url.de/hauptuntersuchung.html',
  'meine-url.de/reparaturen.html',
  'meine-url.de/garantie_mobilitaet.html',
  'meine-url.de/herstellergarantie.html',
  'meine-url.de/mobilservice.html',
  'meine-url.de/flex_garantie.html',
  'meine-url.de/verlaengerung_anschlussgarantie.html'
];

var s,e;

casper.test.begin('TEST CONTROLLER', function(test) {

  casper.start();

  /* Run tests for all given URLs */
  casper.each(urls, function(self, url, i) {

    /* Open the next given URL form the array */
    casper.thenOpen(url, function() {

      /* On every request we take a new start time */
      casper.on('page.resource.requested', function(requestData, request) {
        console.log("REQUESTED:",requestData.url);
        s = new Date().getTime();
      });

      /* And when the response comes in we calculate the difference */
      casper.on('page.resource.received', function(response) {
        console.log("RESPONSE DATA GOTTEN: ",response.url);

        e = new Date().getTime();
        casper.echo("URL: "+url+" - "+"Time between HTTP request and HTTP response : "+ (e-s) + "ms", "INFO");
      });

    });

  });

  casper.run(function() {
    test.done();
  });

});

总的来说,这种方法是可行的,但有一个小问题我不明白,也没有意义。

在这里查看输出结果:

# TEST CONTROLLER
  PASS URL: meine-url.de/home.html - Time : 244ms

  PASS URL: meine-url.de/home.html - Time : 153ms
  PASS URL: meine-url.de/impressum.html - Time : 154ms

  PASS URL: meine-url.de/home.html - Time : 123ms
  PASS URL: meine-url.de/impressum.html - Time : 124ms
  PASS URL: meine-url.de/rechtliche_hinweise.html - Time : 125ms

  PASS URL: meine-url.de/home.html - Time : 153ms
  PASS URL: meine-url.de/impressum.html - Time : 154ms
  PASS URL: meine-url.de/rechtliche_hinweise.html - Time : 154ms
  PASS URL: meine-url.de/datenschutz.html - Time : 154ms

  PASS URL: meine-url.de/home.html - Time : 2327ms
  PASS URL: meine-url.de/impressum.html - Time : 2328ms
  PASS URL: meine-url.de/rechtliche_hinweise.html - Time : 2328ms
  PASS URL: meine-url.de/datenschutz.html - Time : 2328ms
  PASS URL: meine-url.de/emissions_verbrauchswerte.html - Time : 2328ms

  PASS URL: meine-url.de/home.html - Time : 2403ms
  PASS URL: meine-url.de/impressum.html - Time : 2404ms
  PASS URL: meine-url.de/rechtliche_hinweise.html - Time : 2405ms
  PASS URL: meine-url.de/datenschutz.html - Time : 2405ms
  PASS URL: meine-url.de/emissions_verbrauchswerte.html - Time : 2405ms
  PASS URL: meine-url.de/probefahrtanfrage.html - Time : 2405ms

  PASS URL: meine-url.de/home.html - Time : 2320ms
  PASS URL: meine-url.de/impressum.html - Time : 2321ms
  PASS URL: meine-url.de/rechtliche_hinweise.html - Time : 2321ms
  PASS URL: meine-url.de/datenschutz.html - Time : 2321ms
  PASS URL: meine-url.de/emissions_verbrauchswerte.html - Time : 2321ms
  PASS URL: meine-url.de/probefahrtanfrage.html - Time : 2321ms
  PASS URL: meine-url.de/angebotsanfrage.html - Time : 2321ms

  PASS URL: meine-url.de/home.html - Time : 2363ms
  PASS URL: meine-url.de/impressum.html - Time : 2364ms
  PASS URL: meine-url.de/rechtliche_hinweise.html - Time : 2365ms
  PASS URL: meine-url.de/datenschutz.html - Time : 2365ms
  PASS URL: meine-url.de/emissions_verbrauchswerte.html - Time : 2365ms
  PASS URL: meine-url.de/probefahrtanfrage.html - Time : 2365ms
  PASS URL: meine-url.de/angebotsanfrage.html - Time : 2365ms
  PASS URL: meine-url.de/servicekontaktanfrage.html - Time : 2365ms

  PASS URL: meine-url.de/home.html - Time : 3025ms
  PASS URL: meine-url.de/impressum.html - Time : 3026ms
  PASS URL: meine-url.de/rechtliche_hinweise.html - Time : 3026ms
  PASS URL: meine-url.de/datenschutz.html - Time : 3026ms
  PASS URL: meine-url.de/emissions_verbrauchswerte.html - Time : 3026ms
  PASS URL: meine-url.de/probefahrtanfrage.html - Time : 3027ms
  PASS URL: meine-url.de/angebotsanfrage.html - Time : 3027ms
  PASS URL: meine-url.de/servicekontaktanfrage.html - Time : 3027ms
  PASS URL: meine-url.de/serviceterminanfrage.html - Time : 3027ms

所以你可以看到它建立了一个堆栈,回调方法,casper.on('page.resource.requested'casper.on('page.resource.received' 都从以前调用过的所有页面得到了回调。正如您看到的那样,每一步都会增加。

根据最后给定的测量时间,代码工作正确 URL 但它在这里不合适。

我只想要一个 URL 的回调,而不是这个,我能在这里做什么,我假设它必须对 page 对象做一些事情。超出此上下文的内容: https://github.com/n1k0/casperjs/pull/826

但这不起作用,当我重新创建页面上下文时,我收到如下错误消息:

FAIL Error: cannot access member `customHeaders' of deleted QObject

uncaughtError: TypeError: 'undefined' is not a function (evaluating 'casper.newPage()')

他好像找不到newPage函数。

casper.on() 将始终向列表添加事件处理程序。它不会取代它们。由于您在 每次迭代 上添加事件,您将从之前的迭代中获得重复的输出。

此外,then 回调是在加载 URL 之后调用的,因此您在该回调中注册的事件处理程序不会为当前 URL 调用没有了。

casper.start();

/* On every request we take a new start time */
casper.on('page.resource.requested', function(requestData, request) {
    console.log("REQUESTED:",requestData.url);
    s = new Date().getTime();
});

/* And when the response comes in we calculate the difference */
casper.on('page.resource.received', function(response) {
    console.log("RESPONSE DATA GOTTEN: ",response.url);

    var e = new Date().getTime();
    casper.echo("URL: "+url+" - "+"Time between HTTP request and HTTP response : "+ (e-s) + "ms", "INFO");
});

/* Run tests for all given URLs */
casper.each(urls, function(self, url, i) {
    /* Open the next given URL form the array */
    casper.thenOpen(url);
});

casper.run(function() {
    test.done();
});

如果你想让它更健壮,那么你需要检测页面是否完全加载。为此,您可能需要注册 "resource.error"casper.page.onResourceTimeout (Example)。