2011-02-04 28 views
6

Widziałem wiele postów dotyczących tego konkretnego tematu na SO, a także w Internecie w ogóle, a większość, jeśli nie wszystkie kodu jest jak widać poniżejZłożenie formularza strony za pomocą formantu WebBrowser w C#

private void btnSubmit_Click(object sender, RoutedEventArgs e) 
{ 
    webBrowser1.Navigate(new Uri("http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/onsubmit.htm")); 
} 

private void btnLogin_Click(object sender, RoutedEventArgs e) 
{ 
    mshtml.HTMLDocument htmlDoc = null; 

    htmlDoc = (mshtml.HTMLDocument) this.webBrowser1.Document; 

    if (webBrowser1.Document != null) 
    { 
     foreach (mshtml.HTMLFormElement form in htmlDoc.forms) 
     { 
      form.submit(); 
      break; 
     } 
    } 
} 

Kod nie zawiera żadnych błędów, ale przez całe życie nie jest wysyłany. Strona przykładowa, której używam, ma prosty przycisk, co robi, alarmuje wybór przycisku radiowego, a następnie przesyła formularz. Z jakiegoś dziwnego powodu, gdy formularz jest przesyłany za pomocą kodu za pomocą formantu WebBrowser, formularz jest wysyłany, ale alert nigdy się nie wyświetla.

Nie jestem pewien, co robię źle tutaj. Każda pomoc w tym zakresie byłaby doceniana.

+0

Czy mogę zapytać, dlaczego próbujesz to zrobić? –

+0

W jaki sposób nawiązałeś spotkanie i do czego? –

+1

@Matti, Próbuję zautomatyzować procedurę logowania w sieci wewnętrznej, która nie ma opcji zapamiętaj mnie. – vikramjb

Odpowiedz

6

Czy kliknięcie przycisku wykona to, czego potrzebujesz? Będziesz musiał dodać odwołanie COM do biblioteki obiektów HTML HTML (które być może już posiadasz). Na przykład, jeśli załadować google do formantu WebBrowser, ten kod umieści „Hello World” w polu wyszukiwania i przeprowadzenia wyszukiwania:

 mshtml.IHTMLDocument2 doc = ((mshtml.HTMLDocumentClass)webBrowser1.Document); 


     ((mshtml.IHTMLElement)doc.all.item("q")).setAttribute("value", "hello world"); 
     MessageBox.Show("Clicking I'm feeling lucky button"); 
     ((mshtml.HTMLInputElement)doc.all.item("btnI")).click(); 

EDIT: I uaktualniony kod dla komponentów że WebBrowser WPF sterowanie używa. Zauważ też, że czasami powoduje to błąd skryptu z Google, ale wydaje się, że jest to problem związany z czasem, oparty na niektórych wywołaniach ajaxowych, które Google ma na stronie głównej.

+0

Metoda Wszystkie nie wydaje się być obecna w formancie webBrowser1. Czy czegoś brakuje? – vikramjb

+0

Właściwość .all jest członkiem członka .Document klasy webbrowser. Jest dostępny od .net 2.0: http://msdn.microsoft.com/en-US/library/system.windows.forms.htmldocument.all(v=VS.80).aspx –

+0

Używam kontroli webBrowser w projekt WPF i nigdzie nie widzę tej metody.Moveove właściwość dokumentu kontrolki webBrowser wydaje się być typu danych Object. – vikramjb

4

Aby rozwiązać problem trzeba wymienić linię:

form.submit(); 

Z następującego kodu:

var children = form as IEnumerable; 
var inputs = children.OfType<mshtml.HTMLInputElement>(); 
var submitButton = inputs.First(i => i.type == "submit"); 

submitButton.click(); 

To pokaże alert o wybór użytkownika i prześlij formularz.

+0

Przycisk Wyślij to obraz, który wywołuje JS w celu przesłania formularza, dlatego wykonałem form.submit. – vikramjb

+0

Możesz znaleźć obraz wewnątrz formularza (w taki sam sposób, jak zrobiłem to z przyciskiem przesyłania), a następnie go kliknąć. Pomoże ci, gdy skrypt, o którym wspomniałeś, zrobi coś więcej niż tylko przesłanie formularza. –

+0

Oleg, twoja odpowiedź była również poprawna, ale ponieważ próbowałem najpierw próbki Johna, oddałem mu nagrodę. – vikramjb

1

Mam więcej brudną jedną wkładkę roboczą poprzez wstrzyknięcie JavaScript, aby przesłać formularz

_webBrowser.InvokeScript("eval", new object[] { "document.getElementById('formName').submit()" }); 

który został działa na mnie podczas interakcji z witryną przy użyciu dużo JavaScript i przycisk poza formę .

+0

Brudna jedna linia, ale to jedyna odpowiedź na tej stronie, która zadziałała dla mnie. – colton7909