使用powershll和IECapt取得網頁瀏覽速度

前陣子在查個問題,我必須要取得瀏覽網頁時所需花費的時間作為釐清問題的參考依據。

一個網頁的呈現,簡單的講,在瀏覽器發出request後,逐一由網站取得html、css、javascript、圖檔等等。接者,瀏覽器會做解析、處理、執行、呈現。

先撇除使用者端因使用不同的瀏覽器、版本,造成網頁呈現速度不同的這個因素(當然還要剔除網路問題)。一般來講,網站主機端的軟硬體效能,以及html、css、javascript也深深影響網頁最後需要多少時間才能呈現…

以上詳細的過程,和相關技術,講起來簡單,其實又是另一門很深的功夫和學問。建議可以參考下面兩份資料

因此,取得瀏覽網頁時所需花費的時間,必須要能儘量符合人們使用瀏覽器觀看網頁時的狀況。而不能使用wget這類的方式來測試單獨取得html的速度。思考了很久,最後還是使用 powershell 和 IECapt

簡單的說明一下作法…先提 IECapt,他是一個在指令列(command-line)下執行的小工具程式。是透過 IE 去擷取特定的網頁畫面,並存成圖檔。也因此,使用IECapt 同等於使用IE去瀏覽網頁。

接者,就只是很單純的利用 powershll去呼叫IECapt『瀏覽』網頁,並計算每次瀏覽網頁時時間。也就是計算呼叫起來,直到結束之間的時間差。

不過,在做長期監控時需要考量一點。就是每次測試時,無法確定在測試的當下,被測試的主機狀態如何?特別是下列兩種狀況。因此需要設定 time out 時間,避免測試時因下列狀況卡住
  • 被測試的主機,當下因各種問題,造成反應異常緩慢。
    當為此情況時,測試結果為time out 時間。
  • 被測試的主機,當下已經無法提供服務(如,如法連線)。
    當為此情況時,測試結果為0。
以下,就是測試速度的程式碼

附註:IECapt有時會發生不明異常,而中斷。這點,目前我還沒比較好的解決方案…

  1. #避免留有之前測試所產生的圖檔
  2. if (Test-Path webservet_test.jpg){
  3. remove-item $pwd\$testcaptfile -force
  4. }

  5. #產生shell,準備開始測試
  6. $WshShell = New-Object -ComObject WScript.Shell

  7. $timestep_start= $(Get-Date)
  8. #避免因測試當下有問題問題導致執行太久,所以設定time out為 150秒
  9. $theprocess= $WshShell.Exec("cmd /c $pwd\IECapt.exe --url=http://host.testing.com.tw/ --max-wait=150000 --out=$pwd\$testcaptfile")
  10. $watching= get-process -id $theprocess.ProcessID
  11. $watching.waitforexit()
  12. $timestep_end= $(Get-Date)

  13. #避免被測試的主機當下無法提供服務
  14. #因此,利用判斷圖檔是否存在來確定本次測試的結果為何
  15. if (Test-Path $testcaptfile){
  16. $spendtime=New-TimeSpan $timestep_start $timestep_end
  17. $spendtime=$spendtime.TotalSeconds
  18. }
  19. else{
  20. #表示被測試主機無法提供服務
  21. $spendtime=0
  22. }

留言