Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1367 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Piloter un site Web à partir de VBA

 



 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Piloter un site Web à partir de VBA

n°2268357
amateursf
Posté le 23-10-2015 à 16:07:14  profilanswer
 

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
 :)

mood
Publicité
Posté le 23-10-2015 à 16:07:14  profilanswer
 

n°2268360
Marc L
Posté le 23-10-2015 à 17:00:54  profilanswer
 

 
           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 !
 

n°2268379
amateursf
Posté le 24-10-2015 à 11:12:37  profilanswer
 

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
:)

n°2268384
Marc L
Posté le 24-10-2015 à 14:53:23  profilanswer
 

 
           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


 

n°2268385
Marc L
Posté le 24-10-2015 à 15:09:53  profilanswer
 

 
           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


 

n°2268543
amateursf
Posté le 27-10-2015 à 11:37:08  profilanswer
 

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

n°2268569
Marc L
Posté le 27-10-2015 à 12:41:15  profilanswer
 

 
           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 …
 

n°2268583
amateursf
Posté le 27-10-2015 à 14:24:13  profilanswer
 

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

n°2268629
Marc L
Posté le 27-10-2015 à 19:28:56  profilanswer
 

 
           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 …
 

n°2268663
amateursf
Posté le 28-10-2015 à 09:17:06  profilanswer
 

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.

mood
Publicité
Posté le 28-10-2015 à 09:17:06  profilanswer
 

n°2268775
Marc L
Posté le 29-10-2015 à 09:49:45  profilanswer
 

 
           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


 

n°2268785
amateursf
Posté le 29-10-2015 à 11:42:43  profilanswer
 

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

n°2268796
Marc L
Posté le 29-10-2015 à 14:02:55  profilanswer
 

 
           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é …
  

n°2268842
amateursf
Posté le 30-10-2015 à 10:14:35  profilanswer
 

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

n°2268863
Marc L
Posté le 30-10-2015 à 13:13:28  profilanswer
 

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

n°2272793
amateursf
Posté le 05-01-2016 à 17:56:17  profilanswer
 

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

n°2272849
Marc L
Posté le 06-01-2016 à 10:37:16  profilanswer
 

 
           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 …
 

n°2272860
amateursf
Posté le 06-01-2016 à 13:16:18  profilanswer
 

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

n°2272867
Marc L
Posté le 06-01-2016 à 14:26:28  profilanswer
 

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

n°2273011
amateursf
Posté le 08-01-2016 à 12:29:35  profilanswer
 

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

n°2273036
amateursf
Posté le 08-01-2016 à 16:17:42  profilanswer
 

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.

n°2273037
Marc L
Posté le 08-01-2016 à 16:17:52  profilanswer
 

           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
n°2273043
amateursf
Posté le 08-01-2016 à 16:48:29  profilanswer
 

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

n°2273045
Marc L
Posté le 08-01-2016 à 17:00:52  profilanswer
 

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
n°2273224
amateursf
Posté le 11-01-2016 à 15:30:24  profilanswer
 

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 ?

n°2273229
Marc L
Posté le 11-01-2016 à 17:21:04  profilanswer
 

 
           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 …
 

n°2273277
amateursf
Posté le 12-01-2016 à 10:45:11  profilanswer
 

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

n°2273281
Marc L
Posté le 12-01-2016 à 11:24:21  profilanswer
 

 
           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
n°2273283
amateursf
Posté le 12-01-2016 à 11:30:50  profilanswer
 

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

n°2273406
Marc L
Posté le 14-01-2016 à 12:08:15  profilanswer
 

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" ))
 

n°2273409
amateursf
Posté le 14-01-2016 à 15:33:40  profilanswer
 

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

n°2273419
Marc L
Posté le 14-01-2016 à 16:14:26  profilanswer
 

 
           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 !
 

n°2273420
amateursf
Posté le 14-01-2016 à 16:20:28  profilanswer
 

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

n°2273424
Marc L
Posté le 14-01-2016 à 16:35:54  profilanswer
 


           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 …
 

n°2273453
amateursf
Posté le 15-01-2016 à 09:00:14  profilanswer
 

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

n°2273467
Marc L
Posté le 15-01-2016 à 12:21:29  profilanswer
 

 
            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 !
 

n°2273483
amateursf
Posté le 15-01-2016 à 13:41:53  profilanswer
 

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 !!!

n°2273492
Marc L
Posté le 15-01-2016 à 15:08:50  profilanswer
 

 
            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 …
 

n°2273496
amateursf
Posté le 15-01-2016 à 15:21:29  profilanswer
 

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

n°2273561
Marc L
Posté le 16-01-2016 à 11:55:31  profilanswer
 

 
            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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Piloter un site Web à partir de VBA

 

Sujets relatifs
[Excel/VBA] Pivot table - Filtrer automatiquement sur une liste d'IDCréer un site internet
[EXCEL/VBA] Automatiser remplissage de fichier[EXCEL ou VBA] Chercher une valeur parmi un ensemble de valeur
Intégration d'une partie d'un site externe dans mon siteapprendre le php meilleur site?
Projet de Création d'un site web Développeur + Graphiste designere voudrais lancer plusieurs script Perl à partir d'un autre script Per
CMT DEV. Un site dynamique indexéQue pensez vous de mes sources pour protéger un site Web ?
Plus de sujets relatifs à : Piloter un site Web à partir de VBA


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR