Page 1 sur 1

[R] upload pdf dans un <form method=post><input type=file>

Posté : lun. 27 oct. 2014 15:59
par hugo3191
Bonjour à tous. J'ai commencé à m’intéresser à autoit récemment, et je rencontre une petite difficulté. J'ai longuement cherché sur le net, sans succès.
Voici mon soucis : je cherche à remplir un formulaire internet, qui me demande d'uploader un fichier pdf (ou tout autre format texte en réalité). Le formulaire est présenté ci-dessous :

Code : Tout sélectionner

<form action="/offre/286-S22-R000526_01R=1" accept-charset="UTF-8" method="post" id="atome-annonce-envoi-fichier-form" enctype="multipart/form-data" class="candid_form">

<div><span class="bouton-vert fileinput-button"><span class="right-arrow-button">Mon fichier</span> 

<input type="file" name="files[upload]" class="form-file candid_upload_field" onclick="dataLayer.push({'event': 'trackEvent', 'gtmCategory': 'Candid', 'gtmAction': 'Conversion', 'gtmLabel': 'Offer-ApplywithCV'});" id="edit-upload" size="1">

<input type="hidden" name="form_build_id" id="form-de47396b55799b014f9bb2d592963287" value="form-de47396b55799b014f9bb2d592963287">

<input type="hidden" name="form_id" id="edit-atome-annonce-envoi-fichier-form" value="atome_annonce_envoi_fichier_form">

</span></div></form>
J'ai essayé de nombreux code, notamment celui qui me paraissait le plus pertinent (et le plus simple) qui consiste à cliquer sur le bouton :

Code : Tout sélectionner

   
Global $oIE = _IECreate($urlForm, 1,1) 
Local $oSubmit
$oInputs = _IETagNameGetCollection($oIE, "input")
for $oInput in $oInputs
   if $oInput.type = "file" And $oInput.name = "files[upload]" And $oInput.id = "edit-upload" Then $oSubmit = $oInput
Next
_IEAction($oSubmit, "click")
Ce faisant, une boite de dialogue s'ouvre , me demandant de choisir le fichier à uploader.
Donc, d'une part je souhaiterais automatiser cette recherche du fichier à uploader, et d'autre part, une fois cliquer sur "ouvrir" de la boite de dialogue, reprendre le script autoit là où il en était. En effet, lorsque je choisi manuellement le fichier dans la boite de dialogue, il n'est pas uploader et le script s'arrête.

Est-il possible d'avoir un peu d'aide concernant l'upload de fichier dans un formulaire?
(J'ai vu une méthode qui consistait à simuler des clics de souris, mais cela ne fonctionne pas chez moi, bien qu'apparemment cela fonctionne chez tout le monde ...)

Je suis sous windows 8, et j'utilise IE 11

En vous remerciant

Cordialement

Re: [..] upload pdf dans un <form method=post><input type=fi

Posté : lun. 27 oct. 2014 17:48
par jbnh
Salut,

Voici un moyen pour bypasser ton problème. Inclut cependant un MouseClick. Dis moi si cette solution te convient

Code : Tout sélectionner

#include <IE.au3>

$oIE = _IE_Example("form")
$oT = _IEGetObjById($oIE, 'fileExample')
MouseMove(_IEPropertyGet($oT, "screenx") + _IEPropertyGet($oT, "width") - 10, _
          _IEPropertyGet($oT, "screeny") + _IEPropertyGet($oT, "height")/2)
MouseClick("left")
WinWait("Choisir un fichier à télécharger")
$hChoose = WinGetHandle("Choisir un fichier à télécharger")
ControlSetText($hChoose, "", "Edit1", "tonfichier.pdf")
ControlClick($hChoose, "", "Button1")

Re: [..] upload pdf dans un <form method=post><input type=fi

Posté : lun. 27 oct. 2014 18:21
par hugo3191
Bonjour,

Merci d'avoir pris le temps de me répondre. Cette solution ne fonctionne pas.

J'ai utilisé l'ID de la <form> puis celle de l'<input> sans aucun succès non plus.

En effet la souris se décale n'importe où, comme si elle ne suivait pas la commande mouseMove, ou bien comme si le IEPropertyGet retournait une mauvaise valeur.

De plus je ne comprend pas vraiment d'où sort ce -10 dans le mouseMove. en ce qui concerne le /2, j'imagine qu'il permet de se placer au milieu de la hauteur du bouton. Dans ce cas ne devrait-il pas y avoir la même valeur pour la largeur (et du coup enlever le -10)

Y a-t-il un moyen d'afficher les erreurs dans la console pour voir où est vraiment le problème?

Re: [..] upload pdf dans un <form method=post><input type=fi

Posté : lun. 27 oct. 2014 21:28
par orax
Dans le code source complet de la page, j'ai trouvé 2 balises input avec l'ID "edit-upload". La position du 1er est en haut de la page, ce qui explique ce problème étrange de mauvaises positions de la souris avec MouseMove().
► Afficher le texte

Re: [..] upload pdf dans un <form method=post><input type=fi

Posté : lun. 27 oct. 2014 21:37
par jguinch
Pour se passer de la position du bouton, on peut aussi faire ça :
► Afficher le texte

Re: [..] upload pdf dans un <form method=post><input type=fi

Posté : lun. 27 oct. 2014 23:51
par jbnh
Si vous arrivez déjà à ouvrir votre boite de dialogue, utilisez simplement le code suivant :

Code : Tout sélectionner

WinWait("Choisir un fichier à télécharger") ;ceci est le titre de cette boite de dialogue
$hChoose = WinGetHandle("Choisir un fichier à télécharger")
ControlSetText($hChoose, "", "Edit1", "tonfichier.pdf")
ControlClick($hChoose, "", "Button1")

Re: [..] upload pdf dans un <form method=post><input type=fi

Posté : mar. 28 oct. 2014 07:35
par hugo3191
Bonjour à tous !!!

Je me réveille, teste un peu les codes que vous avez eu la gentillesse de me faire parvenir, et surprise ... il y en a un qui fonctionne !!!!

Merci Orax, j'ai utilisé ton code :

Code : Tout sélectionner

$oDiv = _IEGetObjById($oIE, "block-application-buttons")
$hwndIE = _IEPropertyGet($oIE, "hwnd") ; handle de la fenêtre d'IE
WinWaitActive($hwndIE)
;ControlClick($hwndIE, "", "", "primary", 1, _IEPropertyGet($oDiv, "browserx") + 50, _IEPropertyGet($oDiv, "browsery") + 15)
#cs
    La ligne ControlClick(... pourrait être remplacée par (tester si ça marche mieux) :
        Sleep(200)
        MouseClick("primary", _IEPropertyGet($oDiv, "screenx") + 50, _IEPropertyGet($oDiv, "screeny") + 15, 1, 0)
#ce
Sleep(200)
        MouseClick("primary", _IEPropertyGet($oDiv, "screenx") + 50, _IEPropertyGet($oDiv, "screeny") + 35, 1, 0)
WinWait("Choisir un fichier à télécharger")
$hChoose = WinGetHandle("Choisir un fichier à télécharger")
ControlSetText($hChoose, "", "Edit1", "C:\Users\Hugo\Desktop\AUTOIT\OFFRES_EMPLOIS_AUTOMATIQUES\CV.pdf")
ControlClick($hChoose, "", "Button1", "primary")
J'ai cependant changé l'offset sur la coordonnée y qui était de 15 par 35 pour s'ajuster pile poil aux dimensions du bouton.
J'ai également enlevé le controlClick qui n'avait apparemment pas d'effet.

Je vais donc marquer ce sujet comme résolu ! Vous avez été d'une efficacité redoutable !!

Un grand merci !

Re: [R] upload pdf dans un <form method=post><input type=fil

Posté : mar. 28 oct. 2014 13:41
par alex1205
Au lieu d'utiliser des MouseClick (opération de boulet :p ), pourquoi ne pas utiliser les fonctions TCP pour envoyer le fichier avec la méthode POST?

Cordialement,
Alex1205

Re: [R] upload pdf dans un <form method=post><input type=fil

Posté : mar. 28 oct. 2014 13:46
par jbnh
Pcq les mouseclick c'est codé en dur, c'est badass !!

Non c'est vrai que tu as raison, mais les HTTP POST request en autoit c'est pas tjrs évident pour pas grand chose.

Dans son message initial il avait réussi à ouvrir la boite de dialogue avec un IEACTION click, il aurait du le garder et juste ajouter le code a partir du wingethandle...

Re: [R] upload pdf dans un <form method=post><input type=fil

Posté : mar. 28 oct. 2014 15:12
par orax
En se basant sur l'idée de jguinch :
► Afficher le texte
@jbnh
Mais comment faire ? Puisque le IEACTION click est bloquant. L'instruction qui suit le IEaction n'est exécutée qu'après la fermeture de la boîte de dialogue "Choisir un fichier à télécharger".

Code : Tout sélectionner

_IEAction($oSubmit, "click")
... attend la fermeture de la boîte de dialogue...
WinGetHandle("Choisir un fichier à télécharger") ; risque d'attendre longtemps !

Re: [R] upload pdf dans un <form method=post><input type=fil

Posté : mar. 28 oct. 2014 15:34
par jbnh
C'est juste, je n'y avais pas pensé, quid de :

Code : Tout sélectionner

Local $hWnd = _IEPropertyGet($oIE, "hwnd")
_IEAction($oSubmit, "focus")
ControlSend($oSubmit, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", "{Enter}")
 

Re: [R] upload pdf dans un <form method=post><input type=fil

Posté : mar. 28 oct. 2014 17:23
par mikell
alex1205 a écrit :Au lieu d'utiliser ..., pourquoi ne pas utiliser ...
Ce genre de remarque devrait s'accompagner d'un petit code d'exemple histoire de ne pas se fondre dans la masse bourbeuse des conseils "yaka" :mrgreen:

Re: [R] upload pdf dans un <form method=post><input type=fil

Posté : mar. 28 oct. 2014 20:44
par orax
jbnh a écrit :C'est juste, je n'y avais pas pensé, quid de :

Code : Tout sélectionner

Local $hWnd = _IEPropertyGet($oIE, "hwnd")
_IEAction($oSubmit, "focus")
ControlSend($oSubmit, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", "{Enter}")
 
Avec {Enter} au lieu de {space}, le formulaire est envoyé directement sans pouvoir choisir le fichier.

Autre chose qui fonctionne (sans avoir à envoyer {SPACE}) :
Important : s'il y a &#058; dans le code alors il faut le remplacer par ":".
► Afficher le texte

Re: [R] upload pdf dans un <form method=post><input type=fil

Posté : mar. 28 oct. 2014 21:37
par jguinch
@orax : c'est vraiment plus propre, bravo ! :D