Automatiser action sur Internet - JQuery
Hello tout le monde,
Dans le but d'automatiser une action très répétitive sur internet, j'essaye d'écrire un code qui me permettra de la faire. Sur la partie HTML, tout se passe bien, j'arrive à faire ce que je veux.
Par contre, je dois demander à ma macro d'appuyer sur un bouton dont l'ID change à chaque actualisation de la page. Aussi la class apparait plusieurs fois dans le code.
Voici mon code VBA que j'ai commencé à élaborer :
Sub WaitIE(IE As InternetExplorer)
'On boucle tant que la page n'est pas totalement chargée
Do Until IE.readyState = READYSTATE_COMPLETE
DoEvents
Loop
End Sub
Sub RechercheVBAExcel()
'Déclaration des variables
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim InputListe1Bouton As HTMLInputElement
Dim inputCollection As HTMLElementCollection
IE.navigate "https://URL.fr" 'Chargement d'une page Web Google
IE.Visible = True 'Affichage de la fenêtre IE
WaitIE IE 'On attend le chargement complet de la page
Set IEDoc = IE.document
Set InputListe1Bouton = IEDoc.all("coche 1")
InputListe1Bouton.Click
For Each elem In IEDoc.getElementsByClassName("Name class")
If InStr(elem.innerText, "Text") > 0 Then elem.Click: Exit For
Next elem
'Ou Html.querySelectorAll("#gsw_sidebar_startmenuitem span.clickable")(1).Click
'A vrai dire, cette partie je ne la comprend pas trop, je l'ai récupéré sur internet je pense qu'elle peut être une partie de la solution
WaitIE IE 'On attend la fin de la recherche
Set IE = Nothing
Set IEDoc = Nothing
End Sub
Voici le code HTML :
'<button class="Name class" id="button5e5ec675d0c9b" type="submit" value="Lancer l'action" version="textButtonV1">Lancer l'action</button>
'<script id="button5e6023cc45725_script" type="text/javascript">
' jQuery(function() {
' jQuery('button#button5e6023cc45725').click(function () {
' jQuery(window).trigger('buttonClicked', [this, {"type":"submit","value":"Lancer l'action","name":"","id":"button5e6023cc45725","class":"Name class","title":"","confirm":"","onclick":"","version":"textButtonV1"}]);
' });
' });
'</script>
J'espère que tout est clair, si jamais j'essaierai de vous réexpliquer plus clairement.
Merci d'avance,
Erwan
Bonjour,
Tu peux essayer de trouver le bouton sans son ID ...
- Combien y-a-t'il de bouton submit sur la page ? cela peut être une voie.
- S'il y en a plusieurs, alors quel est l'ID de la form qui contient ce bouton ?
- Ou alors tu balayes tous les boutons et tu testes
like "button*"
Hello Steelson,
Merci de te pencher sur le sujet
Le code que tu m'as proposé nous rapproche de la solution car la page s'actualise. Mais la macro ne clique pas sur le bon bouton parce qu’effectivement j'ai plusieurs submit (12 il me semble)
Je ne suis pas certain de ce que tu veux dire par l'ID de submit, mais voilà ce que j'ai :
<div class="listEntry" id="list874">
<form action="URL2" method="post">
<input name="action" type="hidden" value="start">
<input name="a" type="hidden" value="f52">
<input name="sort" type="hidden" value="distance">
<input name="direction" type="hidden" value="asc">
<input name="lid" type="hidden" value="874">
Et un plus bas je retrouve le code du post précédent sans aucun submit entre ces morceaux de code
'<button class="Name class" id="button5e5ec675d0c9b" type="submit" value="Lancer l'action" version="textButtonV1">Lancer l'action</button>
'<script id="button5e6023cc45725_script" type="text/javascript">
' jQuery(function() {
' jQuery('button#button5e6023cc45725').click(function () {
' jQuery(window).trigger('buttonClicked', [this, {"type":"submit","value":"Lancer l'action","name":"","id":"button5e6023cc45725","class":"Name class","title":"","confirm":"","onclick":"","version":"textButtonV1"}]);
' });
' });
'</script>
Erwan
Peux-tu transmettre l'intégralité du code source ?
Sinon (je comprendrais), donne le résultat de ceci
For Each elem In IEDoc.getElementsByTagName("button")
If elem.Type = "submit" Then
Debug.Print elem.ID
End If
Next elem
le résultat se trouve dans la fenêtre d'exécution de VBE (Ctrl+G)
voire même
For Each elem In IEDoc.getElementsByTagName("button")
If elem.Type = "submit" Then
Debug.Print elem.class
Debug.Print elem.ID
Debug.Print elem.Value
End If
Next elem
Je te transférerais le code ce soir, actuellement je ne peux pas.
J'ai fait tourner ton code et la seule fois où je récupère des données dans la fenêtre d'exécution est avec ce code :
For Each elem In IEDoc.getElementsByTagName("button")
If elem.Type = "submit" Then
Debug.Print elem.ID
End If
Next elem
Et je récupère ça :
button5e60cf36f32b6
button5e60cf36f3944
button5e60cf3701661
button5e60cf3702c4e
En l'occurrence il s'agit des 4 boutons présent sur ma page et dans notre cas, je dois appuyer sur le 3e
Edit : Petite précision, je sais à chaque fois que je lance la macro je sais sur quel bouton appuyer donc si on sait spécifier le numéro du bouton, je pense que c'est banco
Erwan
Dans ce cas, si c'est toujours le 3ème, mets un compteur !
For Each elem In IEDoc.getElementsByTagName("button")
compteur = 0
If elem.Type = "submit" Then
compteur = compteur + 1
If compteur = 3 Then
elem.Click
Exit For
End If
End If
Next elem
Je pense quand même qu'il serait plus stable de trouver un moyen de piéger la form, puis le button submit dans cette form.
Mais si cela fonctionne avec un compteur, pourquoi pas !
On se rapproche de la solution
Le code que tu m'as proposé n'actualise pas la page donc je pense qu'il n'appuie pas sur le bouton
J'ai donc essayé d'autres combinaisons :
- Changement de place du compteur pour que le + 1 se fasse après le clique
- J'ai changé le code de manière à devoir appuyer sur le 1er bouton pour avoir le résultat désiré. Je modifie le code pour avoir comme ci dessous :
Et là tout fonctionne très bien
For Each elem In IEDoc.getElementsByTagName("button")
compteur = 0
If elem.Type = "submit" Then
If compteur = 0 Then
elem.Click
compteur = compteur + 1
Exit For
End If
End If
Next elem
Il doit y avoir quelque chose à faire avec le compteur
Si jamais tu n'as pas d'idées je tenterais des choses ce soir
Erwan
Et là tout fonctionne très bien
For Each elem In IEDoc.getElementsByTagName("button") compteur = 0 If elem.Type = "submit" Then If compteur = 0 Then elem.Click compteur = compteur + 1 Exit For End If End If Next elem
Si ceci fonctionne, alors c'est le premier submit qui est à activer et le compteur ne sert à rien.
Je me suis mal expliqué sorry
Yes effectivement, ca fonctionne avec 0 mais dans la réalité, je dois tout de même activer le 3ème bouton et quand je programme le compteur à 3, ce ne fonctionne pas
Qu'est-ce qui te fait dire que c'est le 3ème bouton ?je dois tout de même activer le 3ème bouton et quand je programme le compteur à 3, ce ne fonctionne pas
- Est-ce le debug.print
après avoir comparé le code source ? (attention à ce qu'il ne se régénère pas entre les 2 affichages)
- Est-ce l'apparition sur la page ? c'est peut-être un faux ami car ce bouton est généré par un script (javascript) et il s'en suit un "DOM" qui est propre à la page
Il faudrait pouvoir justement décoder entièrement ce DOM (direct object modeling)
Une autre façon de faire serait d'extraire de la page la portion qui contient le formulaire et a priori le seul bouton submit.
Ce n'est pas facile en aveugle sans disposer du site (tu peux toujours m'envoyer le site ou seulement le code source en mp).
J'ai fait tourner ton code et la seule fois où je récupère des données dans la fenêtre d'exécution est avec ce code :
For Each elem In IEDoc.getElementsByTagName("button") If elem.Type = "submit" Then Debug.Print elem.ID End If Next elem
et avec celui-ci ...
voire même
For Each elem In IEDoc.getElementsByTagName("button") If elem.Type = "submit" Then Debug.Print elem.class Debug.Print elem.ID Debug.Print elem.Value End If Next elem
que se passe-t-il ? tu 'as rien car il émet une erreur ?
ajoute un on error resume next
avant le for, et un .name aussi
On Error Resume Next
For Each elem In IEDoc.getElementsByTagName("button")
If elem.Type = "submit" Then
Debug.Print "class : " & elem.class
Debug.Print "ID : " & elem.ID
Debug.Print "value : " & elem.Value
Debug.Print "name : " & elem.Name
End If
Next elem
Salut Steelson,
Désolé, j'ai été pris par le boulot.
J'ai finalement réussi à résoudre le problème grâce à ton code et le compteur. Je ne sais pas ce que j'avais foutu
Un grand merci, ca va m'être d'une grande aide.
Erwan