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 Sub EseguiQualcosa()
paginacaricata = False
Dim myUri As New Uri("https://www.fdonet.com") 'oppure "file:///c:/esempio.html"
WebBrowser1.Url = myUri
Do Until (paginacaricata = True)
Application.DoEvents()
Loop
'finchè non ha finito di caricare la pagina non proseguire
'...
End Sub
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If e.Url.AbsolutePath <> (TryCast(sender, WebBrowser)).Url.AbsolutePath Then Return
If e.Url.AbsolutePath = "blank" Then Exit Sub
paginacaricata = True
End Sub
È possibile accedere al
Document Object Model (DOM) HTML attraverso
WebBrowser1.Document
'Per esempio per ottenere il testo di una pagina web è sufficiente
Dim TestoPerRicerca as string = 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!
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
Dim myUri As New Uri("https://accounts.google.com/signin/v2/identifier?service=mail&flowName=GlifWebSignIn&flowEntry=ServiceLogin")
WebBrowser1.Url = myUri
Do Until (paginacaricata = True)
Application.DoEvents()
Loop
If Not WebBrowser1.Document.GetElementById("Email") Is Nothing Then
'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
Dim elc As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("input")
For Each el As HtmlElement In elc
If el.GetAttribute("type").Equals("submit") Then
el.InvokeMember("Click")
End If
Next
Do Until (paginacaricata = True)
Application.DoEvents()
Loop
'quando la pagina successiva viene caricata seguo gli stessi passi per inserire la password e invocare il click del pulsante submit
If Not WebBrowser1.Document.GetElementById("Password") Is Nothing Then
WebBrowser1.Document.GetElementById("Password").SetAttribute("value", "tuapassword")
elc = WebBrowser1.Document.GetElementsByTagName("input")
For Each el As HtmlElement In elc
If el.GetAttribute("type").Equals("submit") Then el.InvokeMember("Click")
Next
WebBrowser1.Url = myUri
End If
End If
Se voglio invece ottenere il testo di un controllo html posso usare la proprietà GetAttribute come in questo esempio
dim testo as string = WebBrowser1.Document.GetElementById("Password").GetAttribute("value")