我正在尝试使用node.js
编写一个性能工具,因此我可以将其自动化,并将结果存储在MySQL
中。该工具应该收集浏览器加载特定网页所花费的时间。我正在使用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);
}
在内循环的第二次迭代之后,我收到以下错误:
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 :(得分:0)
您必须记住该节点是异步的
因此for循环同时运行到plugin.CloseBrowser();
,这显然不是你想要的,因为它导致它关闭,这将导致for循环出现问题。
而是希望在 for循环结束后运行。
请查看async以获得一种简单的方法。
async.each(MyUrls, function (callback) {
...
callback()
}, function(err){
plugin.CloseBrowser();
});
必须为你的内部循环做同样的事情。