IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Pilotage de navigateurs Web (Chrome, Edge, Firefox) en VBA en utilisant le protocole CDP


Sujet :

Contribuez

  1. #1
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 210
    Par défaut Pilotage de navigateurs Web (Chrome, Edge, Firefox) en VBA en utilisant le protocole CDP
    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 :
    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
    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 :
    Exemple :
    ----------------------------------------------------------------------------------------------------
    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
    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:
    Au début du code de la classe CDPBrowser ajouter une constante. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Private Const DebugMode = False
    et dans ce module au début de la fonction printMsg ajouter ceci :
    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
    On pourrait aussi modifier cette fonction de façon à n'avoir par exemple que les messages dans le fichier de log.




    Ami calmant, J.P

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 021
    Par défaut
    Bonjour,
    Merci pour l'information.

    J'ai testé avec Edge et ça marche bien, sauf que je dois utiliser l'argument "cleanActive:=True" soit la ligne de commande :
    objBrowser.start "edge", cleanActive:=True, reAttach:=True
    Or cela ferme la session existante pour en ouvrir une nouvelle, donc je perds le site préalablement consulté.
    Et Avec "cleanActive:=False" impossible d'activer l'Url voulu.

    Deux questions :
    1) Comment faire pour ouvrir une nouvelle page dans la même session et la manipuler ?
    2) Je n'ai pas trouvé de documentation sur les fonctions de la classe CDPBrowser, où en trouver une (je pense à newTab, getTab, closeTab) ?

    Merci.

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 210
    Par défaut
    Citation Envoyé par laurent_ott Voir le message
    Deux questions :
    1) Comment faire pour ouvrir une nouvelle page dans la même session et la manipuler ?
    2) Je n'ai pas trouvé de documentation sur les fonctions de la classe CDPBrowser, où en trouver une (je pense à newTab, getTab, closeTab) ?
    Hello,
    Pour le 1 voici un exemple qui manipule deux onglets :
    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
    Sub MultiTabs()
    Dim objBrowser As New CDPBrowser, fen1 As New CDPBrowser, fen2 As New CDPBrowser, oElem As CDPElement
        'on lance MS EDGE
     objBrowser.Start "edge", cleanActive:=True, reAttach:=True
     Set fen1 = objBrowser
     fen1.navigate "https://www.developpez.com/", isInteractive
     objBrowser.Sleep 5
     Set fen2 = objBrowser.newTab(newWindow:=False)
     fen2.navigate "https://www.developpez.net/forums/f542/logiciels/microsoft-office/excel/"
     Set oElem = fen2.getElementByXPath("(//div[@class='forumrow'])[last()]//a[2]").onExist(5)
     objBrowser.Sleep 5
     oElem.click
     objBrowser.Sleep 10
     fen2.closeTab
     objBrowser.Sleep 2
     objBrowser.quit
     Set objBrowser = Nothing
    End Sub
    Pour le 2 il n' y a pas de documentation, dans la demo il y a quelques exemples, sinon il faut aller inspecter les classes ou faire des essais. De temps en temps je mets du code dans des forums qui peut servir (par exemple le code ci-dessus).

    [EDIT] L'exemple avec GoogleMaps ne fonctionne plus chez moi, il faut faire la modification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      '  objBrowser.getElementByXPath("//button/img[@data-tooltip='Voiture']").click
         objBrowser.getElementByXPath("//button[@data-tooltip='Voiture']").click

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko :zen:

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 4
    Par défaut
    Bonjour,

    Est il possible de piloter l'interface de téléchargement de fichiers de edge ?
    Quand on fait cliquer le code sur un lien de téléchargement, j'aimerait pouvoir choisir le dossier et le nom du fichier mais surtout confirmer le téléchargement.
    Merci

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 210
    Par défaut
    Hello,
    le souci avec Edge, c'est qu'une fois qu'on a cliqué sur le lien du téléchargement, il faut attendre que le téléchargement soit terminé ou annulé pour passer à la suite, sinon on exécute ce qui suit dans le code comme par exemple la fermeture du navigateur si bien qu'on a pas le temps de voir la fenêtre de dialogue du téléchargement en haut à droite :
    Nom : EdgeDownloadCDP1.png
Affichages : 58
Taille : 12,8 Ko
    pour faire Enregistrer sous
    Pour annuler le téléchargement il faut faire comme ceci :
    Nom : EdgeCancelDl.gif
Affichages : 57
Taille : 26,1 Ko

    Dans le code pour attendre la fin ou l'annulation du téléchargement, il faut regarder dans le répertoire de téléchargements de Edge, si il n'y a plus de fichiers .crdownload
    Voici un exemple qui télécharge le fichier de contribution de tototiti2008 :
    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
    43
    44
    45
    Sub Download_CDP()Dim objBrowser As New CDPBrowser, lienFichier As CDPElement
    Const repDownload = "d:\Téléchargements"
        On Error GoTo ErrHandler
        'on lance MS EDGE
    1   objBrowser.Start "edge", cleanActive:=True, reAttach:=True ', _
                  ' addArgs:="--headless --disable-gpu"
        ' on peut cacher le navigateur
        'objBrowser.hide
    2    objBrowser.navigate "https://www.developpez.net/forums/d2177219/logiciels/" & _
                             "microsoft-office/excel/contribuez/" & _
                             "mise-surbrillance-cellule-selectionnee/#post12084164", isInteractive
    3    Set lienFichier = objBrowser.getElementByXPath("//a[contains(@href,'.xlsm')]")
    4    lienFichier.click
    5    WaitForDownloadsToFinish (repDownload)
    6    objBrowser.quit
         Set lienFichier = Nothing: Set objBrowser = Nothing
         Exit Sub
    ErrHandler:
         Debug.Print "Erreur ligne " & Erl: objBrowser.quit: Set elem = Nothing: Set objBrowser = Nothing
    End Sub
    Sub WaitForDownloadsToFinish(downloadPath As String)
        Dim fso As Object
        Dim folder As Object
        Dim file As Object
        Dim downloadsInProgress As Boolean
        Dim ext As String
        Set fso = CreateObject("Scripting.FileSystemObject")   
        Do
            downloadsInProgress = False
            Set folder = fso.GetFolder(downloadPath)       
            For Each file In folder.Files
                ext = LCase(fso.GetExtensionName(file.name))
                If ext = "crdownload" Or ext = "part" Then
                    downloadsInProgress = True
                    Exit For
                End If
            Next file
            If downloadsInProgress Then
                DoEvents
                Application.Wait Now + TimeValue("0:00:01")
            End If
        Loop While downloadsInProgress
        Set folder = Nothing
        Set fso = Nothing
    End Sub
    Sinon il y a aussi la possibilité de faire le téléchargement sans le clic, en spécifiant l'url, le fichier de destination, le répertoire de destination :
    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
    Public Function DownloadFileFromUrl(ByVal Url As String, ByVal LocalFilename As String, ByVal DestinationDir As String)' Download a file from a given url to specified directory
        Dim WinHttpReq As Object, oStream As Object
        Dim TimerOut As Integer
        On Error Resume Next
        Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
        WinHttpReq.Open "GET", Url, False
        WinHttpReq.send
        If Err.Number = 0 And WinHttpReq.Status = 200 Then
            'Write response to file
            Set oStream = CreateObject("ADODB.Stream")
            oStream.Open
            oStream.Type = 1
            oStream.Write WinHttpReq.responseBody
            oStream.SaveToFile DestinationDir & LocalFilename
            oStream.Close
            Set oStream = Nothing
        Else
            MsgBox LocalFilename & " could not be download !"
        End If 
        'free memory
        Set WinHttpReq = Nothing
    End Function
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko :zen:

Discussions similaires

  1. Réponses: 21
    Dernier message: 17/05/2023, 12h07
  2. Réponses: 2
    Dernier message: 19/02/2022, 21h08
  3. Réponses: 1
    Dernier message: 30/07/2018, 22h34
  4. Réponses: 1
    Dernier message: 10/09/2007, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo