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

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
hugo3191
Niveau 1
Niveau 1
Messages : 3
Enregistré le : lun. 27 oct. 2014 15:32
Status : Hors ligne

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

#1

Message 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
Modifié en dernier par hugo3191 le mar. 28 oct. 2014 07:40, modifié 2 fois.
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

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

#2

Message 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")
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
hugo3191
Niveau 1
Niveau 1
Messages : 3
Enregistré le : lun. 27 oct. 2014 15:32
Status : Hors ligne

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

#3

Message 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?
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#4

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

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

#5

Message par jguinch »

Pour se passer de la position du bouton, on peut aussi faire ça :
► Afficher le texte
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

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

#6

Message 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")
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
hugo3191
Niveau 1
Niveau 1
Messages : 3
Enregistré le : lun. 27 oct. 2014 15:32
Status : Hors ligne

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

#7

Message 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 !
alex1205
Niveau 5
Niveau 5
Messages : 123
Enregistré le : dim. 07 mars 2010 13:59
Status : Hors ligne

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

#8

Message 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
Le "je ne sais pas" et "j'y arrive pas" n'existe dans mon vocabulaire. Toutes Questions ont une réponse, cherchez et vous la trouverai. Utilisez Recherche du forum et vous verrez. Si [blink]Aucune[/blink] question ne tient à votre problème, créez un sujet.
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

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

#9

Message 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...
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#10

Message 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 !
Modifié en dernier par orax le mar. 28 oct. 2014 16:30, modifié 1 fois.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

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

#11

Message 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}")
 
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#12

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#13

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

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

#14

Message par jguinch »

@orax : c'est vraiment plus propre, bravo ! :D
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Répondre