在開發 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 時,WebBrowser
的 DocumentCompleted
事件則可以很好的幫助你判斷載入狀態。但如果遇到同步上的問題,還是要想一些workaround的方式來解決了。