我的要求 - 我以编程方式打开Internet Explorer实例。然后,我获取HTMLDocument并查找输入字段(文本框),然后设置其值。
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";
我的代码工作正常,直到找到输入字段。问题出在我上面发布的代码中的某个地方。我获取HTMLDocument对象,然后查找名为“login”的HTMLInputElement。在这里,我遇到了不一致的问题 - 文本框有时无法识别,因此当它到达txtbox1.SetAttribute
或txtbox1.value
时会抛出NullReferenceException
。但是,这并不总是发生。有时不抛出异常并且代码工作得很好。
我已经尝试通过代码调试,但是当我通过代码调试时错误永远不会出现!
我无法找出原因是什么?是什么导致这种不一致?任何想法?
答案 0 :(得分:2)
您确定代码运行时页面已满载吗?如果没有,DOM可能在您执行代码时不包含您的控件。
您应该添加一个webBrowser1.DocumentCompleted事件,然后在已完成的事件处理程序中执行您的代码,以确保完全创建DOM。
我还建议使用System.Windows.Forms中的WebBrowser控件而不是axwebbrowser和mshtml。也就是说,如果您在自己的窗口中托管浏览器。我过去经历过mshtml的一些问题,特别是与事件挂钩有关。
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");
}