2013-05-08 2 views
0

Я пытаюсь написать инструмент производительности с использованием node.js, поэтому я могу его автоматизировать и сохранить результаты в MySQL. Инструмент должен собирать, как долго потребовалось, чтобы браузер загружал определенную веб-страницу. Я использую HttpWatch для измерения производительности, и результат отображается в секундах. В браузере используется Firefox. Ниже приведен фрагмент сценария, я использую, чтобы запустить тест производительности:node.js crashing after loop iteration

var MyUrls = [ 
    "http://google.com", 
    "http://yahoo.com" 
    ];  

try { 

     var win32ole = require('win32ole'); 
     var control = win32ole.client.Dispatch('HttpWatch.Controller'); 
     var plugin = control.Firefox.New(); 
     for (var i=0; i < MyUrls.length; i++) { 
      var url = MyUrls[i]; 
      console.log(url); 
      for(var j=0; j < 14; j++) { 
      // Start Recording HTTP traffic 
      plugin.Log.EnableFilter(false); 
      // Clear Cache and cookier before each test 
      plugin.ClearCache(); 
      plugin.ClearAllCookies(); 
      plugin.ClearSessionCookies(); 
      plugin.Record(); 
      // Goto to the URL and wait for the page to be loaded 
      plugin.GotoURL(url); 
      control.Wait(plugin, -1); 
      // Stop recording HTTP 
      plugin.Stop(); 
      if (plugin.Log.Pages.Count != 0) 
      {   
       // Display summary statistics for page 
       var summary = plugin.Log.Pages(0).Entries.Summary; 
       console.log(summary.Time); 
      } 
      } 
     } 
     plugin.CloseBrowser(); 
    } catch(e) { 
     console.log('*** exception cached ***\n' + e); 
    } 

После второй итерации внутреннего цикла, я получаю следующее сообщение об ошибке:

C:\xampp\htdocs\test\browser-perf>node FF-load-navigation.js 
http://localhost/NFC-performance/Bing.htm 
[Number (VT_R8 or VT_I8 bug?)] 
2.718 
[Number (VT_R8 or VT_I8 bug?)] 
2.718 
OLE error: [EnableFilter] -2147352570 [EnableFilter] IDispatch::GetIDsOfNames Au 
toWrap() failed 

есть кто-то видел это раньше? Вы можете мне помочь?

+0

Где находятся документы API для Firefox-плагина, которые вы используете? У меня есть сомнения, что методы типа ClearCache и ClearCookies являются синхронными (т. Е. Блокируют выполнение до завершения операции). Если вместо этого они асинхронны, вам необходимо указать обратные вызовы для них. https://github.com/idobatter/node-win32ole говорит: «Асинхронные, неблокирующие привязки win32ole» - то, что я ожидал. –

+0

Это действительно странно, readme of win32ole говорит, что он должен быть неблокирующим, но примеры показывают все виды функций только синхронно. Как будто readme лежит прямо в вашем лице. –

ответ

0

Вы должны помнить, что узел является асинхронным

Так что цикл работает одновременно plugin.CloseBrowser();, что, очевидно, не то, что вы хотите, потому что то будет причиной его закрытия, что вызовет проблемы в течение цикла.

скорее вы хотите, чтобы его запустить после петля для петли.

Посмотрите на async для простого способа сделать это.

async.each(MyUrls, function (callback) { 
    ... 
    callback() 
}, function(err){ 
    plugin.CloseBrowser(); 
}); 

То же самое должно быть сделано для вашей внутренней петли.

+0

Не могли бы вы дать мне более подробную информацию о вашей идее Niall? – cybertextron

+0

@philippe Конечно. Поэтому узел работает асинхронно. Поэтому, если я скажу, что цикл for, как и вы, выше, а затем некоторый код впоследствии, узел будет запускать цикл for и в то же время запустить следующий бит кода. В вашем коде он запускает цикл for, затем одновременно вызывает 'plugin.CloseBrowser();' и учитывая, что вы используете 'plugin' var в вашем цикле, я предполагаю, что вызов функции выше вызовет проблемы. Поймай меня? – Niall