Piloter un site Web à partir de VBA

Piloter un site Web à partir de VBA - VB/VBA/VBS - Programmation

Marsh Posté le 23-10-2015 à 16:07:14    

Bonjour,
 
On me demande de faire des statistiques sur un site hippique de manière à créer et enrichir une base de données.
Comme je ne suis pas chevronné en VBA, je rencontre quelques difficultés...
Je déflore peut-être un sujet déjà abordé, cependant je n'ai pas réussi à trouver la réponse à mon interrogation. Il me reste à cliquer sur un bouton pour démarrer automatiquement le site et je ne parviens pas à le faire car ce bouton n'a ni Name, ni ID ???
voilà la source de la page pour le bouton à cliquer :
 
<input type="submit" class="buttonsmall right" value="se connecter"/>
 
Les champs se remplissent bien mais la dernière action (submit) n'a aucun effet et je n'ai pas de message d'anomalie.
Voici mon code :

Code :
  1. Sub connexion()
  2.    Dim ie As Object
  3. ' Démarrer et afficher Internet Explorer
  4.    On Error GoTo ConnexionIEErr
  5.    Set ie = CreateObject("InternetExplorer.Application" )
  6.    ie.Visible = True
  7.    Dim IEdoc As Object
  8.    Dim DOCelement As Object
  9.    ie.Navigate ("http://www.zeturf.fr" )
  10.      ' attente de fin de chargement
  11.    Do Until ie.ReadyState = 4
  12.       DoEvents
  13.    Loop
  14.    Set IEdoc = ie.Document
  15. 'login
  16.    Set DOCelement = IEdoc.getElementsByName("login" ).Item
  17.    DOCelement.Value = "monidentifiant"
  18. 'password
  19.    Set DOCelement = IEdoc.getElementsByName("password" ).Item
  20.    DOCelement.Value = "monpw"
  21.    DOCelement.Select
  22.    
  23. 'jour naissance
  24.    Set DOCelement = IEdoc.getElementsByName("jour" ).Item
  25.    DOCelement.Value = "01"
  26.    
  27. 'mois naissance
  28.    Set DOCelement = IEdoc.getElementsByName("mois" ).Item
  29.    DOCelement.Value = "01"
  30.    
  31. 'année naissance
  32.    Set DOCelement = IEdoc.getElementsByName("annee" ).Item
  33.    DOCelement.Value = "1990"
  34. 'connexion
  35.    Set DOCelement = IEdoc.Forms(0)
  36.    DOCelement.submit
  37.    End
  38.  
  39. ConnexionIEErr:
  40.    MsgBox "Erreur : " & Err.Number & vbCrLf & _
  41.           Err.Description, vbExclamation
  42.    ConnexionIE = False
  43. End Sub


 
Quelqu'un pourrait-il m'aider ?
Merci par avance
 :)

Reply

Marsh Posté le 23-10-2015 à 16:07:14   

Reply

Marsh Posté le 23-10-2015 à 17:00:54    

 
           Bonjour,
 
           désactiver le  On Error  aiderait à identifier un éventuel problème et remplacer le  End  par  Exit Sub  …
 
           Voir avec l'outil d'inspection d'un navigateur si c'est le bon élément et s'il est bien de type submit.
           Sinon s'il y a un bouton, activer son Click
 
           Mettre un point d'arrêt dans le code puis développer dans la fenêtre des Variables locales le contenu de IEdoc
           ou d'une autre variable objet pointant sur un de ses éléments aiderait aussi à trouver comment atteindre ce bouton.
           Parfois il suffit juste de positionner le focus sur l'élément juste avant le Click ou le submit
 
           Sinon tout simplement l'indice de Forms n'est peut-être pas le bon alors qu'il dispose pourtant d'un ID, autant l'utiliser !
 

Reply

Marsh Posté le 24-10-2015 à 11:12:37    

Bonjour Marc L,
Merci beaucoup d'avoir pris le temps de regarder mon problème.
J'ai tenté de modifier l'indice de mon forms par (1) et là... miracle ! Ça fonctionne !
Comment indiquer que ce post est résolu ?  
Encore un grand merci et très bon week-end à vous
:)

Reply

Marsh Posté le 24-10-2015 à 14:53:23    

 
           Ce n'est pas un miracle, c'était juste une erreur d'élément ‼
           Erreur de débutant alors que l'élément dispose pourtant d'un ID, autant l'utiliser !
           Rien qu'en lisant le code de la page ou en utilisant l'outil d'inspection d'un navigateur …
 
           S'il n'y a pas de bouton, modifier le titre du sujet en indiquant [RESOLU] …
 
           Sinon le code doit se résumer à une quinzaine de lignes !
           J'ai mis en commentaire via une double apostrophe les lignes inutiles :
 

Code :
  1. Sub connexion()
  2. ''   Dim ie As Object
  3. ' Démarrer et afficher Internet Explorer
  4. ''   On Error GoTo ConnexionIEErr
  5. ''   Set ie = CreateObject("InternetExplorer.Application" )
  6.     With CreateObject("InternetExplorer.Application" )
  7. '   ie.Visible = True
  8.         .Visible = True
  9. ''   Dim IEdoc As Object
  10. ''   Dim DOCelement As Object
  11. '   ie.Navigate ("http://www.zeturf.fr" )
  12.         .Navigate "http://www.zeturf.fr"
  13.      ' attente de fin de chargement
  14. '   Do Until ie.ReadyState = 4
  15. '      DoEvents
  16. '   Loop
  17.         While .Busy Or .ReadyState < 4:  DoEvents:  Wend
  18. ''   Set IEdoc = ie.Document
  19.         With .Document
  20. 'login
  21. ''   Set DOCelement = IEdoc.getElementsByName("login" ).Item
  22. ''   DOCelement.Value = "monidentifiant"
  23.             .all("cookie_login" ).Value = "identifiant"
  24. 'password
  25. ''   Set DOCelement = IEdoc.getElementsByName("password" ).Item
  26. ''   DOCelement.Value = "monpw"
  27. ''   DOCelement.Select
  28.             .all("password" ).Value = "monpass"
  29. 'jour naissance
  30. ''   Set DOCelement = IEdoc.getElementsByName("jour" ).Item
  31. ''   DOCelement.Value = "01"
  32.             .all("cookie_jour" ).Value = "10"
  33. 'mois naissance
  34. ''   Set DOCelement = IEdoc.getElementsByName("mois" ).Item
  35. ''   DOCelement.Value = "01"
  36.             .all("cookie_mois" ).Value = "11"
  37. 'année naissance
  38. ''   Set DOCelement = IEdoc.getElementsByName("annee" ).Item
  39. ''   DOCelement.Value = "1990"
  40.             .all("cookie_annee" ).Value = "1997"
  41. 'connexion
  42. ''   Set DOCelement = IEdoc.Forms(0)
  43. ''   DOCelement.submit
  44.             .Forms("cookie_header_nologged" ).submit
  45.         End With
  46.     End With
  47. ''   End
  48. ''ConnexionIEErr:
  49. ''   MsgBox "Erreur : " & Err.Number & vbCrLf & _
  50. ''          Err.Description, vbExclamation
  51. ''   ConnexionIE = False
  52. End Sub


 

Reply

Marsh Posté le 24-10-2015 à 15:09:53    

 
           Lorsqu'il n'y a pas d'ID, pointer alors sur les types d'éléments :
 

Code :
  1. Sub Demo()
  2.     With CreateObject("InternetExplorer.Application" )
  3.         .Navigate "http://www.zeturf.fr"
  4.         .Visible = True
  5.         While .Busy Or .ReadyState < 4:  DoEvents:  Wend
  6.         With .Document.Forms("cookie_header_nologged" )
  7.             With .getElementsByTagName("INPUT" )
  8.                  .Item(0).Value = "identifiant"
  9.                  .Item(1).Value = "monpass"
  10.             End With
  11.             With .getElementsByTagName("SELECT" )
  12.                  .Item(0).Value = "10"
  13.                  .Item(1).Value = "11"
  14.                  .Item(2).Value = "1997"
  15.             End With
  16.             .submit
  17.         End With
  18.     End With
  19. End Sub


 

Reply

Marsh Posté le 27-10-2015 à 11:37:08    

Merci beaucoup pour toutes ces précisions que me seront précieuses.
Puis-je abuser de votre aide généreuse pour continuer ?

Reply

Marsh Posté le 27-10-2015 à 12:41:15    

 
           C'est la nature même de ce forum et puis si ce n'est pas moi, un autre intervenant pourrait répondre …
 
           Préférer le premier code avec les ID (recommandation de la norme HTML),
           c'est plus simple à maintenir en cas d'évolution de la page Web …
 

Reply

Marsh Posté le 27-10-2015 à 14:24:13    

Encore grand merci Marc L.
Voici mon nouvel obstacle :

Code :
  1. Sub Prog()
  2. ' Démarrer et afficher Internet Explorer
  3.    With CreateObject("InternetExplorer.Application" )
  4.       .Visible = True
  5.       .Navigate "http://www.zeturf.fr"
  6. ' attente de fin de chargement
  7.       While .Busy Or .ReadyState < 4:  DoEvents:  Wend
  8.       With .document
  9.            .Links(6).Click
  10.            .getElementsByClassName ("bigpad" )
  11.            With .getElementsByTagName("A" )
  12.                 .Item(0).Value.Click
  13.            End With
  14.       End With
  15.    End With
  16.  
  17.    Exit Sub


 
1°) Comment puis-je savoir que le focus est bien sur le DIV class="bigpad" ?
2°) Si je suis bien là où il faut, comment exécuter un click sur le <A HREF ?
 
Grâce à vous, j'avance pas à pas. Mais peut-être serait-il plus simple que j'achète un bouquin technique qui explique tout cela ; avez-vous une référence en tête à me communiquer ?
 
A très bientôt

Reply

Marsh Posté le 27-10-2015 à 19:28:56    

 
           Le code incomplet ne permet pas d'arriver sur une page contenant un élément avec une classe "bigpad",
           donc je me retrouve dans le brouillard complet !
           Quel est le lien de la ligne n°9 ?
 
           En général le clic est effectué sur le parent contenant l'élément de type "a".
           Le plus simple est via un ID, si le parent direct n'en a pas, en remontant d'un niveau puis en pointant le sous élément …
 
           La ligne n°10 telle quelle est erronée : manque un  With  …
 
           Je ne pense pas qu'il existe de bouquin pour piloter non pas un site Web mais Internet Explorer en VBA
           mais il y a des tutoriels sur le net …
 

Reply

Marsh Posté le 28-10-2015 à 09:17:06    

Bonjour,
 
Le lien de la ligne 9 permet d'afficher la page "http://www.zeturf.fr/fr/programmes-et-pronostics"
voici le code HTML de l'endroit qui m'intéresse :
 
<div id="box_message"></div>
<iframe id="mediabanner5" src="" width="680" height="100" frameborder="0" scrolling="no"  style="display:none"></iframe>
<div id="box_nextraces" class="boxes">
<h3>Prochaines courses</h3>
 
 <div class="box grad150">
 
   <div class="bigpad" style="height:105px; overflow:hidden;">
       <div id="nextraces_166647" class="left mask" style="width:200px; margin-bottom:5px;">
     <div class="left race_2" style="margin-right:10px;" title="Plat" ></div>
     12h30<a href="http://www.zeturf.fr/fr/programmes-et-pronostics/course?id=166647" title="MAISONS LAFFITTE - Prix Noir et Or" class="pill">&nbsp;R2 C1&nbsp;</a><br/>
     <a href="http://www.zeturf.fr/fr/programmes-et-pronostics/course?id=166647" title="Prix Noir et Or">Prix Noir et Or</a>
    </div>
 
A cet endroit, j'aimerais savoir comment déclencher l'événement "A" par un click.
Merci pour la réponse concernant le livre technique.

Reply

Marsh Posté le 28-10-2015 à 09:17:06   

Reply

Marsh Posté le 29-10-2015 à 09:49:45    

 
           Comme indiqué dans mon précédent message …
 

Code :
  1. Sub Demo1()
  2.     With CreateObject("InternetExplorer.Application" )
  3.         .Navigate "http://www.zeturf.fr/fr/programmes-et-pronostics"
  4.         .Visible = True
  5.         While .Busy Or .ReadyState < 4:  DoEvents:  Wend
  6.         .Document.all("box_nextraces" ).getElementsByTagName("A" )(0).Click
  7.     End With
  8. End Sub


 

Reply

Marsh Posté le 29-10-2015 à 11:42:43    

Merci beaucoup.
Il y a cependant un phénomène que je ne comprends pas.
Lorsque j'appelle un autre ID (par exemple "box_day" ), j'ai une erreur d'exécution 438 -propriété ou méthode non gérée par cet objet - ? N'est-ce pas la même logique pour tous les ID de premier niveau ?
Voici le code :

Code :
  1. Sub Demo1()
  2.         With CreateObject("InternetExplorer.Application" )
  3.             .Navigate "http://www.zeturf.fr/fr/programmes-et-pronostics"
  4.             .Visible = True
  5.             While .Busy Or .ReadyState < 4:  DoEvents:  Wend
  6.             .document.all("box_day" ).getElementsByTagName("A" )(0).Click
  7.         End With
  8.     End Sub


A vous lire avec grand plaisir

Reply

Marsh Posté le 29-10-2015 à 14:02:55    

 
           Faut-il encore que l'ID soit unique dans la page, ce qui n'est pas le cas de box_day car trois éléments ont cet ID !
 
           Là  all  renvoie une collection des éléments de cet ID, il suffit de lui adjoindre le n° de l'indice de l'élément : all("ID" )()
           le zéro peut-être …
           
           Ou encore de pointer d'abord un parent avec un ID unique disposant de seulement un seul ID box_day :
 
                                                        all("ID parent unique" ).all("box_day" )
 
 
            A noter aussi avec cette page  getElementByID  retourne seulement le premier élément trouvé …
  

Reply

Marsh Posté le 30-10-2015 à 10:14:35    

Merci Marc.
Pour l'instant, je suis capable d'avancer seul.
Je ne manquerai pas de revenir vers vous si je rencontre un nouvel écueil.
Bonne journée

Reply

Marsh Posté le 30-10-2015 à 13:13:28    

 
           Un excellent article sur le sujet évoquant les trois possibilités (piloter IE étant pour moi la solution de dernier recours) :
 
           Web Scraping Archives
 

Reply

Marsh Posté le 05-01-2016 à 17:56:17    

Bonjour Marc,
Ce qui m'amène aujourd'hui est dans la même optique que nos précédents échanges.
Je dois maintenant réaliser le même travail sur le site PMU mais il y a un écran supplémentaire pour l'identification que je ne sais pas traiter. Voici le code de la page auquel vous pourrez éventuellement accéder avec l'identifiant 3418158546

Code :
  1. <div class="pinpad-body">
  2.   <form id="pinpad-form" autocomplete="off" action="#" method="post">
  3.      <div id="birthdate-block" class="block"></div>
  4.      <div id="code-block" class="block">
  5.         <h5>2. Saisir votre Code Confidentiel : </h5>
  6.         <p id="grille-text">
  7.                 Pour des raisons de sécurité, vous devez cliquer sur les chiffres de la grille pour saisir votre
  8.                 Code Confidentiel :</p>
  9.         <div class="cx"</div>
  10.         <div class="cx">
  11.            <input id="code-pinpad" class="error-place-holder code" name="code" maxlength="6" disabled="disabled" type="password">
  12.            <strong>(4 ou 6 chiffres)</strong>
  13.            <div class="error-message code"></div>
  14.            <input id="button-confirm" class="button" value="Confirmer" type="submit">
  15.         </div>


Après avoir saisi ce code secret à l'aide de la souris, en peut travailler sur le site en étant identifié.
La raison essentielle pour laquelle je reviens vers vous est que j'ai peur, par des fausses manœuvres, de bloquer le site...
Merci pour votre assistance
Bonne soirée

Reply

Marsh Posté le 06-01-2016 à 10:37:16    

 
           Bonjour !
 
           Un peu nébuleux car dans cet extrait de page web il y a plusieurs id !
           
           S'il s'agit juste de valider ce serait du type Form.submit …
 

Reply

Marsh Posté le 06-01-2016 à 13:16:18    

Merci quand même Marc et très bonne année à vous.
Je vais me débrouiller.

Reply

Marsh Posté le 06-01-2016 à 14:26:28    

 
           Et si tu détaillais afin que ce soit un peu plus clair …
 

Reply

Marsh Posté le 08-01-2016 à 12:29:35    

Bonjour,
 
Je suis confronté à un problème que je ne parviens pas à résoudre seul :
 
Erreur d'exécution '424' : Objet requis
 
Curieusement, ma procédure de test fonctionne parfaitement lorsque je fais du pas à pas sous VBA (touche F8), mais lorsque j'actionne F5, j'obtiens le MSG d'erreur ci-dessus ???
Les références VBAProject semblent toutes là.
Voici mon code :

Code :
  1. Sub test()
  2.    Dim IEdoc As Object
  3.    Dim DOCelement As Object
  4.    Set ie = CreateObject("InternetExplorer.Application" )
  5.    ie.Visible = True
  6.    Jj = CStr(Day(Now))
  7.    If Len(Jj) = 1 Then
  8.       Jj = "0" & Jj
  9.    End If
  10.    Mm = CStr(Month(Now))
  11.    If Len(Mm) = 1 Then
  12.       Mm = "0" & Mm
  13.    End If
  14.    Aa = Year(Now)
  15.    ie.Navigate ("https://www.pmu.fr/turf/#/" & Jj & Mm & Aa)
  16.    While ie.Busy Or ie.ReadyState < 4:  DoEvents:  Wend
  17.    Set IEdoc = ie.Document
  18.  
  19.    Set DOCelement = IEdoc.GetElementById("numOfficiel-4" ).GetElementsByTagName("A" )(3).GetElementsByTagName("SPAN" )(3)
  20.    While ie.Busy Or ie.ReadyState < 4:  DoEvents:  Wend
  21.    Ind = InStrRev(DOCelement.innertext, "h" )
  22.    Zone = Mid(DOCelement.innertext, Ind - 2, 5)
  23.    MsgBox "Heure = " & Zone
  24.                    
  25.    ie.Quit
  26. End Sub


Ou ça marche ou ça marche pas ? Où est l'astuce ?
Merci par avance

Reply

Marsh Posté le 08-01-2016 à 16:17:42    

Depuis cet exemple, j'ai rajouté pas mal de code que je teste pas-à-pas.
L'erreur 424 se produit un peu n'importe où.
Je comprends ton explication mais comment circonvenir à un problème de synchronisation ?
A priori, la ligne 21 ne fait pas double emploi avec la ligne 17 dans la mesure où justement elle attend une réponse de disponibilité du système...
Je me trompe ?
Merci en tout cas et à te lire pour la résolution de ce souci qui me tracasse.

Reply

Marsh Posté le 08-01-2016 à 16:17:52    

           Il suffit juste de tester si l'objet est présent (exemple ligne n°8) :
 

Code :
  1. Sub Demo()
  2.             Const ELT = "numOfficiel-4"
  3.     With CreateObject("InternetExplorer.Application" )
  4.         .Navigate ("https://www.pmu.fr/turf/#/" & Format(Day(Now), "00" ) _
  5.                                                 & Format(Month(Now), "00" ) & Year(Now))
  6.         While .Busy Or .ReadyState < 4:  DoEvents:  Wend
  7.             With .Document
  8.                 While Not IsObject(.all(ELT)):  DoEvents:  Wend
  9.                 T$ = .all(ELT).GetElementsByTagName("A" )(3).GetElementsByTagName("SPAN" )(3).innerText
  10.             End With
  11.         .Quit
  12.     End With
  13.                 MsgBox "Heure = " & Split(T)(0)
  14. End Sub


Message édité par Marc L le 08-01-2016 à 17:10:02
Reply

Marsh Posté le 08-01-2016 à 16:48:29    

Merci beaucoup Marc, je vais tester cela ce week-end.
Bonne fin de semaine

Reply

Marsh Posté le 08-01-2016 à 17:00:52    

amateursf a écrit :

L'erreur 424 se produit un peu n'importe où.


            L'erreur survient toujours quand un objet n'est pas encore disponible comme par exemple la ligne n°20 de ton code …
 
 

amateursf a écrit :

A priori, la ligne 21 ne fait pas double emploi avec la ligne 17 dans la mesure où justement elle attend une réponse de disponibilité du système... Je me trompe ?


            Si elle est en doublon car cette ligne n'a lieu d'être qu'à l'ouverture d'un site comme en ligne n°17.
            Une fois le test passé, les propriétés Busy et ReadyState au niveau de l'application IE restent figées,
            ton code en ayant déjà apporté la preuve !
 
            Quand la page à l'ouverture du site est prête, l'objet "numOfficiel-4" n'est pas encore disponible,
            il est encore en cours de génération via un code JavaScript ou une requête par exemple
            car cet élément n'existe pas dans le code source de la page, ce qui aurait dû te mettre la puce à l'oreille
 
            L'autre astuce classique est d'appliquer une pause suffisamment longue (2s) pour laisser les éléments calculés apparaître.


Message édité par Marc L le 08-01-2016 à 17:30:48
Reply

Marsh Posté le 11-01-2016 à 15:30:24    

Bonjour Marc,
Tout d'abord, merci de m'avoir consacré du temps. Je vois que vous êtes un excellent technicien.
J'ai appliqué l'astuce du délai de 2s. Mais faut-il la programmer à chaque requête ou une fois pour toute, au début du traitement d'une page Web ?

Reply

Marsh Posté le 11-01-2016 à 17:21:04    

 
           Lors du cas d'un objet inexistant à l'ouverture initiale de la page ou encore lors d'une mise à jour d'une page,
           la meilleure méthode reste de tester si l'objet est disponible …
 
           La temporisation peut échouer si elle n'est pas assez longue, si le site met plus de temps à répondre que d'habitude …
           Il n'y a pas de règle si ce n'est de temporiser quand c'est nécessaire ! Et cela varie d'un site à un autre !
           Quand je n'ai pas d'autre choix que de piloter IE, j'évite la temporisation sinon quand je ne vois pas comment faire autrement …
 

Reply

Marsh Posté le 12-01-2016 à 10:45:11    

Bonjour Marc,
 
Je suis désolé mais ta proposition ne fonctionne pas. Voici le code que j'ai écrit pour faire un test

Code :
  1. Sub Voirsite()
  2. Dim IEdoc As Object
  3. Dim DOCelement As Object
  4. Const Elt = "numeroExterne"
  5. With CreateObject("InternetExplorer.Application" )
  6.    .Visible = True
  7.    .Navigate ("https://www.pmu.fr/turf/#" & Format(Day(Now), "00" ) & _
  8.             Format(Month(Now), "00" ) & Year(Now))
  9.    While ie.Busy Or ie.ReadyState < 4:  DoEvents:  Wend
  10.    With .Document
  11.       Application.Wait Now + TimeValue("00:00:02" )
  12.       While Not IsObject(.all(Elt)):  DoEvents:  Wend
  13.          .all(Elt).Value = "3418158546"
  14.    End With
  15. End With
  16. a = b
  17. Temoin = 1
  18. ie.Quit
  19. End Sub


Que je mette ou non une temporisation en ligne 12, j'ai l'anomalie "424"
Y aurait-il quelque chose que je n'ai pas bien compris ?
Par contre cette solution fonctionne (au moins pour le 1er champ "numeroExterne"

Code :
  1. Sub titi()
  2. Dim IEdoc As Object
  3. Dim DOCelement As Object
  4. Set ie = CreateObject("InternetExplorer.Application" )
  5. ie.Visible = True
  6. ie.Navigate ("https://www.pmu.fr/turf/#" & Format(Day(Now), "00" ) & _
  7.             Format(Month(Now), "00" ) & Year(Now))
  8. While ie.Busy Or ie.ReadyState < 4:  DoEvents:  Wend
  9. Set IEdoc = ie.Document
  10. Application.Wait Now + TimeValue("00:00:02" )
  11. IEdoc.all("numeroExterne" ).Value = "3418158546"
  12. a = b
  13. Temoin = 1
  14. ie.Quit
  15. End Sub


Merci de me dire ce que tu en penses et bonne journée

Reply

Marsh Posté le 12-01-2016 à 11:24:21    

 
           Dans ta procédure Voirsite, le débogage indique la ligne n°10 en erreur et donc sans rapport !
           La variable objet ie de cette ligne n'a ni été déclarée ni même créée ‼
           Encore une fois, des variables pour ne les utiliser qu'une fois est un gâchis de ressources et de temps !
 
           Ton autre procédure passe sans souci de mon côté !
           Si ta connexion internet est lente, augmente alors la durée de pause à trois secondes ou plus,
           j'ai indiqué deux secondes à titre indicatif mais j'ai pourtant prévenu d'un possible échec si elle n'est pas assez longue, si le site rame …
 

Code :
  1. Sub Demo2()
  2.             Const ELT = "numeroExterne"
  3.     With CreateObject("InternetExplorer.Application" )
  4.         .Navigate ("https://www.pmu.fr/turf/#/" & Format(Day(Now), "00" ) _
  5.                                                 & Format(Month(Now), "00" ) & Year(Now))
  6.         .Visible = True
  7.         While .Busy Or .ReadyState < 4:  DoEvents:  Wend
  8.             With .Document
  9.                 While Not IsObject(.all(ELT)):  DoEvents:  Wend
  10.                 .all(ELT).Value = "3418158546"
  11.             End With
  12.     End With
  13. End Sub


         Je n'ai même pas besoin de la ligne n°9 car quand la page est prête (après la ligne n°7) l'élément "numeroExterne" est déjà disponible !
         Mais si ta connexion est lente, conserve alors cette sécurité …


Message édité par Marc L le 12-01-2016 à 11:53:20
Reply

Marsh Posté le 12-01-2016 à 11:30:50    

Effectivement. Merci pour cet éclairage. Je vois que rien ne t'échappe !
Bonne fin de journée à toi.

Reply

Marsh Posté le 14-01-2016 à 12:08:15    

amateursf a écrit :

Je vois que rien ne t'échappe !


           Pas toujours, la preuve pour la ligne de code n°4 :
 
           .Navigate ("https://www.pmu.fr/turf/#/" & Format(Now, "ddmmyyyy" ))
 

Reply

Marsh Posté le 14-01-2016 à 15:33:40    

Bonjour Marc,
 
Je reviens vers toi après 2 jours de tâtonnements infructueux.
Je tente de lancer un pari sur le site de PMU.FR et je me heurte à 2 choses :
1er)     Je ne parviens pas à choisir le mode de pari (Mise(s) de base ou Valeur), je reste toujours dans le premier mode.
2ème) Je ne parviens pas à indiquer le nombre de mise(s).
Voici un extrait HTML de l'endroit qui m'intéresse :

Code :
  1. <div id="pari-mise-PLACE" class="pari-mise">
  2.   <div class="mise-variant">N°2 - Placé</div> 
  3.   <div class="custom-select">
  4.     <span class="custom-select-value">Mise(s) de base</span>
  5.   <div class="toggle-list">
  6.       <span></span>
  7.   </div>
  8.     <select name="select">
  9.       <option value="nbMise">Mise(s) de base</option>
  10.       <option value="valeur">Valeur</option>
  11.     </select>
  12.   </div>
  13.   <div style="display: block;" class="nbMise bet-price">
  14.     <span style="display: inline;" class="pari-mise-unit"> x 1,50 €</span>
  15.     <input class="pari-mise-input" value="1" type="text">
  16.   </div>
  17. </div>


J'ai beau utiliser ce code pour sélectionner mon option :

Code :
  1. For Each element In IEdoc.GetElementById("pari-mise-PLACE" ).getElementsByTagName("SELECT" )(0). _
  2.                           getElementsByTagName("OPTION" )
  3.    If element.innerText = "Valeur" Then
  4.       element.Selected = True
  5.    Else:
  6.       element.Selected = False
  7.    End If
  8. Next


pour l'item (0) des options, Selected reste toujours "True" malgré ma programmation, par contre pour l'item (1), il passe bien de False à True ???
 
Puis le nombre de mise(s) m'échappe complètement. Je peux mettre n'importe quoi dans la Value de l'input, la mise reste toujours à 1
 
HELP STP
Merci par avance

Reply

Marsh Posté le 14-01-2016 à 16:14:26    

 
           Là je suis un peu paumé car je ne connais ni le site ni le principe, si j'ose dire ce n'est pas mon dada !
           Si je savais déjà quelle course est en placé … Là je n'ai pas trop le temps, je regarderais ce soir ou demain matin,
           avec des indications sur les manipulations depuis la page d'accueil, les choix, …
 
           Selon l'id du type de pari (ligne n°1), le choix du mode est dans l'élément de la ligne n°4
           reprenant le texte exact d'une des options de l'élément Select plus bas (lignes n°9 & 10).
 
           En pointant sur l'id, regarde quel élément a bien la classe custom-select : c'est là qu'il faudrait modifier son innerText
 
           Sinon il faudrait via l'outil d'inspection du navigateur voir l'évènement déclenché et son code mais si chiffrement cela serait coton !
 

Reply

Marsh Posté le 14-01-2016 à 16:20:28    

Ok merci Marc.
Je reste en attente de tes recherches.
Je continue de mon côté à investiguez en attendant.
A bientôt

Reply

Marsh Posté le 14-01-2016 à 16:35:54    


           J'attend des informations comme

Marc L a écrit :

quelle course est en placé …
des indications sur les manipulations depuis la page d'accueil, les choix, … 


           Je ne connais pas le site, je suis paumé et ce n'est pas mon dada …
 

Reply

Marsh Posté le 15-01-2016 à 09:00:14    

Quand tu as appelé le site PMU, tu cliques sur une course non courue (un numéro) par exemple Vincennes la 7 à 17h, là tu arrives sur un écran où tu dois choisir un cheval en cochant la colonne sélection (à droite). Ensuite, sur la roue des paris, tu cliques "e.simple", placé et après tu es dans la configuration évoquée par mon message HELP. Comment utiliser mises(s) de base ou valeur et comment modifier le nombre de mises ?  
Merci de t'intéresser à mon cas et à bientôt

Reply

Marsh Posté le 15-01-2016 à 12:21:29    

 
            Il n'y a aucune difficulté à forcer les éléments …
 

Code :
  1. Sub Demo3()
  2.             Const PB = "participant-base-"
  3.     With CreateObject("InternetExplorer.Application" )
  4.         .Navigate "https://www.pmu.fr/turf/#15012016/R1/C7/E_SIMPLE"
  5.         .Visible = True
  6.         While .Busy Or .ReadyState < 4:  DoEvents:  Wend
  7.             With .Document
  8.                 While Not IsObject(.all(PB & "3" )):  DoEvents:  Wend
  9.                 .all(PB & "3" ).all(0).Click
  10.                 .all("pari-variant-PLACE" ).Click
  11.                     With .all("pari-mise-PLACE" )
  12.                          .all(6).Selected = False
  13.                          .all(7).Selected = True
  14.                         .all(2).innerText = "Valeur"
  15.                         .all(9).innerText = ",00 €"
  16.                            .all(10).Value = "5"
  17.                     End With
  18.                 .all("montant-total" ).all(0).innerText = "5,00"
  19.             End With
  20.     End With
  21. End Sub


            … mais si ce n'est pas pris en compte dans le panier, alors là il faudra voir le code / évènement utilisé mais c'est assez coton !
 

Reply

Marsh Posté le 15-01-2016 à 13:41:53    

Merci beaucoup Marc.
J'étais toutefois parvenu au même résultat par des biais peut-être un peu différents mais qui donnaient des résultats identiques.
Effectivement, on peut forcer les éléments... au moins sur le papier car le pari final que je viens de tester avec ton code est toujours de 1,50€. Soit un pari unitaire en nbMise(s).
Dur, dur !!!

Reply

Marsh Posté le 15-01-2016 à 15:08:50    

 
            J'ai fait l'erreur de partir de ton code : en fait à la place de .all(6) & 7 c'est .all(5).Value = "valeur"
 
            Mais cela ne change rien car en ajoutant un cheval, le premier cheval revient sur la mise de base.
            J'ai essayé pour voir via le clavier, c'est verrouillé …
 
            Reste donc soit à contrôler la souris ou à intercepter le code, si un p'tit malin prend le relais …
 

Reply

Marsh Posté le 15-01-2016 à 15:21:29    

OK Marc.
Encore merci pour ton dévouement.
Ensemble, nous déclarons donc forfait sur cet écueil technique.
Je te souhaite un excellent WE.

Reply

Marsh Posté le 16-01-2016 à 11:55:31    

 
            Au lieu de piloter IE en VBA, tu pourrais voir du côté de AutoIt comme évoqué dans ce sujet


Message édité par Marc L le 16-01-2016 à 11:59:47
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed