Problème pour piloter un site web VBA

Bonjour forum,

J'ai un petit soucis j'ai un fichier excel qui me servait pour miser sur un site https://www.zeturf.fr/ seulement voilà depuis hier Internet explorer 11 ne veut plus rien savoir, quand je suis hors connection ce fichier fonctionne parfaitement seulement quand je suis connecté, impossible de le faire cliquer sur les boutons SG, SP, etc. Donc j'ai cherché une alternative avec excel + selenium que j'ai trouvé dans des tutos mais il me manque du code. J'ai besoin d'aide car en plus Selenium ne semble pas fonctionner comme IE par exemple obligé d'avoir la fenêtre visible alors qu'avant je mettais IE.Visible = False.

Voila votre aide serait la bienvenue et toute autre proposition comme alternative.

Voici le code que j'ai commencé mais il m'en manque et en dessous le fichier original avec IE 11 j'ai demandé au site, ils m'ont répondu qu'il fallait que je vide le cache et tout et ceci sur 3 pc différents mais c'est pareil, IE 11 est obsolète voilà tout.

Option Explicit

Sub test()
Dim obj As WebDriver
Set obj = New WebDriver
Dim elem As WebElements
Dim Boutons As WebElements
Dim I As Integer

obj.Start "chrome"
obj.Window.Maximize

obj.Get "https://www.zeturf.fr/fr/course/2020-10-08/R4C8-enghien-soisy-prix-de-mauperthuis/turf"

Application.Wait Time + TimeSerial(0, 0, 5)

obj.FindElementByName("connection[login]").SendKeys ("login")
obj.FindElementByName("connection[password]").SendKeys ("MDP")
obj.FindElementById("connection_submit").Click
Application.Wait Time + TimeSerial(0, 0, 5)

''''''' A PARTIR DE LA QUE CA COINCE''''''''''''''''''''''''''''''''''''''''''
 obj.FindElementById("chk-change-pari paris-arrondi_79x40_2").Click

'elem.FindElementByTag("chk-change-pari paris-arrondi_79x40_2").Click

'Boutons.FindElementsByClassName("chk-change-pari paris-arrondi_79x40_2").Click

'For I = 0 To Boutons.Length - 1
        'If Boutons(I).className = "chk-change-pari paris-arrondi_79x40_2" Then Exit For
   ' Next I
    'Boutons(I).Click
    'Boutons(I).Click

    'obj.Get "https://www.zeturf.fr/fr/logout"
Stop
End Su
76mise.xlsm (19.82 Ko)

Bonjour,

C'est peut-être un signe pour que vous arrêtiez les paris sportifs !

Le truc, c'est que vos objets elem et boutons ne sont pas affectés dans votre code donc ça ne peut pas marcher. Vous ciblez un élément sur un ensemble avec la même classname ou tagname. Il faut le cibler et ensuite agir dessus.

Si besoin, n'hésitez pas à regarder la variable Obj dans la fenêtre de variables locales pour inspecter chaque élément.

En plus, si je ne me trompe pas, vous changez de page au moment de la connexion. Est-ce votre objet Obj est correctement réaffecté ?

En tout cas, en attendant que vous ayez une meilleure réponse (parce que je ne m'y connais pas suffisamment bien), je vous propose un début de piste :

Option Explicit

Sub test()
Dim obj As WebDriver
Set obj = New WebDriver
Dim elem As WebElements 'WebElement, sans "s" peut-être ????
Dim Boutons As WebElements
Dim I As Integer

With obj
    .Start "chrome"
    .Window.Maximize
    .Get "https://www.zeturf.fr/fr/course/2020-10-08/R4C8-enghien-soisy-prix-de-mauperthuis/turf"

    Application.Wait Time + TimeSerial(0, 0, 5)

    .FindElementById("connection_login").SendKeys ("login")
    .FindElementById("connection_password").SendKeys ("MDP")
    .FindElementById("connection_submit").Click

    Application.Wait Time + TimeSerial(0, 0, 5)

''''''' A PARTIR DE LA QUE CA COINCE''''''''''''''''''''''''''''''''''''''''''

    .FindElementById("chk-change-pari paris-arrondi_79x40_2").Click

    Set elem = .FindElementByTag("chk-change-pari paris-arrondi_79x40_2")(1)
    elem.Click
    'équivaut à .FindElementByTag("chk-change-pari paris-arrondi_79x40_2")(1).click

    Set Boutons = .FindElementsByClassName("chk-change-pari paris-arrondi_79x40_2")(1)
    Boutons.Click
End with

End Sub

Cdlt,

Merci je vais essayer ça dans un premier temps et zeturf qui m'affirme que c'est mon IE qui est blindé cookie, etc etc mais j'ai tous viré lol et j'ai fais le test sur 3 pc différent pour le même résultat.

Sinon ici en faite il faut en supprimer le but c'est juste de faire un double click sur cet élément. "chk-change-pari paris-arrondi_79x40_2"

''''''' A PARTIR DE LA QUE CA COINCE''''''''''''''''''''''''''''''''''''''''''

    .FindElementById("chk-change-pari paris-arrondi_79x40_2").Click

    Set elem = .FindElementByTag("chk-change-pari paris-arrondi_79x40_2")(1)
    elem.Click
    'équivaut à .FindElementByTag("chk-change-pari paris-arrondi_79x40_2")(1).click

    Set Boutons = .FindElementsByClassName("chk-change-pari paris-arrondi_79x40_2")(1)
    Boutons.Click

D'ailleurs c'est quelle ligne qui fonctionne ? Dans un premier juste un clik sur l'élément "chk-change-pari paris-arrondi_79x40_2"

Mais je comprends pas, ça marchait avant ? Comment vous faisiez le double-clic (par sendkeys ?) ? Parce que le code n'a pas l'air fonctionnel pour l'instant. Si vous avez votre ancien code avec IE, postez-le pour qu'on essaie de faire le lien mais je vous avoue que je n'ai jamais essayé avec webdriver, seulement avec internet explorer et je suis pas le plus doué...

Cdlt,

le double click je le faisais avec IE c'est dans le fichier en bas dans le premier post. J'ai pas essayer avec selenium encore déjà j'arrive pas a le faire cliquer une fois lol Ensuite il y peu être une autre solution sans passer par selenuim mais par shell ou quoi.

Non mais en fait, il faut pouvoir cliquer sur l'élément. Il y a au plus un élément par Id tandis que plusieurs éléments apprtiennent à la même classname ou tagname.

Donc ici :

obj.FindElementById("chk-change-pari paris-arrondi_79x40_2").Click '<<< peut fonctionner si cliquable

obj.FindElementByTag("chk-change-pari paris-arrondi_79x40_2").Click '<<< ne peut pas fonctionner car ici obj.FindElementByTag("chk-change-pari paris-arrondi_79x40_2") est un ensemble d'éléments

obj.FindElementByTag("chk-change-pari paris-arrondi_79x40_2")(1) 'peut fonctionner si existant et cliquable
obj.FindElementByTag("chk-change-pari paris-arrondi_79x40_2")(2) 'peut fonctionner si existant et cliquable
obj.FindElementByTag("chk-change-pari paris-arrondi_79x40_2")(3) 'peut fonctionner si existant et cliquable

(Et je précise que je ne sais pas si les éléments sont répertoriés en base 0 ou en base 1)

Mais le mieux est de passer par un objet élément. On l'affecte (set elem = obj.find...) puis on clique (elem.click).

Ca permet de voir de contrôler ce qu'il contient dans la fenêtre variables locales, en exécutant au pas à pas.

Il y a une erreur dans ceux là dans le code ça s'affiche en rouge.

obj.FindElementByTag("chk-change-pari paris-arrondi_79x40_2")(2)

ceci fonctionne avec IE alors pour l'adapter j'ai essayé mais sans résultat.

 Set IEDoc = IE.document
    Set Boutons = IEDoc.getElementsByTagName("button")
    For I = 0 To Boutons.Length - 1
        If Boutons(I).classname = "chk-change-pari paris-arrondi_79x40_2" Then Exit For
    Next I
    Boutons(I).Click
    Boutons(I).Click

Je t'ai dit :

- sur la page internet en question, aide toi de F12 pour cibler les éléments. Tu accèdes au code HTML de l'élément (tu peux voir l'Id, la classname, ...) ce qui permet de le reporter sur VBA.

- exécute le code au pas à pas détaillé et regarde attentivement tes variables. Ce sont des objets, il faut dérouler le menu des attributs et aller regarder les items et leur valeur ou leur nom ou la propriété qui t'intéressera.

Mais pour ça, il faut bien définir les objets et bien les affecter. Le mieux serait de faire :

Option Explicit

Sub test()
Dim obj As WebDriver
Set obj = New WebDriver
'je dis ça sans certitude, mais logiquement c'est le principe du fonctionnement VBA
Dim elems As WebElements
Dim elem as WebElement

With obj

'..... tout le code

    .FindElementById("chk-change-pari paris-arrondi_79x40_2").Click

    Set elems = .FindElementByTag("chk-change-pari paris-arrondi_79x40_2")
    'à partir de là, tu peux inspecter les éléments capter dans elems (VARIABLES LOCALES)
    'grâce à ça, tu pourras choisir l'item que tu veux pour la prochaine étape
    Set elem = elems.item(1) '1 c'est un exemple, je ne sais pas lequel tu veux
    elem.Click

End with

End Sub

J'avance à l'aveugle mais tu as le principe du fonctionnement. Il faut faire de l'investigation avec de pouvoir manipuler (en tout cas avec IE, c'était le cas pour moi).

Peux-tu essayer comme ça :

Option Explicit

Sub test()
Dim obj As WebDriver
Set obj = New WebDriver
'je dis ça sans certitude, mais logiquement c'est le principe du fonctionnement VBA
Dim elems As WebElements
Dim elem as WebElement

With obj

'..... tout le code

    Set elems = .FindElementByTag("button")
    for i = 0 to elems.length - 1 'ou .count - 1
        if elems(i).classname = "chk-change-pari paris-arrondi_79x40_2" Then 'doute sur cette ligne
            set elem = elems(i)                
            Exit For
        end if
    Next i
    elem.Click
    elem.Click
        
end with

End Sub

ça coince ici

Set elems = .FindElementByTag("button")

Sinon j'ai essayé ça ça l'air de fonctionner manque plus qu'a le faire cliquer deux fois

Set elem = obj.FindElementByClass("liste-pari")
    elem.FindElementByTag("button").Click (1)

J'ai cherché et j'ai trouvé des pistes mais avec d'autres langages.

Dim actions as Actions
Set actions = new Actions(obj)
Set elem = obj.findElementByClass("liste-pari")
actions.doubleClick(elem) '.perfor

Je sais pas si c'est possible. Il faut bien définir les objets pour ensuite accéder aux méthodes. Car si ça se trouve, il y a une méthode .DoubleClick

C'est compliqué pour moi car je ne peux pas essayer...

Suffi d'installer selenium https://github.com/florentbr/SeleniumBasic/releases le fichier exe

une fois installé repérer l'emplacement d'installation souvent ici C:\Users\ton nom de pc\AppData\Local\SeleniumBasic

trouver une mise a jour du navigateur là j'ai chrome pour l'utiliser donc il faut prendre la mise a jour du webdriver qui correspond a celui que t'as ici

https://chromedriver.chromium.org/downloads

si ton chrome est une version 85 tu prend la 85 ensuite tu met le fichier téléchargé dans C:\Users\ton nom de pc\AppData\Local\SeleniumBasic tu remplace l'ancien par le nouveau car il est obsolète. Et voilà

Selenium peut fonctionner avec chrome, edge, mozilla, opéra, phantomjs je ne connais pas c'est du javascript et IE aussi mais là en l’occurrence je ne serais pas plus avancé lol

Et d'activer la référence selenium dans le vba

cette ligne ça coince

Set actions = new Actions(obj)

Le problème c'est que je suis sur mac et que je n'ai quasiment aucune référence de windows.

Il est obsolète donc je ne peux pas mettre à jour chrome sinon la version n'est pas supportée. Enfin, bref, je suis limité technologiquement.

J'ai essayé de t'aider car ce genre de problème rencontre peu de réponses en général mais ça va être compliqué. Le mieux, c'est que tu inspectes bien les éléments HTML. Au bout d'un moment, ça va passer. En plus j'ai l'impression que la captation des objets est plus fluide que sur IE.

Sinon sans passer par selenium j'essaye avec shell, il faut nommer une feuille Accueil mettre la date du 09/10/2020 en L2, en A1 mettre R1 en A2 mettre C1 et en A3 mettre "vincennes-prix-ingeborg" sans les guillemets, mais il me manque la suite pour piloter la page. Je pense qu'avec une des deux solutions ça doit passer. Soit selenium soit par shell car le site ma confirmé que IE c'est fini lol. Moi je suis plutôt limité en VBA pas trop en technologie lol

Sub multiplechrome()

Dim Url As String, Wsh
Dim LaDate As String, LaReunion As String, LaCourse As String, LePrix As String

If Sheets("Accueil").Range("L2") Then
        LaDate = Format(Sheets("Accueil").Range("L2"), "yyyy-mm-dd")
        LaReunion = Format(Sheets("Accueil").Range("A1"), "General")
        LaCourse = Format(Sheets("Accueil").Range("A2"), "General")
        LePrix = Format(Sheets("Accueil").Range("A3"), "General")

    Url = "https://www.zeturf.fr/fr/course/" & LaDate & "/" & LaReunion & LaCourse & "-" & LePrix & "/" & "turf"

    Shell ("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe -url " & Url)

    Set Wsh = CreateObject("wscript.shell")

End If

End Sub

Et bah t'as qu'à m'envoyer un nouvel ordi et je t'envoie un bouquin sur VBA.

Quelque soit le moyen, le principe reste le même : arriver à appréhender les objets, pour pouvoir agir dessus.

Avec IE, j'avais un objet HTMLDocument composé d'objets HTMLElement pour faire simple. Avec Selenium, je ne vois pas tout ça. Or, ce sont sur ces objets que tu agis et c'est ça qui doit te permettre, grâce à la bonne référence, d'avoir accès aux propriétés (valeur, Id, ...) et méthodes (click). Sans commencer avec le "bon support" c'est plus compliqué.

Dès que tu instancies ton objet : Set elem = HTMLDOC.getelementbyid("idrecherché"). La fenêtre variables locales répertorie toutes les propriétés et les sous-éléments le cas échéant. C'est comme ça que tu peux avancer, en faisant le rapprochement avec le site (grâce à l'outil de développement : F12).

Sinon, je vois pas comment faire pour t'aider plus malheureusement...

Après moult recherche, j'ai trouvé la solution ultime, peu être des choses a corriger mais ça fonctionne donc le but c'est qu'il mise en simple gagnant le cheval que j'aurais choisi pour une mise de 2€. Evidemment il faut installer Sélénium comme expliquer plus haut ou trouver un tuto et activer la référence Sélénium dans le VBA.

Voici le code et le fichier par contre j'ai pas mis mon Login et mon mot de passe faut pas déconner non plus ! et je remercie JB pour sa patience et son aide.

Option Explicit

Sub test()
Dim obj As WebDriver
Set obj = New WebDriver
Dim elem As WebElement
Dim LaDate As String, LaReunion As String, LaCourse As String, LePrix As String
Dim inputfield As Object

obj.Start "chrome"
obj.Window.Maximize

If Sheets("Accueil").Range("L2") Then
        LaDate = Format(Sheets("Accueil").Range("L2"), "yyyy-mm-dd")
        LaReunion = Format(Sheets("Accueil").Range("A1"), "General")
        LaCourse = Format(Sheets("Accueil").Range("A2"), "General")
        LePrix = Format(Sheets("Accueil").Range("A3"), "General")

obj.Get "https://www.zeturf.fr/fr/course/" & LaDate & "/" & LaReunion & LaCourse & "-" & LePrix & "/" & "turf"

'obj.FindElementByName("connection[login]").SendKeys ("login")
'obj.FindElementByName("connection[password]").SendKeys ("mdp")
'obj.FindElementById("connection_submit").Click

       Application.Wait Time + TimeSerial(0, 0, 1)
obj.FindElementByXPath("/html/body/div[4]/div[2]/div[2]/div[1]/button[2]").ClickDouble 'double click sur le bouton SP

       Application.Wait Time + TimeSerial(0, 0, 1)

obj.FindElementByXPath("/html/body/div[4]/div[9]/div[3]/div[1]/table/tbody/tr[1]/td[17]/button").Click 'click sur le cheval numéro 1
'obj.FindElementByXPath ("/html/body/div[4]/div[9]/div[3]/div[1]/table/tbody/tr[2]/td[17]/button").Click 'click sur le cheval numéro 2

obj.FindElementByXPath("/html/body/div[4]/div[7]/div[1]/div[4]/div[1]/div[2]/div[5]/ul/li/div[2]/span[2]/input").Clear 'supprime le contenu du champ de la mise
       Application.Wait Time + TimeSerial(0, 0, 1)
obj.FindElementByXPath("/html/body/div[4]/div[7]/div[1]/div[4]/div[1]/div[2]/div[5]/ul/li/div[2]/span[2]/input").SendKeys (Feuil1.Range("O1").Value) 'mise 2€ par rapport à la cellule O2
       Application.Wait Time + TimeSerial(0, 0, 1)

obj.FindElementByXPath("/html/body/div[4]/div[7]/div[1]/div[4]/div[1]/footer/div[1]/div[2]/button").Click 'valide le pari dans le panier pour le test sinon c'est avec le bouton Valider

Application.Wait Time + TimeSerial(0, 0, 5) 'facultatif a supprimer pour le test visuel

End If

Stop ' ceci a supprimer c'est pour le test sinon la page se ferme toute seule
End Sub
146testmacro.xlsm (23.60 Ko)
Rechercher des sujets similaires à "probleme piloter site web vba"