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

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 ?
  • 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

Rechercher des sujets similaires à "automatiser action internet jquery"