1

我的要求 - 我以编程方式打开 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.SetAttributeortxtbox1.value然后 aNullReferenceException被抛出。但是,这并不总是发生。有时不会抛出异常并且代码工作得很好。我已经尝试通过代码进行调试,但是当我通过代码进行调试时,错误从未出现过!!

我无法找出原因可能是什么?是什么导致了这种不一致?有任何想法吗?

4

1 回答 1

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");
}
于 2009-12-21T22:24:03.367 回答