若要經由 WebBrowser 取得網頁原始碼內容,可在 WebBrowser 的 DocumentCompleted 事件內,利用 WebBrowser.DocumentStream 屬性讀取 Stream 內容,或是用 WebBrowser.DocumentText 屬性取得原始碼字串文字。
但要取得 AJAX 產生的動態內容時,必須監聽 DOM 元素的 onpropertychange 事件,當 onpropertychange 事件觸發時,才去讀取目前頁面的內容。
(onpropertychange 事件在頁面元素的內容改變時,就會觸發)
範例:
test.html (HTML 頁面,每兩秒執行一次 AJAX,取得伺服器時間,更新在<div id="abc"></div>元素內 )
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script> $.ajaxSetup({ cache: false }); var aa = function() { $.get("ajax.php", function(data) { $("#abc").html(data); }); }; $(function() { aa(); setInterval(aa, 2000); }); </script> </head> <body> <div id="abc"></div> </body> </html>ajax.php (PHP頁面,輸出目前時間)
<?php echo date("H:i:s");C# 程式
private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate("http://127.0.0.1/test.html"); } private void handlerAbc(Object sender, EventArgs e) { HtmlElement elm = webBrowser1.Document.GetElementById("abc"); if (elm == null) return; Console.WriteLine("elm.InnerHtml(handlerAbc):" + elm.InnerHtml); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { /* 抓取網頁原始碼 方法1*/ System.IO.StreamReader getReader = new System.IO.StreamReader(webBrowser1.DocumentStream, System.Text.Encoding.Default); string htmlA = getReader.ReadToEnd(); // htmlA 只能抓到網頁原始碼 /* 抓取網頁原始碼 方法1*/ string htmlB = webBrowser1.DocumentText; // htmlB 只能抓到網頁原始碼 /* 取得 AJAX 動態改變的內容,可用以下方法 */ HtmlElement elm = webBrowser1.Document.GetElementById("abc"); // 取的id為abc的元素 Console.WriteLine("elm.InnerHtml(DocumentCompleted):" + elm.InnerHtml); if (elm != null) { // 新增 handlerAbc 方法,監聽abc元素的 onpropertychange 事件, elm.AttachEventHandler("onpropertychange", new EventHandler(handlerAbc)); } }執行結果:
elm.InnerHtml(DocumentCompleted):
elm.InnerHtml(handlerAbc):06:32:36
elm.InnerHtml(handlerAbc):06:32:38
elm.InnerHtml(handlerAbc):06:32:40
參考:
WebBrowser.DocumentStream 屬性
WebBrowser.DocumentText 屬性
HtmlElement.AttachEventHandler 方法
C# WebBrowser control — Get Document Elements After AJAX?
webBrowser1_DocumentCompleted 不停被調用
實時監聽輸入框值變化的完美方案:oninput & onpropertychange
thanks.
回覆刪除