Meilleur auteur de réponses
webBrowser (2/3) comment charger une autre page par clique sur hyperlien ?

Question
-
Bonjour,
Question 2/3, depuis webBrowser1 qui affiche une page Internet, je cherche comment lancer une autre page dans le même navigateur personnel (objet de la troisième question), donc à lancer une seconde page en remplacement de la première en clique sur un hyperlien de cette dernière.
On m'a transmis des liens de code (Patrice), mais je ne sais les exploiter et encore moins les comprendre, voici ce que ça dit, mais ça ne doit pas être complet :Function GetTableRowCount(ByVal TableID As String) As Integer ' charger une page Web avec une TABLE dont l'attribut ID est Table1 ' Invoke() ' System.Windows.Forms.HtmlElement() ' http://msdn.microsoft.com/fr-fr/library/system.windows.forms.htmldocument.getelementbyid.aspx Dim Count As Integer = 0 If (WebBrowser1.Document IsNot Nothing) Then Dim TableElem As System.Windows.Forms.HtmlElement = WebBrowser1.Document.GetElementById(TableID) If (TableElem IsNot Nothing) Then For Each RowElem As System.Windows.Forms.HtmlElement In TableElem.GetElementsByTagName("TR") Count = Count + 1 Next Else Throw (New ArgumentException("No TABLE with an ID of " & TableID & " exists.")) End If End If GetTableRowCount = Count End Function
Deux questions :
-1- Le seul problème, il est de taille, et que je ne sais ni ou ni comment charger une table ayant pour ID "Table1" en appelant mon lien ?
-2- Je ne sais pas non plus ensuite appeler la fonction avec Invoke, et d'où et à quel moment ?Voici mon code en entier, ça peut servir, étant entendu que deux fontions et procédures ne tournent pas (favoris et appel autre page (fonction)).
' browser form1 Option Explicit On Public Class Form1 Dim pic As Byte ' timer Dim z As Int32 = 100 ' zoom Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TextBox1.Text = "http://irolog.free.fr" TextBox1.Text = "http://reservoblige.free.fr" WindowState = 2 ' = maximum (fixe) Call Button5_Click(sender, e) ' go End Sub Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize If WindowState = 1 Then Exit Sub ' réduit en barre de tâche If Me.Height < 100 Then Me.Height = 100 If Me.Width < 200 Then Me.Width = 250 If SplitContainer1.SplitterDistance < Button1.Top + Button1.Height + 1 Then SplitContainer1.SplitterDistance = Button1.Top + Button1.Height + 1 End If SplitContainer1.SplitterDistance = Button1.Top + Button1.Height + 1 Button1.Left = 1 Button2.Left = Me.Width - (Button2.Width + 17) ' 17 = bordures Button5.Left = Button2.Left - (1 + Button2.Width) TextBox1.Left = Button1.Left + Button1.Width + 1 TextBox1.Width = (Button5.Left - +1) - TextBox1.Left End Sub Sub WebBrowser1_Navigating(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating pic = 1 Timer1.Enabled = True ' cherche End Sub Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted TextBox1.Text = WebBrowser1.Url.ToString() ' chargé Timer1.Enabled = False ' trouvé End Sub Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Select Case pic ' terre qui tourne sur bouton Go Case 1 : Button5.Image = My.Resources.t2 Case 2 : Button5.Image = My.Resources.t3 Case 3 : Button5.Image = My.Resources.t4 Case 4 : Button5.Image = My.Resources.t5 Case 5 : Button5.Image = My.Resources.t1 End Select pic = pic + 1 If pic = 6 Then pic = 1 End Sub Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown If (e.KeyCode = Keys.Enter) Then WebBrowser1.Navigate(TextBox1.Text) ' <rc> dans texteBox End Sub Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click WebBrowser1.GoBack() ' retour End Sub Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ContextMenuStrip1.Show(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y) ContextMenuStrip1.Visible = True End Sub Sub RafraîchirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RafraîchirToolStripMenuItem.Click WebBrowser1.Refresh() ' rafraîchit End Sub Sub StopToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopToolStripMenuItem.Click WebBrowser1.Stop() ' ' stop rechercher End Sub Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click WebBrowser1.Navigate(TextBox1.Text) ' go End Sub Sub ZoomToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZoomToolStripMenuItem.Click ' zoom Dim r As String r = InputBox("Régler le zoom entre 25 et 400" & vbLf & vbLf & "Zoom actuel : " & z, "Réglage du zoom", "") If Len(Trim(r)) < 2 Or Len(Trim(r)) > 3 Then Exit Sub Try z = Val(r) ' z = as int32 (global) z = Fix(z) If z < 25 Or z > 400 Then Exit Sub Catch ex As Exception Exit Sub End Try WebBrowser1.ActiveXInstance.ExecWB(63, 0, CInt(z)) End Sub Sub ChercherToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChercherToolStripMenuItem.Click WebBrowser1.ActiveXInstance.ExecWB(32, 0) ' chercher End Sub Sub FavorisToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavorisToolStripMenuItem.Click ' favoris MsgBox("future gestion de l'appel des favoris") Dim shelluihelper As Object = New ShellUIHelper() <ComImport(), Guid("64AB4BB7-111E-11D1-8F79-00C04FC2FBE1")> _ ShellUIHelper.ShowBrowserUI("OrganizeFavorites", 0) If shelluihelper IsNot Nothing AndAlso System.Runtime.InteropServices.Marshal.IsComObject(shelluihelper) Then System.Runtime.InteropServices.Marshal.ReleaseComObject(shelluihelper) End If End Sub Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing WebBrowser1.Dispose() ' libère End End Sub Function GetTableRowCount(ByVal TableID As String) As Integer ' System.Windows.Forms.HtmlElement() ' http://msdn.microsoft.com/fr-fr/library/system.windows.forms.htmldocument.getelementbyid.aspx ' charger une page Web avec une TABLE dont l'attribut ID est Table1 ' Invoke() Dim Count As Integer = 0 If (WebBrowser1.Document IsNot Nothing) Then Dim TableElem As System.Windows.Forms.HtmlElement = WebBrowser1.Document.GetElementById(TableID) If (TableElem IsNot Nothing) Then For Each RowElem As System.Windows.Forms.HtmlElement In TableElem.GetElementsByTagName("TR") Count = Count + 1 Next Else Throw (New ArgumentException("No TABLE with an ID of " & TableID & " exists.")) End If End If GetTableRowCount = Count End Function End Class ' form1 'Public Class ShellUIHelper 'End Class
En vous remerciant de donner des exemples testés, merci beaucoup, cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Modifié EhJoe mardi 1 février 2011 12:11 correction 1
Réponses
-
Le problème est que cette page utilise sur les liens target="_blank" ce qui demande explictement l'ouverture de ce lien dans une nouvelle fenêtre. J'ai fait un test avec une page comme :
<html> <body> <a href="http://www.microsoft.com/" target="_blank" id="ms">Microsoft</a> </body> </html>
pour simuler ce comportement.
Donc quand je clique cela ouvre effectivement une nouvelle fenêtre. Je peux supplanter ce comportement avec :
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted For Each element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("A") If Not element.GetAttribute("target") Is Nothing Then element.SetAttribute("target", "_self") End If Next End Sub
Donc quand le document est récupéré je parcours tous les liens et si un attribut target est présent, je le remplace par _self ce qui ouvrira la nouvelle page dans la même fenêtre. Cela pourrait suffire dans ce cas précis.
Généralement il reste quand même préférable d'afficher des pages sur lesquels on a le contrôle (par exemple une page pourrait lancer une nouvelle fenêtre via script et ce comportement serait plus compliqué à gérer).
J'ai lu la question 3/3 en diagonale mais en première lecture j'ai l'impression que c'est le même problème que celui là ?
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".- Marqué comme réponse EhJoe mercredi 2 février 2011 10:25
-
A partir de l'évènement NewWindow (celui qui génère l'ouverture dans IE) on peut obtenir l'élement actif ainsi que le lien cliqué pour l'ouvrir dans le webbrowser et annuler l'ouverture dans IE :
Pas entièrement testé mais à priori pour l'exemple avec reservoblige ça fonctionne !Private Sub WebBrowser1_NewWindow(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles WebBrowser1.NewWindow Dim elementActif As HtmlElement = WebBrowser1.Document.ActiveElement 'on obtient l'element actif WebBrowser1.Navigate(elementActif.GetAttribute("href")) 'on obtient le lien de cet élément, on navigue vers ce lien e.Cancel = True 'on annule l'ouverture dans IE End Sub
N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.- Marqué comme réponse Patrice ScribeMVP, Moderator mardi 1 février 2011 18:53
-
Bonjour Michel,
Tout d'abord un grand merci.
En fait la méthode fonctionne en effet avec le lien utilisé (reservoblige) mais pas si par exemple j'appelle "Google.fr" qui s'affiche, mais si ensuite je clique sur un lien, là ça blante et ça écrit dans la barre d'adresse "About-blank" et rien à l'écran, or il devrait y avoir la page du lien ...
Je pense que je vais arrêter là, car à l'origine c'était sur conseil pour améliorer une application de recherche de lien que je m'y suis mis, avec le souvenir sur vb6 que c'était un truc infernal, la preuve. Dans mon application de recherche de lien ça fonctionne désormais très bien (pour le moment), mais je passe directement le lien au browser via une form qui sert de variable numérique au élément numériques des liens, donc aucun risque de se planter réelllement. Suite à ça j'ai voulu tenter de faire mon browser car ça évite les pertes en hauteur d'image, ça va plus vite, etc... Mais bon ... faut se rendre à l'évidence, c'est trop compliqué, trop long à mettre en oeuvre, les fonctions sont difficiles à identifier et en anglais, alors je pense que je vais laisser tomber, tant pis, je n'en ai pas un besoin absolu, je crois que le browser est davantage utilisable ponctuellement dans une application pour une tâche déterminée, mais que si on veut faire son browser personnel c'est une autre paire de manches.
Je vais voir ce que donne, ce que propose "Patrice", et selon je verrais si je poursuis ?
Encore chaleureusement merci.
Cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Marqué comme réponse EhJoe mercredi 2 février 2011 10:25
-
Bonjour Patrice et merci beaucoup, ton code :
Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted TextBox1.Text = WebBrowser1.Url.ToString() ' chargé Timer1.Enabled = False ' trouvé For Each element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("A") ' Patrice If Not element.GetAttribute("target") Is Nothing Then element.SetAttribute("target", "_self") Next End Sub
Ce code affiche mieux, je suis resté dans mon browser sauf qu'il laisse passer les fenêtres popup (pub)... ce qui ouvre néanmoins l'IE, ce qui entraine une autre gestion, ça ne fini jamais, chaque élément en implique un autre ...
Je vais laisser tomber ça je pense car en fait la documentation souvent en anglais n'est pas aisée, et les fonctions du browser sont trop limitées, j'ai peur de ne pas y arriver ou d'y passer un mois (ça fait déjà une semaine), hors je ne veux pas vous faire perdre votre temps (ni le mien), je crois que le browser est davantage performant pour compléter une application personnelle qu de réaliser son propre explorer, d'ailleurs dans mon application qui change les liens numériques il fonctionne très bien.
Donc je laisse tomber la tentative de réaliser un vrai browser, on rame de trop, il est trop incomplet pour y arriver raisonnablement.
Je te remercie beaucoup de ton aide, cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Marqué comme réponse EhJoe mercredi 2 février 2011 10:25
Toutes les réponses
-
Je ne suis toujours pas sûr de bien comprendre ce que tu veux dire. Si on clique sur un lien affiché dans le webbrowser, le comportement de base est de remplacer la page précédente par la nouvelle comme dans un navigateur normal. Donc rien de spécial à faire. Si le problème est que lorsqu'on clique sur un lien de la page on veut ouvrir une autre page que celle indiquée dans le lien cela donne :
Private Sub WebBrowser1_Navigating(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating If e.Url.ToString = "http://www.microsoft.com/" Then WebBrowser1.Navigate("http://www.oracle.com/") End If End Sub
Donc si l'utilisateur clique dans la page vers un lien allant vers http://www.microsoft.com/ c'est la page http://www.oracle.com/ qui va s'ouvrir dans le webbrowser.
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered". -
Patrice, j'ai compris où tu ne comprenais pas :o)
Ce serait mieux si tu avais le programme, je t'envoies si tu veux, tu peux me donner ton adresse, la mienne en bas de ma signature ...
En fait, si tu cliques sur un hyperlien internet d'une adresse de "site" différente du site appelé sur lequel est l'hyperlien, ben ça ouvre l'IE et ça lui envoie le lien, n'est-ce pas clair désormais ?
Exemple
J'appelle avec mon browser en premier http://irolog.free.fr (sous entendu ici = index.htm ou html), ça ouvre, ok
Puis, depuis cette page en cliquant sur une photo hyperlien internet j'appelle l'adresse qui suit : http://irolog.free.fr/irolog_vente/tarot4_v/tarot4.htm ça ouvre, ok, car c'est la même adresse de base "irolog.free.fr"
MAIS
Si en premier j'appelle cette page : http://reservoblige.free.fr/ ça marche évidemment, mais si ensuite en cliquand sur un des hyprlien j'appelle cette autre page : http://www11.minefi.gouv.fr/boi/boi2005/13rcpub/textes/13i1005/13i1005.pdf ÇA NE MARCHE PLUS, c'est Internet Explorer qui s'ouvre CAR :
irolog.free.fr est différent de 11.minefi.gouv.fr
C'est comme si on lui demandait d'ouvrir dans un second explorer (mais pas le mien hélas, l'IE reprend la main par défaut), sauf que je ne gère pas ça, pas encore, c'est l'objet de ma question 3 du forum ...
Maintenant je crois que tout va être au diapason, c'est pourquoi j'ai besoin de récupérer l'hyperlien cliqué afin de le repasser dans NAVIGATE, comprends-tu :o) ?
Bon, je te laisse la plume, cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire -
Le problème est que cette page utilise sur les liens target="_blank" ce qui demande explictement l'ouverture de ce lien dans une nouvelle fenêtre. J'ai fait un test avec une page comme :
<html> <body> <a href="http://www.microsoft.com/" target="_blank" id="ms">Microsoft</a> </body> </html>
pour simuler ce comportement.
Donc quand je clique cela ouvre effectivement une nouvelle fenêtre. Je peux supplanter ce comportement avec :
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted For Each element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("A") If Not element.GetAttribute("target") Is Nothing Then element.SetAttribute("target", "_self") End If Next End Sub
Donc quand le document est récupéré je parcours tous les liens et si un attribut target est présent, je le remplace par _self ce qui ouvrira la nouvelle page dans la même fenêtre. Cela pourrait suffire dans ce cas précis.
Généralement il reste quand même préférable d'afficher des pages sur lesquels on a le contrôle (par exemple une page pourrait lancer une nouvelle fenêtre via script et ce comportement serait plus compliqué à gérer).
J'ai lu la question 3/3 en diagonale mais en première lecture j'ai l'impression que c'est le même problème que celui là ?
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".- Marqué comme réponse EhJoe mercredi 2 février 2011 10:25
-
A partir de l'évènement NewWindow (celui qui génère l'ouverture dans IE) on peut obtenir l'élement actif ainsi que le lien cliqué pour l'ouvrir dans le webbrowser et annuler l'ouverture dans IE :
Pas entièrement testé mais à priori pour l'exemple avec reservoblige ça fonctionne !Private Sub WebBrowser1_NewWindow(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles WebBrowser1.NewWindow Dim elementActif As HtmlElement = WebBrowser1.Document.ActiveElement 'on obtient l'element actif WebBrowser1.Navigate(elementActif.GetAttribute("href")) 'on obtient le lien de cet élément, on navigue vers ce lien e.Cancel = True 'on annule l'ouverture dans IE End Sub
N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Cordialement.- Marqué comme réponse Patrice ScribeMVP, Moderator mardi 1 février 2011 18:53
-
Bonjour Michel,
Tout d'abord un grand merci.
En fait la méthode fonctionne en effet avec le lien utilisé (reservoblige) mais pas si par exemple j'appelle "Google.fr" qui s'affiche, mais si ensuite je clique sur un lien, là ça blante et ça écrit dans la barre d'adresse "About-blank" et rien à l'écran, or il devrait y avoir la page du lien ...
Je pense que je vais arrêter là, car à l'origine c'était sur conseil pour améliorer une application de recherche de lien que je m'y suis mis, avec le souvenir sur vb6 que c'était un truc infernal, la preuve. Dans mon application de recherche de lien ça fonctionne désormais très bien (pour le moment), mais je passe directement le lien au browser via une form qui sert de variable numérique au élément numériques des liens, donc aucun risque de se planter réelllement. Suite à ça j'ai voulu tenter de faire mon browser car ça évite les pertes en hauteur d'image, ça va plus vite, etc... Mais bon ... faut se rendre à l'évidence, c'est trop compliqué, trop long à mettre en oeuvre, les fonctions sont difficiles à identifier et en anglais, alors je pense que je vais laisser tomber, tant pis, je n'en ai pas un besoin absolu, je crois que le browser est davantage utilisable ponctuellement dans une application pour une tâche déterminée, mais que si on veut faire son browser personnel c'est une autre paire de manches.
Je vais voir ce que donne, ce que propose "Patrice", et selon je verrais si je poursuis ?
Encore chaleureusement merci.
Cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Marqué comme réponse EhJoe mercredi 2 février 2011 10:25
-
Bonjour Patrice et merci beaucoup, ton code :
Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted TextBox1.Text = WebBrowser1.Url.ToString() ' chargé Timer1.Enabled = False ' trouvé For Each element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("A") ' Patrice If Not element.GetAttribute("target") Is Nothing Then element.SetAttribute("target", "_self") Next End Sub
Ce code affiche mieux, je suis resté dans mon browser sauf qu'il laisse passer les fenêtres popup (pub)... ce qui ouvre néanmoins l'IE, ce qui entraine une autre gestion, ça ne fini jamais, chaque élément en implique un autre ...
Je vais laisser tomber ça je pense car en fait la documentation souvent en anglais n'est pas aisée, et les fonctions du browser sont trop limitées, j'ai peur de ne pas y arriver ou d'y passer un mois (ça fait déjà une semaine), hors je ne veux pas vous faire perdre votre temps (ni le mien), je crois que le browser est davantage performant pour compléter une application personnelle qu de réaliser son propre explorer, d'ailleurs dans mon application qui change les liens numériques il fonctionne très bien.
Donc je laisse tomber la tentative de réaliser un vrai browser, on rame de trop, il est trop incomplet pour y arriver raisonnablement.
Je te remercie beaucoup de ton aide, cordialement.
Joseph Attila PUSZTAY
EhJoe Logiciels Romans Ecrire- Marqué comme réponse EhJoe mercredi 2 février 2011 10:25