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 subNe 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 finle 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
ExitSelenium 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
exitet d'en faire un .exe
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...