Traitée Automatiser un téléchargement sous IE

  • mardi 6 septembre 2011 15:23
     
     

    Bonjour,

    Je cherche via VBA à automatiser un téléchargement de fichier sous IE. Je lance IE, je soumets mon url de login, j'attends "ready_state", je soumets l'url de téléchargement.

    A ce stade un popup m'est renvoyé me demandant "ouvrir" ou "enregistrer" ou "annuler". Je voudrais me substituer à la réponse manuelle pour enregistrer puis sur le popup qui doit s'ouvrir en suivant donner le nom du fichier pour l'enregistrement.

    Problème : lorsque le popup arrive IE tourne encore donc on n'est pas en ready_state. Il faut une boucle qui surveille l'arrivée du popup, puis qui simule l'action "enregistrer" (sendkeys peut-être ?). Ensuite un même genre de boucle pour faire le save as sur la box qui s'affiche. J'ai trouvé des infos sur la création de dialogbox qu'on propose à l'utilisateur, mais rien sur une réponse à un dialogbox à la place de l'utilisateur. 

    Comment faire pour tester l'apparition de ces dialogbox et simuler la réponse de l'utilisateur ?

    Merci d'avance.

    Mon code pour le début de la proc est de ce type :

    Set IE = CreateObject("InternetExplorer.Application")

    IE.Visible = True

    IE.navigate "url de login" 

    Do Until IE.readyState = READYSTATE_COMPLETE
    DoEvents
    Loop 'attend la fin du chargement de la page

    IE.navigate "url du téléchargement"

                   ... et après gestion de l'attente du popup et réponse ???

Toutes les réponses

  • mardi 6 septembre 2011 13:55
     
     

    Bonjour,

    Je cherche via VBA à automatiser un téléchargement de fichier sous IE. Je lance IE, je soumets mon url de login, j'attends "ready_state", je soumets l'url de téléchargement.

    A ce stade un popup m'est renvoyé me demandant "ouvrir" ou "enregistrer" ou "annuler". Je voudrais me substituer à la réponse manuelle pour enregistrer puis sur le popup qui doit s'ouvrir en suivant donner le nom du fichier pour l'enregistrement.

    Problème : lorsque le popup arrive IE tourne encore donc on n'est pas en ready_state. Il faut une boucle qui surveille l'arrivée du popup, puis qui simule l'action "enregistrer" (sendkeys peut-être ?). Ensuite un même genre de boucle pour faire le save as sur la box qui s'affiche. J'ai trouvé des infos sur la création de dialogbox qu'on propose à l'utilisateur, mais rien sur une réponse à un dialogbox à la place de l'utilisateur. 

    Comment faire pour tester l'apparition de ces dialogbox et simuler la réponse de l'utilisateur ?

    Merci d'avance.

    Mon code pour le début de la proc est de ce type :

    Set IE = CreateObject("InternetExplorer.Application")

    IE.Visible = True

    IE.navigate "url de login" 

    Do Until IE.readyState = READYSTATE_COMPLETE
    DoEvents
    Loop 'attend la fin du chargement de la page

    IE.navigate "url du téléchargement"

    ... ???

  • mardi 6 septembre 2011 14:53
     
     

    Bonjour,

    Vous etes pas dans le bon forum, ici c'est ce qui concerne Visual Basic .net

    il est sur que c'est un langage tres proche du VBA mais les objets, tant a eux, sont très différent, vous aurez plus de chance dans le forum bureautique (version)

     

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
  • mardi 6 septembre 2011 15:12
     
     
    Ok merci.
  • mercredi 7 septembre 2011 07:47
     
     
    Bonjour Xavier,
    On est bien ici sur un forum VBA. Il suffit de parcourir les fils du
    forum.
    Cordialement.
    Daniel
     
     
     
  • mercredi 7 septembre 2011 08:37
     
     

    Danielco,

    Ce Thread était dans le forum Visual Basic :)

    Bonne journée a tous

     

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
  • jeudi 8 septembre 2011 06:20
     
     

    Bonjour

    Pour simuler la réponse, on fait ça avec un SendKey, mais comment attendre ? Je ne sais pas.


    A+

  • jeudi 8 septembre 2011 09:51
     
     

    Pour simuler la réponse, on fait ça avec un SendKey, mais comment attendre ? Je ne sais pas.

    Correction : SendKeys


    A+

  • jeudi 8 septembre 2011 09:54
     
     

    J'ai essayé application.wait (now + quelques secondes) et sendkeys, mais pas de résultat probant, le sendkeys ne cible apparemment pas le dialogbox.

     

  • jeudi 8 septembre 2011 15:08
     
     
    bonjour zz_top,
     
    tu trouveras un autre exemple ici,
     
     
    --
    isabelle
     
     
  • jeudi 8 septembre 2011 16:21
     
     
    Merci Isabelle, cela étant, dans mon cas je ne peux pas préciser comme dans l'exemple l'adresse du fichier à télécharger. Je suis donc obligé de mettre en oeuvre un pilotage des dialogbox classiques de téléchargement que me retourne mon lien de download.
  • jeudi 8 septembre 2011 18:48
     
     
    re bonjour zz_top,
     
    tu pourrais lister les objets de ta page avec la macro suivante et t'inspirer de ce code pour naviguer sur ta page,
     
    Sub ListeDesObjectsPageWeb()
     
    'necessite d'activer la reference Microsoft HTML Objects Library
    'necessite d'activer la reference Microsoft Internet Controls
     
    Dim i As Integer, x As Integer, rw As Integer
    Dim IE As InternetExplorer
    Dim maPageHtml As HTMLDocument
    Dim Helem As IHTMLElementCollection
    Dim eTagName
    Set IE = CreateObject("internetExplorer.Application")
    rw = 1
    Do Until IE.readyState = READYSTATE_COMPLETE
    DoEvents
    Loop
    Set maPageHtml = IE.Document
     
    eTagName = Array("DIV", "LI", "SPAN", "input")
     
    For x = LBound(eTagName) To UBound(eTagName)
    Set Helem = maPageHtml.getElementsByTagName(eTagName(x))
    For i = 0 To Helem.Length - 1
    Range("A" & rw) = i
    Range("B" & rw) = Helem(i).getAttribute("parentElement")
    Range("C" & rw) = Helem(i).getAttribute("tagName")
    Range("D" & rw) = Helem(i).getAttribute("className")
    Range("E" & rw) = Helem(i).getAttribute("constructor")
    Range("F" & rw) = Helem(i).getAttribute("id")
    Range("G" & rw) = Helem(i).getAttribute("name")
    Range("H" & rw) = Helem(i).getAttribute("value")
    Range("I" & rw) = Helem(i).getAttribute("type")
    rw = rw + 1
    Next
    Next
     
    IE.Quit
    Set Helem = Nothing
    Set maPageHtml = Nothing
    Set IE = Nothing
    MsgBox "Fin de la recherche"
    End Sub
     
    --
    isabelle
      Le 2011-09-08 12:21, zz_top a écrit :
    > Merci Isabelle, cela étant, dans mon cas je ne peux pas préciser comme dans l'exemple l'adresse du fichier à télécharger. Je suis donc obligé de mettre en oeuvre un pilotage des dialogbox classiques de téléchargement que me retourne mon lien de download.
     
  • vendredi 9 septembre 2011 13:22
     
     Traitée

    Thanks again Isabelle,

    J'ai essayé ta méthode pour lister les objets de la page. Intéressant, mais apparemment la box n'apparait pas. 

    J'ai cherché dans une autre direction, et j'ai trouvé qqchose qui a tendance à fonctionner (parfois ça bloque sur la box). Ca donne ça :

    Set wshShell1 = CreateObject("WScript.Shell")
        While Not wshShell1.AppActivate("Téléchargement de fichiers")
            DoEvents
            bfound = wshShell1.AppActivate("Téléchargement de fichiers")
        Wend
         If bfound Then wshShell1.SendKeys "{TAB}"
        Sleep (1000)
         If bfound Then wshShell1.SendKeys "%r"
        Sleep (1000)
        DoEvents
       
        While Not wshShell1.AppActivate("Enregistrer sous")
            DoEvents
            bfound = wshShell1.AppActivate("Enregistrer sous")
        Wend
        bfound = wshShell1.AppActivate("Enregistrer sous")
        If bfound Then wshShell1.SendKeys "%N"
        Sleep (1000)
        If bfound Then wshShell1.SendKeys "Mon emplacement de fichier sur disque"
        Sleep (1000)
        If bfound Then wshShell1.SendKeys "%E"
        Sleep (1000)
        wshShell1.SendKeys "%O"
        Sleep (1000)


      Il faut au préalable faire un declare de la proc "Sleep". Certains "if bfound Then" sont sans doute superflus dans ce code et les tempo doivent pouvoir être réduites.

    C'est un peu artisanal, ça se fonde sur les noms des box ou sur des timer, mais je n'ai pas trouvé mieux. 

    Merci de ton aide.

    zz_top

  • lundi 12 septembre 2011 06:34
    Propriétaire
     
     

    Bonjour,

     

    Merci d’avoir partagé avec nous la solution trouvée.

     

    Bonne journée,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.