элемент управления веб-браузером SetAttribute не отвечает программно

у меня есть приложение, и мне нужно программно добавить текст в некоторые поля, он работает на большинстве страниц, но на www.google.com, когда я пытаюсь найти значение для поиска, это не сработало, пока я не щелкнул текстовую область, после чего появилось значение

есть ли способ обойти это

мой код:

HtmlElementCollection el = webBrowser1.Document.All;
             foreach (HtmlElement H in el)
            {

                if (H.GetAttribute("type").Equals("text") )
                    H.SetAttribute("value", sendtext);

            }

я пытался нажать на него программно

object obj = H.DomElement;
System.Reflection.MethodInfo mi = obj.GetType().GetMethod("click");
mi.Invoke(obj, new object[0]);

тоже не работает


person Nourah    schedule 14.12.2011    source источник
comment
Вы используете элемент управления веб-браузером в приложении Windows Forms?   -  person Davide Piras    schedule 14.12.2011


Ответы (1)


Проект + Добавить ссылку, вкладка Обзор и выберите c:\windows\system32\mshtml.tlb (.dll в более ранних версиях Windows). Это дает вам доступ к собственному COM-интерфейсу, который возвращает свойство DomElement. Таким образом, вы можете написать свой код следующим образом:

var obj = (mshtml.IHtmlElement)H.DomElement;
obj.click();

Или вы можете сделать это немного менее аккуратно с помощью метода HtmlElement.InvokeMember():

H.InvokeMember("click");

Пример формы, которая запускает запрос Google с использованием этой техники:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        webBrowser1.Url = new Uri("http://google.com");
        webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
    }

    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
        if (webBrowser1.Url.Host.EndsWith("google.com")) {
            HtmlDocument doc = webBrowser1.Document;
            HtmlElement ask = doc.All["q"];
            HtmlElement lucky = doc.All["btnI"];
            ask.InnerText = "stackoverflow";
            lucky.InvokeMember("click");
        }
    }
}
person Hans Passant    schedule 14.12.2011