Что является причиной несоответствия - HTMLInputElement mshtml - PullRequest
1 голос
/ 21 декабря 2009

Мое требование - я открываю экземпляр 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, затем ищу HTMLInputElement с именем «логин». Здесь я сталкиваюсь с несоответствием - текстовое поле иногда не распознается, поэтому, когда оно достигает значения txtbox1.SetAttribute или txtbox1.value, выдается NullReferenceException. Но так бывает не всегда. Иногда исключение не выдается, и код работает просто отлично. Я пытался отладить код, но ошибка никогда не появляется, когда я отлаживаю код !!

Я не могу выяснить, в чем причина? Что вызывает это несоответствие? Есть идеи?

1 Ответ

2 голосов
/ 22 декабря 2009

Вы уверены, что страница полностью загружена при запуске кода? В противном случае DOM может не включать ваш контроль во время выполнения кода.

Вы должны добавить событие webBrowser1.DocumentCompleted и затем выполнить свой код в обработчике завершенных событий, чтобы убедиться, что DOM полностью создан.

Я бы также рекомендовал использовать элемент управления WebBrowser из System.Windows.Forms вместо 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");
}
...