Maintenant pour piloter les navigateurs Web en VBA, il y a aussi Chromium Automation for VBA constitué de modules de classe VBA et qui permet de piloter les principaux navigateurs :
Il s'agit d'une méthode permettant d'automatiser directement les navigateurs Web basés sur Chromium, tels que Chrome, Edge et Firefox, à l'aide des applications VBA pour Office en suivant le cadre du protocole Chrome DevTools.
Cette méthode permet une automatisation directe avec les navigateurs Web basés sur Chromium pour VBA sans avoir besoin d'un logiciel tiers comme SeleniumBasic qui nécessite un driver pour le navigateur choisi. Le framework comprend également de nombreux exemples et fonctions utiles ajoutés au référentiel d'origine tout en gardant la conception globale aussi simple que possible pour vous aider à comprendre et à démarrer rapidement le déploiement du framework CDP pour vos solutions VBA.
Pour l'installation,
téléchargez Chromium-Automation-with-CDP-for-VBA :
1 - Cliquez dans Releases sur la dernière version (Latest) (exemple CDP Framework 2.7.4)
2 - Dans la fenêtre qui s'ouvre choisir pour le téléchargement dans Assets le fichier zip et extraire le fichier xlam qui se trouve dedans.
3 - Ouvrez ce fichier avec Excel.
4 - Dans l'éditeur VBA, copiez les classes CDPBrowser, CDPCore, CDPElement, CDPJConv dans votre projet VBA.
5 - Assurez vous que votre projet dispose d’une référence Microsoft Scripting Runtime ( Outils/Références cocher la référence).
Voici un exemple avec des commentaires en français pour piloter google maps à partir de MS Edge afin de trouver un itinéraire entre deux adresses et afficher les résultats dans la fenêtre d'exécution VBA :
Par défaut quand on utilise l'objet CDPBrowser des messages de debug sont affichés dans la fenêtre d'exécution du VBA et sont générés dans un fichier log qui se trouve dans un répertoire Logs à l'endroit où se trouve le classeur source :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Public Function TrajetGoogleMaps(AdresseDépart As String, AdresseArrivée As String, _ Optional CacherGoogleMaps As Boolean = False) As Long '------------------------------------------------------------------------------- ' Ouvre Google Maps sur le calcul du trajet des adresses passées en arguments. '------------------------------------------------------------------------------- Dim objBrowser As New CDPBrowser Dim listeTrajets As Collection Dim trajet As CDPElement Dim result On Error Resume Next 'on lance MS EDGE objBrowser.start "edge", cleanActive:=True, reAttach:=True ' on peut cacher le navigateur If CacherGoogleMaps Then objBrowser.hide objBrowser.navigate ("https://www.google.fr/maps/dir/") objBrowser.wait till:="interactive" 'envoi de l'adresse de départ dans sa zone de saisie dans la page objBrowser.getElementByXPath("//input[@aria-controls='sbsg50']").value = AdresseDépart 'envoi de l'adresse de destination dans sa zone de saisie dans la page objBrowser.getElementByXPath("//input[@aria-controls='sbsg51']").value = AdresseArrivée 'Clic sur le bouton qui correspond à un trajet en voiture objBrowser.getElementByXPath("//button/img[@data-tooltip='Voiture']").click ' Attente des résultats affichage des différentes propositions objBrowser.getElementByXPath("//div[@data-trip-index]").onExist Set listeTrajets = objBrowser.getElementsByXPath("//div[@data-trip-index]") Debug.Print "========== Résultats ==============" For Each trajet In listeTrajets Debug.Print trajet.innerText Debug.Print "========================" Next 'Clic sur la section du premier résultat en attendant son apparition objBrowser.getElementByID("section-directions-trip-0").onExist.click 'Récupération du texte qui donne le temps et le kilométrage du trajet en attendant son apparition result = objBrowser.getElementByXPath("//div[@class='TGDfee']").onExist.innerText Debug.Print "Premier trajet : " + result objBrowser.quit Set trajet = Nothing: Set listeTrajets = Nothing: Set objBrowser = Nothing End Function Sub TestTrajet() TrajetGoogleMaps "22 rue Cassette, 75006, Paris", "Bordeaux", False End Sub
Exemple :
Si on ne veut pas avoir ce comportement, c'est à dire ne pas avoir les messages de debug, faire ceci dans le module de classe CDPBrowser:----------------------------------------------------------------------------------------------------
New Browser Session Started
----------------------------------------------------------------------------------------------------
07:15:07 | BRID575 | cleanUpSessions completed and previous CdpSessionID removed
07:15:07 | BRID575 | setCrashStateNormal completed
07:15:07 | BRID575 | CDPCore initialized successfully
07:15:07 | BRID575 | Now looking for the browser window
07:15:07 | BRID575 | Now attaching CDP pipes to the browser session
07:15:07 | BRID575 | Successfully attached to Session ID C8A5B5F7E850B993432E1CB4E59A03F7
Au début du code de la classe CDPBrowser ajouter une constante. Exemple :
et dans ce module au début de la fonction printMsg ajouter ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Private Const DebugMode = False
On pourrait aussi modifier cette fonction de façon à n'avoir par exemple que les messages dans le fichier de log.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Public Function printMsg(strMsg As String, Optional isHeader As Boolean = False, Optional doRaiseError As Boolean = False) If Not DebugMode Then Exit Function
Ami calmant, J.P
Partager