[VBA] Selenium + driverChrome

Bonjour à tous...

pour mon boulot, j'essai d'automatiser des extractions que je dois faire de manière régulière..

J'ai fait quelques recherches et le logiciel Sélénium, est apparu comme une solution.

Sur le site sur lequel je dois accéder, (il est sur un réseau privé inaccessible pour tout le monde, donc je ne peux pas vous donner le lien pour aller voir de plus prêt), j'arrive bien a faire l'authentification, cliquer sur des boutons,......

mais je n'arrive pas a cliquer sur un lien : Exemple "reseau-peda"

inspection lien

(dans la capture j'ai développé l'inspection des lignes pour les deux liens visibles, reseau-peda et reseau-peda Old)

Le lien ne renvoi pas vers une autre page internet... l'affichage du résultat du clic fait à la main reste avec la même url, de type :

https://wxxxxxxxxxxxxxxxxxxxxxxxxxwxwxwxwxwxxxxx/extractions/perso/rechercheExtractions.do

Quelque soit le lien cliqué, c'est toujours la même url, mais le résultat est différent...

j'ai essayé d'obtenir le lien à cliquer de différentes façon sans succès... du genre la recherche de lien avec le nom partiel...

image

je n'ai comme info que un tagname "a"

rechercher le tagname avec une erreur de méthode non gérée...

image

Je me doute qu'il n'y a pas beaucoup de personnes qui sont utilisateurs de selenium... mais comme il y a eut quelques sujet la dessus.... je tente ma chance...

Merci.

Fred

Bonjour,

Je n'ai jamais utilisé cet outil mais il a l'air intéressant. Je vois dans la documentation que l'objet "WebActionChain" dispose de la méthode ".Click". Il suffit de lui donner un "element" comme argument pour le cliquer. Est-ce bien comme ceci que vous avez procédé ?

Comme saboh12617

je n'utilise pas encore Selenium

a quoi ressemble votre code? A tout hasard, ...

Sub test()
    Dim ch, item, cc, t

    Set ch = New Selenium.ChromeDriver
    ch.Start baseUrl:="www.your url"
    For Each item In ch.FindElementByTag("your table name")  'or by Id
        cc = 1
        set li = item.FindElementsByClass("w-auto")
        For Each t In li
            t.FindElementByTag("a").Click
            cc = cc + 1
        Next t
    Next li
End Sub   

Hello,

il y a une solution alternative à Selenium , c'est Chromium-Automation-with-CDP-for-VBA

Elle est constituée de modules de classe VBA qui permettent de piloter les principaux navigateurs (Chrome, Edge, Firefox). Il n' y a pas besoin de drivers.

Ami calmant, J.P

Bonjour

merci de vos retours..

@saboh12617 je n'ai pas encore essayé d'utilisé la méthode "WebActionMain" mais j'ai utilisé pour les différentes phases précédentes des méthodes de type :

  .FindElementById("submit-button").Click
ou
    .FindElementByXPath("//*[@id='correct-navigator-detection']/div/div/div/div[2]/form/div/div/div[2]/div[2]/input").Click

et qui ont bien marché hier... (car je me suis mis sur selenium depuis 2 jours seulement)

@Scraper, je comprend à priori la logique de prendre le premier élément (table ?) et de descendre de niveau au fur et à mesure jusqu'à trouver le lien desiré...

mais mon problème.. c'est que je n'arrive pas à sélectionner le premier élément.

Comme personne de ce forum ne peut accéder au site internet... voici une capture du code HTML de la page, jusqu'à la première extraction disponible :

image

j'ai fait les essais suivants : avec un findElemenById

Set navigateur = New ChromeDriver
With navigateur
    .Start
    .Get "https://xxxxxxxxxxxxxxxxxxxxx"
.... les différentes étapes nécessaires pour arriver à la page souhaitée

    ' For Each item In .FindElementByid("extractionBean")
    ' For Each item In .FindElementById("extractionPerso")
    ' For Each item In .FindElementById("correct-navigator-detection")
....
...
end with

j'ai aussi essayé avec findelementbyClass

      For Each item In .FindElementByClass("container")
      For Each item In .FindElementByClass("col-md-12") 
      For Each item In .FindElementByClass("row")

et j'ai l'erreur suivante à chaque fois..:

image

j'ai poussé les tests avec ce test :

 'For Each item In .FindElementByClass("liste liste-seule table mt-1em")

qui cette fois ci me renvoi l'erreur suivante :

image

(je vais voir si j'arrive à trouver le chromedriver version xxxxxx.36, merci la mise a jour automatique de chrome... )

la seule ligne qui ne me renvoi pas d'erreur c'est celle ci :

For Each item In .FindElementsByClass("w-auto")

mais "Item" ne renvoi pas une liste... mais juste un WebElement :

image

et forcement je ne peux pas rechercher les Tag "a" comme proposé...

Une idée ?

Merci

Fred

Bonjour J. P.

merci du lien, je viens de voir rapidement ton lien... cela ressemble a ce qui est fait avec selenium...

je vais fouillé davantage... mais je penses que le problème sera identique... sur la sélection du lien..

je regarde cela..

Merci

Fred

J'ai retrouvé dans mes archives CDP , le moyen de sélectionner une balise a dont un des attributs contient une chaîne.

Par exemple pour ton lien RESEAU-PEDA :

Set ReleveLink = objBrowser.getElementByXPath("//a[contains(@onclick,'133761')]")

On cherche une balise a qui se trouve n'importe où dont l'attribut onclick contient 133761

Re salut JP... j'ai pris un peu de temps pour testé CDP...

j'arrive bien a cliquer sur le lien grâce a ta dernière ligne. Merci !!!

mais je rencontre un autre problème (avant d'arrivé à cela...)

je dois cliquer sur un bouton...(ENTRER)

image

dont le code HTML est le suivant :

<input type="button" class="btn btn-primary" value="Entrer" onclick="javascript:changeEnv();" data-original-title="" title="">

j'ai pas d'Id, c'est pas un a href...

j'ai essayé plusieurs choses, sans succès.. j'ai essayé de m'inspirer de ta ligne de code pour la sélection mais cela ne marche pas..

Set EntrerLink = .getElementByXPath("//input type[contains(@onclick,'changeEnv')]") 

Une idée JP ?

Merci

Fred

Dans mes archives j'ai déjà eu à cliquer sur un bouton de valeur Entrer voilà ce que j'utilisais :

 objBrowser.getElementByQuery("input[value='Entrer']").click

ca marche...

merci beaucoup..

pendant que j'y suis... car tu as l'air d'avoir beaucoup d'archives

dans le processus je télécharge un fichier csv.

avec un clique de bouton.

.getElementByID("exportCSVButton").click 

existe t'il un moyen de donner un nom + un chemin d'enregistrement tout de suite au fichier à télécharger (ce que faisait Imacro par exemple), ou il faut traiter cela par vba après téléchargement (ça je sais faire..).

Merci

Fred

Il n'y a pas de commande magique pour cela. Il faut que tu retrouves le lien qui correspond au clic et télécharger le fichier indiqué par le lien. Voici un exemple de téléchargement de fichier en utilisant l'objet WinHttp.WinHttpRequest :

Sub DownloadFichier(urlSrc,nomDest)
Dim WinHttpReq As Object, oStream As Object,
Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
Set oStream = CreateObject("ADODB.Stream")
dlPath = "D:\tmp\fichiers\"
WinHttpReq.Open "GET", urlSrc, False
WinHttpReq.send
' Debug.Print urlSrc, WinHttpReq.Status
If WinHttpReq.Status = 200 Then
       oStream.Open
       oStream.Type = 1
       oStream.Write WinHttpReq.responseBody    
       oStream.SaveToFile dlPath & nomDest, 2 ' 1 = no overwrite, 2 = overwrite
       oStream.Close
Else
      Debug.Print "NOK : ", WinHttpReq.Status
End If
Set WinHttpReq = Nothing: Set oStream = Nothing
MsgBox "Téléchargement terminée !"
End Sub

Bonjour

Merci JP.. je garde cela de coté pour le moment... car je suis tombé sur un autre os pour le moment...

je cherche à présent, à faire une sélection dans une liste déroulante avec 2 choix possibles.

image

j'ai essayé un certain nombre de choses... du genre

image

mais cela ne fonctionne pas..

il n'y a pas beaucoup de ressource concernant CDP... (mais j'ai vu que tu exerces aussi tes talents sur d'autres site ). Je cherche encore... mais si tu as une archive qui traite de cette problématique... ou un site a me conseiller.

Merci

Fred

Hello,

comme ça m'a l'air d'être un input ton élément tu dois pouvoir écrire la valeur dedans avec un sendKeys.

Exemple :

elem.sendKeys "12345678"

Ami calmant

Re bonjour...

visiblement cela ne marche pas... ou je m'y prend mal ?

image

j'ai aussi essayé de cette façon et j'ai la même erreur :

getElementByQuery("input[name='text-input']").sendKeys ("XXXXXXXXXX46P")

pour rappel le code HTML :

<input id="si-select-etab-input" name="text-input" spellcheck="false" placeholder="Filtrer les établissements" role="searchbox" aria-multiline="false" aria-autocomplete="list" aria-controls="si-select-etab-dropdown">

Une autre idée ?

Merci encore

Fred

tu as essayé sans les parenthèses pour le sendKeys

Sans les parenthèses même message d'erreur

que cela soit avec ByID ou ByQuery ...

Fred

Désolé mais je peux rien pour toi et ton élément est spécial car il est de type searchbox. Il est bien visible au moment où tu fais le sendKeys ?

Oui bien visible....

Merci du temps passé.

Je vais clôturer le sujet... et poursuivre mes recherches.

Bonne continuation

Fred

sinon regarde dans cette page dans les Examples si il y a un exemple qui ressemble à ton élément pour que je puisse tester un élément similaire

En particulier celui-là

Hello,

j'ai essayé de sélectionner un élément de la ComboBox de l'exemple dont je parle dans mon message précédent :

Cela fonctionne quand on clique sur l'élément qu'on veut dans la ListBox qui se situe sous la ComboBox.

Pour sélectionner l'élement on utilise soit son id si il en a un ou soit sa position dans la Liste.

Exemple

de

code :

Sub Test_CDP_Select_Option()
' J.P Mars 2025
Dim objBrowser As New CDPBrowser, elem As CDPElement
    'on lance MS EDGE
1   objBrowser.Start "edge", cleanActive:=True, reAttach:=True  ', _
              ' addArgs:="--user-data-dir=d:\CDP\Edge"  'user-data-dir répertoire du cache
    ' on peut cacher le navigateur
    'objBrowser.hide
2   objBrowser.navigate "https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-autocomplete-list/", isInteractive
'3   Set elem = objBrowser.getElementByID("lb1-ny")  ' id pour New-York dans la listbox
3   Set elem = objBrowser.getElementByQuery("#cb1-listbox > li:nth-child(35)") ' New York = 35ème élement de la listBox
4   elem.click ' validation de l'élément
5   objBrowser.Sleep 10 ' temps en attendant de quitter
6   objBrowser.quit
Set objBrowser = Nothing
End Sub

Dans ta capture d'écran on ne voit pas trop la listBox qui se situe sous la comboBox alors je ne sais pas si cela ressemble à mon exemple.

Ami calmant, J.P

Rechercher des sujets similaires à "vba selenium driverchrome"