2011-02-04 10 views
6

ho visto un sacco di messaggi per quanto riguarda questo particolare argomento su SO e sul web in generale e la maggior parte, se non tutto il codice è come si vede qui sottoPresentazione di un modulo pagina web utilizzando il controllo WebBrowser in 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; 
     } 
    } 
} 

Il codice non ha errori di sorta se non per la vita che non presenta. La pagina di esempio che sto usando ha un pulsante semplice, quello che fa, avvisa la selezione del pulsante di opzione e quindi invia il modulo. Per qualche strano motivo quando il modulo viene inviato tramite codice utilizzando il controllo WebBrowser, il modulo viene inviato ma l'avviso non viene mai visualizzato.

Non sono sicuro di cosa sto facendo male qui. Qualsiasi aiuto su questo sarebbe apprezzato.

+0

Posso chiedere perché stai provando a fare questo? –

+0

Come hai agganciato l'evento, e per cosa? –

+1

@Matti, sto provando ad automatizzare una procedura di login su una rete interna che non ha l'opzione remember me. – vikramjb

risposta

6

Effettuando un clic sul pulsante, fare ciò che è necessario fare? Dovrai aggiungere un riferimento COM alla libreria di oggetti HTML di Microsoft (che potresti già avere). Ad esempio, se si carica di Google nel controllo browser web, questo codice sarà posto "ciao mondo" nella casella di ricerca ed eseguire la ricerca:

 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: Ho aggiornato il codice per i componenti che il browser web WPF usi di controllo. Tieni inoltre presente che a volte genera un errore di script da Google, ma sembra che si tratti di un problema di temporizzazione basato su alcune delle chiamate ajax di google sulla home page.

+0

Il metodo All non sembra essere presente nel controllo webBrowser1. Mi sto perdendo qualcosa ? – vikramjb

+0

La proprietà .all è un membro del membro .Document della classe webbrowser. È disponibile da .net 2.0: http://msdn.microsoft.com/en-US/library/system.windows.forms.htmldocument.all(v=VS.80).aspx –

+0

Sto usando il controllo webBrowser in un progetto WPF e non vedo questo metodo da nessuna parte. Inoltre la proprietà del documento del controllo webBrowser sembra essere di tipo di dati Object. – vikramjb

4

Per risolvere il problema è necessario sostituire la linea:

form.submit(); 

Con seguente codice:

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

submitButton.click(); 

Questo mostrerà avviso sulla selezione degli utenti e presentare il modulo.

+0

Il pulsante di invio è un'immagine che richiama un JS per l'invio del modulo, motivo per cui ho creato form.submit. – vikramjb

+0

È possibile trovare un'immagine all'interno del modulo (nello stesso modo in cui l'ho fatto con il pulsante di invio) e quindi fare clic su di esso. Ti aiuterà, nel caso in cui la sceneggiatura che hai menzionato faccia qualcosa di più della semplice presentazione della forma. –

+0

Oleg la tua risposta era corretta ma da allora, ho provato prima il campione di john, gli ho dato la taglia. – vikramjb

1

Ho una più sporca one-liner di lavoro, iniettando un JavaScript per inviare il modulo

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

che è stato lavorato per me quando si interagisce con un sito utilizzando un sacco di Javascript e il pulsante oltre la forma .

+0

Una sola riga sporca, ma è l'unica risposta su questa pagina che ha funzionato per me. – colton7909

Problemi correlati