Piloter un site Web à partir de VBA - VB/VBA/VBS - Programmation
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 !
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
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 :
|
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 :
|
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 ?
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 …
Marsh Posté le 27-10-2015 à 14:24:13
Encore grand merci Marc L.
Voici mon nouvel obstacle :
Code :
|
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
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 …
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"> R2 C1 </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.
Marsh Posté le 29-10-2015 à 09:49:45
Comme indiqué dans mon précédent message …
Code :
|
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 :
|
A vous lire avec grand plaisir
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" )(n°)
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é …
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
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 …
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 :
|
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
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 …
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.
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 :
|
Ou ça marche ou ça marche pas ? Où est l'astuce ?
Merci par avance
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.
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 :
|
Marsh Posté le 08-01-2016 à 16:48:29
Merci beaucoup Marc, je vais tester cela ce week-end.
Bonne fin de semaine
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.
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 ?
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 …
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 :
|
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 :
|
Merci de me dire ce que tu en penses et bonne journée
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 :
|
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é …
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.
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" )) ‼
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 :
|
J'ai beau utiliser ce code pour sélectionner mon option :
Code :
|
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
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 !
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
Marsh Posté le 14-01-2016 à 16:35:54
J'attend des informations comme
Marc L a écrit : quelle course est en placé … |
Je ne connais pas le site, je suis paumé et ce n'est pas mon dada …
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
Marsh Posté le 15-01-2016 à 12:21:29
Il n'y a aucune difficulté à forcer les éléments …
Code :
|
… 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 !
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 !!!
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 …
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.
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 :
Quelqu'un pourrait-il m'aider ?
Merci par avance