0

我正在尝试编写一个性能工具,node.js以便我可以自动化它,并将结果存储在MySQL. 该工具应该收集浏览器加载特定网页所需的时间。我正在使用 HttpWatch 来衡量性能,结果以秒为单位显示。使用的浏览器是火狐。下面是我用来运行性能测试的一段脚本:

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

有人见过这个吗?你能帮助我吗?

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 回答