tags:

views:

76

answers:

1

My requirement - I open an instance of Internet Explorer programmatically. Then, I get the HTMLDocument and look for an input field(textbox) and then set its value.

    HTMLDocument oDoc = new mshtml.HTMLDocumentClass();
    oDoc = (HTMLDocument)oBrowser.Document;

    HTMLInputElement txtbox1 = (HTMLInputElement)oDoc.all.item("login",0);
    txtbox1.setAttribute("value", "test_user_name", 0);
    //txtbox1.value = "test_user_name";

My code works fine untill the input field is looked for. The problem is somewhere in the code I ahve posted above. I obtain the HTMLDocument object, then I look for the HTMLInputElement with the name "login". Here, I face an inconsistency - The text box is not recognised sometimes and so when it reaches the txtbox1.SetAttribute or txtbox1.value then a NullReferenceException is thrown. But, this doesn't happen always. Sometimes the exception is not thrown and the code works just fine. I have tried debugging through the code, but the error never shows up when I debug through the code!!

I am unable to find out what the reason can be? What causes this inconsistency? Any Ideas?

A: 

Are you certain the page is fully loaded when your code runs? If not, the DOM might not include your control at the time you execute your code.

You should add a webBrowser1.DocumentCompleted event and then execute your code in the completed event handler to make sure the DOM is fully created.

I would also recommend using the WebBrowser control from System.Windows.Forms instead of axwebbrowser and mshtml. That is if you are hosting the browser in a window of your own. I've experienced some issues with mshtml in the past, especially related to hooking on events.

webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted)
.
.
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var doc = webBrowser1.Document;
    var txtBox1 = doc.All["login"];
    txtBox1.SetAttribute("value", "test_user_name");
}
Mikael Svenson