2015-10-20 68 views
0

我正在寫一個PhantomJS程序,應該打開一個頁面,跟蹤它的時間,並在控制檯中寫入加載時間。我的目標是讓這個函數運行5次。打開頁面失敗for循環時調用超過1次

問題是,當我編寫只執行1次的「for」循環 - 函數正常運行時,但是當我嘗試運行它2次時,出現無法打開地址的錯誤消息。看起來地址不是第二次通過。我不知道會發生什麼問題了。這是我的代碼:

var page = require('webpage').create(), 
system = require('system'), 
t; 

//Opening a page and tracking page load time 
var loadpage = function(){ 
    address = 'http://www.google.com'; 
    t = Date.now(); 
    page.open(address, function(status) { 
     if (status !== 'success') { 
      console.log('FAIL to load the address'); 
     } else { 
      t = Date.now() - t; 
      console.log('Loading ' + address); 
      console.log('Loading time ' + t + ' msec'); 
     } 

     phantom.exit(); 
    }); 
}; 

for (var i = 0; i <2 ; i++) { 
    loadpage(i); 
} 
+0

你怎麼叫'loadpage (i)'有一個參數,但喲你定義該函數沒有參數'var loadpage = function()'? –

+0

請注意,'t'是在函數外部定義的,'adress'是全局的。在一個函數調用中更改't',可以爲每個函數調用更改它,因爲它不在函數範圍內。 – adeneo

+0

感謝您的見解!我對此很陌生,所以還有很多我還不知道的東西。再次感謝!你的回答非常有用 –

回答

3

page.open()是一個異步功能。如果您在一個循環中調用它,那麼即使發送第一個頁面請求,循環也會完全執行。問題是多次調用page.open()後會立即覆蓋以前的調用。充其量,你只能加載最後一個URL。

您可能需要等待每個頁面加載,或者您可以創建多個頁面以便並行請求頁面。此外,您應等待每頁加載後才退出(phantom.exit())PhantomJS。

這裏有一些方法可以做到這一點:


簡單的方法來做到這一點:

var loadpage = function (i, max){ 
    if (i === max) { 
     phantom.exit(); 
     return; 
    } 
    var address = 'http://www.google.com'; 
    t = Date.now(); 
    page.open(address, function(status) { 
     if (status !== 'success') { 
      console.log('FAIL to load the address'); 
     } else { 
      t = Date.now() - t; 
      console.log('Loading ' + address); 
      console.log('Loading time ' + t + ' msec'); 

     } 

     loadpage(i+1, max) 
    }); 
}; 

loadpage(0, 5); 
+0

感謝您的見解!我對此很陌生,所以還有很多我還不知道的東西。再次感謝!你的答案非常有用 –

1

看來你不應該叫phantom.exit()中途程序。

+0

這是正確的,它應該是'phantom.close()'關閉頁面並釋放內存,而不是退出程序的exit。 – adeneo

+0

@adeneo這不完全正確。關閉後,「頁面」不能使用。如果關閉了「頁面」,則必須爲下一個URL創建一個新頁面。 –

+0

@ArtjomB。 - 這就是'loadpage'函數的作用 – adeneo