Table of Contents

在開發 C# 程式時,有時候我們需要確定網頁是否已經完全載入完成,這樣才能進一步對頁面上的元素進行操作。今天我就來介紹幾種常見的方法來判斷網頁載入狀態,以及一些可能遇到的問題。

一般情況:使用 HttpWebRequest

在需要從網頁中獲取資料的情況下,最直接的方法通常是使用 HttpWebRequest 類別。這個類別能夠向指定的 URL 發送請求,並返回伺服器的回應,讓你可以檢查網頁的內容是否正確傳回。如果你只是需要確認頁面是否載入、資料是否能取得,那麼 HttpWebRequest 會是很好的選擇。比如:

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("[<http://www.contoso.com>](<http://www.contoso.com/>)");

一定要用webbrowser的狀況下

但在某些情況下,你可能需要透過 GUI 來載入網頁。這時候就要用到一個名為 DocumentCompleted 的事件了,當網頁完全載入後,這個事件就會被觸發。

比如下面的例子當中,使用 WebBrowser.DocumentCompleted 事件,在網頁完全載入之後才做 print:

private void PrintHelpPage()
{
   // Create a WebBrowser instance.
   WebBrowser webBrowserForPrinting = new WebBrowser();

   // Add an event handler that prints the document after it loads.
   webBrowserForPrinting.DocumentCompleted +=
       new WebBrowserDocumentCompletedEventHandler(PrintDocument);

   // Set the Url property to load the document.
   webBrowserForPrinting.Url = new Uri(@"\\\\myshare\\help.html");
}


private void PrintDocument(object sender,
   WebBrowserDocumentCompletedEventArgs e)
{


   // Print the document now that it is fully loaded.
   ((WebBrowser)sender).Print();


   // Dispose the WebBrowser now that the task is complete.
   ((WebBrowser)sender).Dispose();
}

這樣的處理方式就特別適合那種需要進行使用者互動的網頁介面,例如需要展示某些效果給使用者觀看,或是必須進行一些手動操作的頁面。

解決如果碰到while迴圈時的不同步

有時候當你需要透過 while 迴圈等待網頁載入完成時,可能會遇到同步上的問題。在這種時候如果還是直接使用 DocumentCompleted 事件可能不夠。StackOverflow 上有網友使用全域變數來同步地控制 WebBrowser 的載入。這個方法是放一個布林變數,並透過 while 迴圈和 Thread.Sleep 來等待頁面載入完成。

根據實際遇到的情況來選擇

總之,如果只是想要簡單的做資料抓取,一般情況下使用HttpWebRequest 大概都能解決;但如果當需要透過 GUI 時,WebBrowserDocumentCompleted 事件則可以很好的幫助你判斷載入狀態。但如果遇到同步上的問題,還是要想一些workaround的方式來解決了。