Problème pour piloter un site web VBA

Salut stepaustras,

Super ! Persévérance est le mot d'ordre... Je savais bien que j'avais misé sur le bon cheval .

Je me permets juste de réorganiser le code pour le rendre plus lisible :

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

With Sheets("Accueil")
    If Not .Range("L2") = "" Then Exit Sub '<<< j'ai inversé la condition et rajouté = "" car j'imagine que c'est ce que tu testes ?
    LaDate = Format(.Range("L2"), "yyyy-mm-dd")
    LaReunion = Format(.Range("A1"), "General")
    LaCourse = Format(.Range("A2"), "General")
    LePrix = Format(.Range("A3"), "General")
end with

with obj
    .Start "chrome"    
    .Window.Maximize
    .Get "https://www.zeturf.fr/fr/course/" & LaDate & "/" & LaReunion & LaCourse & "-" & LePrix & "/" & "turf"
    '.FindElementByName("connection[login]").SendKeys ("login")
    '.FindElementByName("connection[password]").SendKeys ("mdp")
    '.FindElementById("connection_submit").Click
    Call Attendre

    .FindElementByXPath("/html/body/div[4]/div[2]/div[2]/div[1]/button[2]").ClickDouble 'double click sur le bouton SP
    Call Attendre

    .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
    '.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
    .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
    Call Attendre

    .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
    Call Attendre

    .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
    Stop ' ceci a supprimer c'est pour le test sinon la page se ferme toute seule
End with

End Sub

Sub Attendre()
Application.Wait Time + TimeSerial(0, 0, 1)
End sub

Ne fais pas trop folie quand même hein avec les paris. Et encore bravo !

Bonne journée,

Merci 3GB pour l'optimisation, faut que je rajoute aussi un petit truc pour en cas d'erreur genre ça On Error GoTo fin ou ça On Error Resume Next, que je trouve s'il y a moyen de réduire la fenêtre dans chrome a l'ouverture avec headless et voir s'il y a possibilité d'enregistrer les paramètres car a l'ouverture de chaque page il devrait garder le mot de passe et login en mémoire et là c'est pas le cas.

Je t'en prie Stepaustras,

Et bien tu as encore un peu de boulot alors .

Bon courage à toi en tout cas

D’ailleurs une question si je met un goto ici

With obj
On Error GoTo fin

le fin: il est préférable de le mettre avant ou après le end with en sachant que après le end with j'ai une autre macro qui doit se lancer une fois la mise terminé.

Tu peux le mettre où tu veux, ça n'a pas d'importance.
Les instructions goto et exit permettent de quitter précipitamment n'importe quelle instruction, comme si le end était forcé...

Et le with, c'est vraiment pour rendre le code plus lisible en statuant que les opérations se rattachent toutes à obj.

Bonjour,

sujet intéressant (pour une fois ce n'est pas du web scrapping) et belle solution

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.

<br>

on aurait pu aussi passer par AutoIt

Bonjour Steelson,

On aurait pu utiliser AutoIt ? Qu'est-ce que c'est ?

Cdlt,

Hello 3GB

Comme dit le site

AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting. It uses a combination of simulated keystrokes, mouse movement and window/control manipulation in order to automate tasks in a way not possible or reliable with other languages (e.g. VBScript and SendKeys). AutoIt is also very small, self-contained and will run on all versions of Windows out-of-the-box with no annoying “runtimes” required!

Je l'ai utilisé pour simuler des transactions sur SAP à partir d'excel et égalemnt initialiser un arduino. Et cela fonctionnait du tonnerre : en fait pour SAP je mettais des données d'excel dans le presse-papier, avec un code d'identification en tête (un peu comme une trame GPS), AutoIt scrutait en permanence le presse-papier, activait la fenêtre que je luis avais demandée dans le presse-papier et actionnait une série de sendkeys pour se balader dans l'interface de SAP et renseigner les champs. C'est assez génial mais je n'ai pas été au-delà de ces possibilités. Exemple de programme :

; pour fermeture auto sans activité
$compteur = 0

do
; capture du presse-papier
    $ClipText = clipget()
    $ClipTerms = StringSplit($ClipText, "|")

    If $ClipTerms[1] = "auto_formulaire" then
        if WinExists($ClipTerms[2]) Then
            WinActivate($ClipTerms[2], "")
            $ClipTerms[3] = StringRegExpReplace($ClipTerms[3],";","{TAB}")
            Send($ClipTerms[3])
            $compteur = 0
        Else
            MsgBox(0, "La fenêtre n'est pas ouverte ...", "Ouvrez l'application : " & $ClipTerms[2] & @LF & "et relancez la copie !" & @LF & @LF & "Ce message disparaîtra dans 10 seconds ou sélectionnez OK.", 10)
        EndIf
        ClipPut("")
    EndIf

    $compteur = $compteur + 1

    sleep(2000) ; 2 secondes

until ($ClipText = "STOP" or $compteur = 600) ; 600 * 2 = 1200 secondes = 20 minutes

Exit

Selenium est plus orienté web et décortique les DOM, mais là je découvre tout juste. A contrario de selenium, autoit ne fera pas de web scrapping qui lui captera des données.

D'accord, je crois que je comprends... Même si tu as quand même réussi un peu à me perdre en me mettant un texte en anglais et en me parlant de Arduino et de trame GPS .

Donc AutoIt permet d'utiliser les sendkeys principalement si je comprends bien ? Cela permet de manipuler une application dont les objets ne seraient pas directement captables par VBA, c'est ça ?

C'est vrai que c'est grandiose. Et comment ça marche ? Quelle est cette syntaxe ? On dirait un mélange de VBA et d'un autre langage...

Donc AutoIt permet d'utiliser les sendkeys principalement si je comprends bien ? Cela permet de manipuler une application dont les objets ne seraient pas directement captables par VBA, c'est ça ?

tu as bien résumé, mais pas que cela, autoit m'a permis aussi de balayer facilement toutes applis ouvertes plus simplement qu'excel

Run("notepad.exe")
WinWaitActive("[CLASS:Notepad]")
$titre = WinGetTitle("[ACTIVE]", "")

$var = WinList()

send( "Liste des fenêtres ouvertes :" & @LF & @LF )

For $i = 1 to $var[0][0]
  ; Only display visble windows that have a title
  If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
    send( "Titre :{TAB}{TAB}" & $var[$i][0] & @LF &  "Handle : {TAB}" & $var[$i][1] & @LF & @LF)
  EndIf
Next

Func IsVisible($handle)

  If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
  Else
    Return 0
  EndIf

EndFunc

exit

et d'en faire un .exe

38liste-fenetres.zip (413.06 Ko)

C'est vrai que c'est grandiose. Et comment ça marche ? Quelle est cette syntaxe ? On dirait un mélange de VBA et d'un autre langage...

si cela peut t'intéresser ... https://www.tech2tech.fr/autoit-la-programmation-facile/

Je te remercie !

Je regarderai quand j'aurai un moment pour comprendre et décortiquer toutes ces informations...

Rechercher des sujets similaires à "probleme piloter site web vba"