C# WebBrowser control -- Get Document Elements After AJAX?
I solved the problem for me.
the key is, attaching a handler for onPropertyChanged
event of the div element which is being populated via ajax call.
HtmlElement target = webBrowser.Document.GetElementById("div_populated_by_ajax");if (target != null){ target.AttachEventHandler("onpropertychange", handler);}
and finally,
private void handler(Object sender, EventArgs e){ HtmlElement div = webBrowser.Document.GetElementById("div_populated_by_ajax"); if (div == null) return; String contentLoaded = div.InnerHtml; // get the content loaded via ajax}
using System;using System.Windows.Forms;namespace WebBrowserDemo{ class Program { public const string TestUrl = "http://www.w3schools.com/Ajax/tryit_view.asp?filename=tryajax_first"; [STAThread] static void Main(string[] args) { WebBrowser wb = new WebBrowser(); wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted); wb.Navigate(TestUrl); while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } Console.WriteLine("\nPress any key to continue..."); Console.ReadKey(true); } static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { WebBrowser wb = (WebBrowser)sender; HtmlElement document = wb.Document.GetElementsByTagName("html")[0]; HtmlElement button = wb.Document.GetElementsByTagName("button")[0]; Console.WriteLine(document.OuterHtml + "\n"); button.InvokeMember("Click"); Console.WriteLine(document.OuterHtml); } }}
You will need to use DOM for it. Cast WebBrowser.Document.DomDocument to IHTMLDocument?. You will have to import some COM interfaces or Microsoft.mshtml assembly.
Have a look to http://msdn.microsoft.com/en-us/library/aa752641(VS.85).aspx for more details.