WebBrowser et autres solutions
Bonjour à vous et merci de vos contributions,
J'accéde à un site web dont la page d'accueil intégre une fonction recherche.
J'interagis avec cette page en donnant:
le nom du champs : "pattern" contenant le code à rechercher: FR0000050809
la fonction à éxecuter pour lancer la recherche: "$$event_minisearch"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
' creation du controle, mise en place du hanndler pour détecter la fin de reception d'une page
page_info = New System.Windows.Forms.WebBrowser
AddHandler page_info.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf page_recue)
' pour ce site définir l'url, le champs contenet la donnée à rechercher, le nom de l'évènement à activer
page_info.Navigate("https://www.mon_serveur.fr/")
champs_recherche = "pattern"
evenement_execute = "$$event_minisearch"
' placer la demande page pour ce site, attendre la fin de la réception
page_info_completed = False
nb_tentatives = 0
Navigation()
' si le handler a détecté la fin de réception de la page, page_info_completed = True
While page_info_completed = False And nb_tentatives < nb_time_slice_for_web_request
nb_tentatives = nb_tentatives + 1
System.Threading.Thread.Sleep(time_slice_for_web_request)
Application.DoEvents()
End While
' sortie en échec, message d'erreur, abandon de le recherche
If nb_tentatives = nb_time_slice_for_web_request Then
MessData(0) = serveur
Afficher_le_Message("erreur80111erreur, impossible d'accéder au serveur ##")
Else
' sinon, charger le champs recherche avec le code ISIN, executer la recherche
page_info.Document.GetElementById(champs_recherche).InnerText = code_isin_recherche
For Each element As HtmlElement In page_info.Document.GetElementsByTagName("input")
If element.Name = evenement_execute Then
element.InvokeMember("click")
Exit For
End If
Next
End if
' la page est reçue, les données attendues sont extraites, OK |
Par contre cette solution est trés lente, alors que je ne visualise pas la page et ne navigue pas, d'où le souhait de ne plus utiliser WebBrowser mais HttpWebRequest, de lire le stream recu, de le transformer en document....
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
' données utilisées par la demande et le décodage de la page html, du cours et de sa date
Dim Demande As System.Net.HttpWebRequest, Reponse As System.Net.HttpWebResponse, url As String
Dim iDocument As MSHTML.IHTMLDocument2 = New MSHTML.HTMLDocumentClass
' pour ce site définir l'url, le champs contenet la donnée à rechercher, le nom de l'évènement à activer
url = "https://www.mon_serveur.fr/"
champs_recherche = "pattern"
evenement_execute = "$$event_minisearch"
' faire la demande de page
While nb_tentatives < nb_max_tentatives
Demande = WebRequest.Create(url)
Demande.Timeout = 20000
' lecture de la page reçue
Reponse = Demande.GetResponse()
If Reponse.StatusCode = HttpStatusCode.OK Then
Dim reader As New StreamReader(Reponse.GetResponseStream())
' de la chaîne de caratéres reçues, établir l'HTML
iDocument.open()
iDocument.write(reader.ReadToEnd)
reader.Close()
Reponse.Close()
Exit While
End If
End While
' charger le champs recherche avec le code ISIN, executer la recherche
iDocument.getElementById(champs_recherche).innerText = code_isin_recherche
For Each element As HtmlElement In iDocument.getElementsByTagName("input")
If element.Name = evenement_execute Then
element.InvokeMember("click")
Exit For
End If
Next |
la page est bien reçue, le champs "pattern" semble trouvé (? pas de message d'erreur, le document récupéré) par contre impossible d'effectuer la recherche per getElementByTagName
voici le message d'erreur reçu:
Impossible d'effectuer un cast d'un objet COM de type 'System_ComObject' en type de classe 'Sytem.Windows.Forms.HtmlElement. Les instances de type qui représentent les composants COM ne peuvent pas être castées en type différents représentant des composants COM; toutefois, elles peuvent être castées en interfaces tant que le composant COM sous-jacent prend en charge les appels QueryInterface pour l'ID de.....
et voilà pourquoi votre fille est muette!!
Comment accéder à la page avec les performances de HttpRequest, accéder à sa forme Document pour pouvoir carger des données et exécuter du code contenu dans cette page.
Un grand merci pour votre aide
A+