Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
DineInformatique
26 mars 2012

Utilisation du WebBrowser (WPF)

Depuis quelques jours je travaille avec le composant WebBrowser (WPF). Je vais donc partager ici quelques infos sur son utilisation (ça ne m'a pas paru très instinctif, et il m'a fallu faire pas mal de recherches sur le net).

Premier point : indiquer une adresse html à mon webbrowser et ! ne pas afficher les erreurs de script que peut contenir le site... 


Indiquer le site à afficher est très simple  : wbSite.Source = new Uri("http://monUri.com");
Là où ça se complique, ce sont les erreurs de script. En effet, même si en naviguant cela reste relativement invisible à l'utilisateur, de nombreux sites contiennent de petites erreurs de script (qui n'empêchent pas leur fonctionnement pour autant). Le souci est que le webBrowser affiche une belle fenêtre popup à chaque erreur rendant la navigation très pénible. J'ai donc cherché (non sans mal de tête...) une solution pour éviter ces popups intempestives ! Et j'ai trouvé (merci google, je ne suis pas assez calée pour coder ça toute seule...) : je vous partage donc la solution :

On créé une méthode utilisant la reflexion (je n'ai pas encore saisi toutes les subtilités de la méthode, alors je ne m'étale pas trop...)

public void HideScriptErrors(WebBrowser wb, bool Hide)
{

FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);

if (fiComWebBrowser == null) return;


object objComWebBrowser = fiComWebBrowser.GetValue(wb);


if (objComWebBrowser == null) return;

objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide });

}


On appelle ensuite cette méthode dans l'évènement Navigated du WebBrowser

 

private void webBrowserExemple_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
    HideScriptErrors(wbSite, true);
}


Et voilà les popups d'erreurs javascript ne s'affichent plus ! Ouf !


Deuxième point : Récupérer le contenu web affiché par le webBrowser


Beaucoup plus simple ! Mais pas si intuitif non plus...Mon but est de récupérer le contenu de la page web affichée dans mon composant webBrowser et de parser le html pour y récupérer des informations.

Le contenu est accessible depuis la propriété Document du composant webBrowserExemple.Document.
Cependant le type de cette propriété est "inconnu". Tout ce que l'on peut voir par l'espion de Visual Studio est que c'est un objet de type System__ComObject...Ah ben oui on va aller loin. Mais pas de panique ! C'est tout bêtement une page web, ça je le sais puisque c'est moi qui le gère. Donc après quelques recherches, je trouve que c'est un HTMLDocument. Pour pouvoir utiliser ce type d'objet COM, il faut ajouter la dll Microsoft HTML (MSHTML).  

On peut donc ainsi travailler avec le type HTMLDocument 
MSHTML.HTMLDocument pageWeb =(MSHTML.HTMLDocument) webBrowserExemple.Document;
Pour récupérer les éléments de la page Html, on peut utiliser différentes méthodes, comme getElementById, qui retourne l'élément correspondant à l'id passé en paramètre: exemple.Titre = pageWeb.getElementById("grand_titre").innerHTML; 

Pour récupérer les éléments par Classe, on utilise la méthode getElementsByClass. Or cette méthode retourne une collection particulière : IHTMLElementCollection liste = page.getElementsByClassName("NomDeClasse"); 

Si l'on souhaite alors récupérer le premier élément de la liste et son contenu :
IHTMLElement elem = (IHTMLElement)liste.item(0, null); 
return elem.innerText;

Je n'ai pas encore fini d'explorer le type HTMLDocument, mais c'est un début :-)


 

Publicité
Publicité
Commentaires
DineInformatique
Publicité
Archives
Publicité