0

を使用してパフォーマンス ツールを作成しようとしています。node.jsこれにより、自動化して結果を に保存できますMySQL。このツールは、ブラウザーが特定の Web ページを読み込むのにかかった時間を収集することになっています。私は HttpWatch を使用してパフォーマンスを測定しており、結果は数秒で表示されます。使用ブラウザは Firefox です。以下は、パフォーマンス テストを実行するために使用しているスクリプトの一部です。

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

内側のループの 2 回目の反復の後、次のエラーが発生します。

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

誰かがこれを見たことがありますか?手伝って頂けますか?

4

1 に答える 1

0

ノードが非同期であることを覚えておく必要があります

そのため、 for ループは と同時に実行されplugin.CloseBrowser();ます。これは、 for ループで問題が発生する原因となるため、明らかに望んでいるものではありません。

むしろ、for ループが終了したに実行する必要があります。

これを行う簡単な方法については、asyncを参照してください。

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

内側の for ループに対しても同じことを行う必要があります。

于 2013-05-08T11:03:31.567 に答える