Logo

Il controllo WebBrowser in C#


Visual Studio fornisce con un controllo WebBrowser pronto all'uso, che consente di ospitare un browser Web completo all'interno dell'applicazione. Il controllo WebBrowser è in realtà solo una shell attorno a una versione ActiveX di Internet Explorer, ma poiché questa è una parte integrata di Windows, l'applicazione dovrebbe funzionare su tutti i computer Windows senza richiedere l'installazione di componenti aggiuntivi. Ovviamente è una versione non più aggiornata rispetto ai browser che troviamo ora sui nostri computer e può succedere che il risultato della visualizzazione non sia come ci si aspetterebbe. Detto ciò per semplici compiti è una valido aiuto.
Dopo aver creato un nuovo progetto Windows Forms, è sufficiente trascinare sulla superficie del designer il controllo WebBrowser: si vedrà un'area totalmente bianca in quanto ancora non contiene nessuna pagina.
Vediamo ora alcuni membri utili ad utilizzare al meglio il controllo:
  • Document : rappresenta un oggetto di tipo HtmlDocument contenente tutte le informazioni sulla pagina
  • DocumentStream : permette di leggere la pagina web come da un file (oggetto System.IO.Stream)
  • DocumentText : ottiene o imposta il contenuto HTML della pagina visualizzata nel controllo WebBrowser
  • DocumentTitle : rappresenta il titolo del documento
  • DocumentType : si ottiene il tipo del documento
  • CanGoBack : determina se sia possibile tornare indietro nella cronologia delle pagine
  • CanGoForward : determina se sia possibile andare avanti nella cronologia delle pagine
  • GoBack : per tornare indietro alla pagina precedente
  • GoForward : per muoversi alla pagina successiva
  • IsBusy : indica se il controllo sta caricando un nuovo documento
  • IsOffline : indica se il controllo è in modalità offline (sta processando pagine web su disco fisso)
  • Navigate (url) : apre la pagina referenziata dall'indirizzo url
  • Print : stampa il documento aperto con i settaggi impostati della stampante corrente
  • ReadyState : restituisce lo stato del controllo che può essere Complete (pagina completa), Interactive , Loaded (il documento è caricato e inizializzato, ma non tutti i dati sono ancora stati ricevuti), Loading (il documento è in caricamento) e Uninitialized (nessun documento è stato aperto)
  • Url : restituisce un oggetto Uri rappresentante l'indirizzo della pagina caricata
WebBrowser1.Navigate("https://www.fdonet.com");
'oppure
WebBrowser1.Navigate("about:blank");
Vediamo ora un esempio più completo
private void EseguiQualcosa()
    {
        paginacaricata = false;
Uri myUri = new Uri("https://www.fdonet.com"); // oppure "file:///c:/esempio.html" WebBrowser1.Url = myUri;
while (!(paginacaricata == true)) Application.DoEvents(); }
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return;
if (e.Url.AbsolutePath == "blank") return;
paginacaricata = true; }
È possibile accedere al Document Object Model (DOM) HTML attraverso
    WebBrowser1.Document();
    // Per esempio per ottenere il testo di una pagina web è sufficiente
    string TestoPerRicerca = WebBrowser1.Document.Body.InnerText;
Quando si usa DOM tramite il controllo WebBrowser, è consigliabile attendere sempre finché si verifica l'evento DocumentCompleted prima di provare ad accedere alla proprietà Document del controllo WebBrowser. L'evento DocumentCompleted viene generato dopo il caricamento dell'intero documento. Se si usa DOM prima che l'evento sia generato, si rischia di causare un'eccezione di runtime!
Il controllo WebBrowser in C#

Immaginiamo ora di voler accedere alla mail di Google in modo automatizzato attraverso il WebBrowser. Se noi ispezioniamo la pagina di login vedremo che ci sono 2 campi html <input> denominati "email" e "submit": la prima è una casella di testo dove dovremo inserire la nostra mail mentre il secondo è il pulsante di submit del form di login. Possiamo valorizzare la casella di testo e simulare il "click" del pulsante in questa maniera:
    paginacaricata = false;
    Uri myUri = new Uri("https://accounts.google.com/signin/v2/identifier?service=mail&flowName=GlifWebSignIn&flowEntry=ServiceLogin");
    WebBrowser1.Url = myUri;
while (!(paginacaricata == true)) Application.DoEvents();
if (!WebBrowser1.Document.GetElementById("Email") == null) { // verifico che sono effettivamente arrivato alla pagina di login (mi aspetto una input di nome Email) WebBrowser1.Document.GetElementById("Email").SetAttribute("value", "tuaemail@gmail.com"); paginacaricata = false; HtmlElementCollection elc = WebBrowser1.Document.GetElementsByTagName("input"); foreach (HtmlElement el in elc) { if (el.GetAttribute("type").Equals("submit")) el.InvokeMember("Click"); }
while (!(paginacaricata == true)) Application.DoEvents();
// quando la pagina successiva viene caricata seguo gli stessi passi per inserire la password e invocare il click del pulsante submit if (!WebBrowser1.Document.GetElementById("Password") == null) { WebBrowser1.Document.GetElementById("Password").SetAttribute("value", "tuapassword");
elc = WebBrowser1.Document.GetElementsByTagName("input"); foreach (HtmlElement el in elc) { if (el.GetAttribute("type").Equals("submit")) el.InvokeMember("Click"); }
WebBrowser1.Url = myUri; } }

Se voglio invece ottenere il testo di un controllo html posso usare la proprietà GetAttribute come in questo esempio
string testo = WebBrowser1.Document.GetElementById("Password").GetAttribute("value");


Fonte web: https://www.fdonet.com/programmazione/csharp/il-controllo-webbrowser-in-c-sharp.aspx