[Résolu] Automatisation remplissage formulaire

Répondre
Partager Rechercher
Salut !

Pour le boulot je dois remplir un formulaire web, et je n'ai pas d'envoi groupé pour limité les actions identiques.
Pour moi l'idéal serait de remplir un tableau (genre en csv), et d'avoir un script/macro/autre ? qui remplisse les formulaires.

Les actions exhaustives sont : page d'accueil -> bouton qui n'est pas un lien -> 6 champs à remplir (avec des tabulations possibles)->enregistrement* (bouton qui lui aussi n'est pas un lien) ->arrivé sur la page d'accueil. recommencer autant de fois qu'il le faut

*
Code:
<button type="submit">Enregistrer</button>

Je cherche une solution de préférence sur linux (fork de debian).

J'ai commencé par quelques recherches, et j'arrive rapidement à la limite de mes connaissances en automatisation. Et surtout sur des solutions assez lourdes à mettre en place quand on est pas familier avec.

Pour mon besoin, vers quelle techno/méthode je dois m'orienter ?

Dernière modification par kéwa ; 24/05/2019 à 20h39.
La soumission du formulaire entraine une requete POST classique vers une URL ?
S'il n'y a pas de protection particulière sur le serveur pour empecher les requetes POST en masse, le plus simple serait de faire un script avec n'importe quel outil / langage dont tu es familier qui :
- lit tes données dans un fichier
- fabrique la requete HTTP POST en y mettant les données
- envoie cette requete au serveur
- passe à la ligne suivante. (avec a la limite un tout petit timer histoire de pas surcharger le serveur).
Bonne question, je pense.
Code:
<form action="../creation/160/" method="post" enctype="multipart/form-data">
Je ne suis familier avec aucun langage... (j'ai appris deux fois les base du HTML quoi)

Le site demande une authentification.

Je dois retravailler dessus aujourd'hui, je vais en profiter pour faire des tests sur ce qu'il se passe quand j'envoie le formulaire.
Regarde avec les outils du développeur (clic droit -> inspecter -> network sous chrome, il y a un équivalent sous firefox de mémoire), tu verras la requete qui part au moment où tu soumets le formulaire. Essaie de jouer cette requete en dehors pour voir ce qu'il se passe et si tes données sont bien enregistrées. Cependant, s'il faut une authentification sur le site, si c'est bien fait, ca ne sera pas si simple que ca ^^

D'autant que vu la tete de l'URL "Action", je suppose que "160" est l'id de l'objet a créer, qu'il faut donc changer à chaque fois (c'est assez bizarre comme fonctionnement d'ailleurs) ou alors qu'il est pré-créé et peut etre vérifié coté serveur.
Message supprimé par son auteur.
Citation :
Publié par Bjorn
D'autant que vu la tete de l'URL "Action", je suppose que "160" est l'id de l'objet a créer, qu'il faut donc changer à chaque fois (c'est assez bizarre comme fonctionnement d'ailleurs) ou alors qu'il est pré-créé et peut etre vérifié coté serveur.
En gros je créé une page qui par exemple est appelée ../160, là j'ai un bouton ajouter une entrée. Cela m'emmène sur une page "nouveau/160" et le formulaire part sur "création/160". Les entrée suivante sont sur la même url. Je peux rentrer 3 ou 4 entrées sur une page, comme 50... Et là ça devient vraiment fastidieux de recommencer 50 fois.
Quand je recréé une nouvelle page, ça passera à 161.
Citation :
Publié par Bjorn
Tu m'as complètement paumé sur ton besoin.
C'était pas volontaire

Dans l'histoire j'ai un site avec un wysiwyg qui me fait créer une page. Sur la page créer, je vais devoir ajouter ces entrées. Donc actuellement je clique sur "ajouter une entrée", je remplis les 6 champs, "enregistrer", ça me ramène à la page que j'ai créée, et je recommence autant de fois que j'ai d'entrée à ajouter.

Ce que je cherche à automatiser, c'est la partie où je dois remplir du formulaire en boucle de manière absurde.

Dès que je peux, je vais inspecter comment ça se passe entre deux entrée niveau formulaire.
Dans ce cas je pense que tu pars dans la mauvaise voie. Ne fais pas ta page avec le WYSIWYG mais fais la directement en HTML. Il y a très certainement moyen de modifier la page. Tu pourras faire du copier coller et changer ce que tu veux dans le code directement, ca sera bien plus rapide.

Après une page avec 50 champs de formulaire, dans l'absolu, ca me parait être une assez mauvaise idée et un léger problème de conception, mais ça c'est toi qui voit
Qu'est ce qui est un site pro ?
Le site que tu réalises en y ajoutant les champs de formulaire ? Raison de plus, ca me parait dingue d'avoir, sur un site pro, une page avec 50 champs de formulaire à remplir pour l'utilisateur final.
Le site que tu utilises pour créer la page est un site pro ? Raison de plus, il doit y avoir moyen de récupérer / accéder aux fichiers en FTP
Le site n'a pas 50 formulaires sur la page, juste une page, qui a un bouton "ajouter une entrée", qui mène à la page mis en capture avant. Et il faut faire en boucle "ajouter une entrée" tant qu'il y en a... 3 ça va, 30/40 ou plus, c'est la mort.

Je n'ai pas en mission de reprendre l’ergonomie et les méthodes de saisi, je n'ai pas de budget pour demander au dev qui a été missionné pour mettre une moulinette à csv/autre à la place. Ma solution, apprendre (j'aime bien ça) à automatiser mon travaille. Je ne sais juste pas vraiment par où commencer. (un peu plus maintenant)
Tu n'as qu'à utiliser un programme qui simule les frappes du clavier.

Il rentre le texte.
Il simule la touche TAB
Il rentre le texte.
Il simule la touche TAB
...
Il rentre le texte.
Il simule la touche TAB (plusieurs fois pour être sur "Enregistrer")
Il simule la touche Entrée

Un logiciel du type Autoit doit pouvoir te faire ça. (https://www.autoitscript.fr/forum/viewtopic.php?t=294)
AutoHotkey qui est basé sur Autoit peut à priori aussi faire ce que tu veux.

P.S. : je sais que cette méthode est "moche"

Dernière modification par Melchiorus ; 21/05/2019 à 18h27.
Message supprimé par son auteur.
La requête POST est sous cette forme :

Code:
Requête1
--1419
Content-Disposition: form-data; name="type[reference]"

A01
--1419
Content-Disposition: form-data; name="type[type]"

Appartement
[...]

Requête2
--9093
Content-Disposition: form-data; name="type[reference]"

A003
--9093
Content-Disposition: form-data; name="type[type]"

Appartement
[...]
Pour la partie ou je dois mettre l'illustration, ça me renvoie ça.
ne comprends pas vraiment ce qu'il en fait de l'image.
Code:
--1419
Content- Disposition: form- data; name = "type[ file]"; filename ="png"
Content -Type: image /png
PNG
Je regarderai ça pour l'option 2.
J'ai pu pratiquement tout faire en python avec ce qui ressemble à l'option 2 de @Ternel
exemple de code
Code:
from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.type('hello its me')  # or web.press(web.Key.SHIFT + 'hello its me')
web.press(web.Key.ENTER)
web.go_back()
web.click('Sign in')
web.type('mymail@gmail.com' , into='Email')
web.click('NEXT' , tag='span')
web.type('mypassword' , into='Password' , id='passwordFieldId')
web.click('NEXT' , tag='span') # you are logged in . woohoooo
C'est fonctionnel, mais il me manque toujours le moyen de compléter la partie sélection de fichier

Capture d’écran de 2019-05-23 22-03-10.png
Citation :
Publié par Melchiorus
Tu n'as qu'à utiliser un programme qui simule les frappes du clavier.

Il rentre le texte.
Il simule la touche TAB
Il rentre le texte.
Il simule la touche TAB
...
Il rentre le texte.
Il simule la touche TAB (plusieurs fois pour être sur "Enregistrer")
Il simule la touche Entrée

Un logiciel du type Autoit doit pouvoir te faire ça. (https://www.autoitscript.fr/forum/viewtopic.php?t=294)
AutoHotkey qui est basé sur Autoit peut à priori aussi faire ce que tu veux.

P.S. : je sais que cette méthode est "moche"
Autoit aurait clairement fait le taff avec les fonctions _IE mais il veut une solution linux.
Y'a surement un équivalent python.
Citation :
Publié par Cotino
Autoit aurait clairement fait le taff avec les fonctions _IE mais il veut une solution linux.
Y'a surement un équivalent python.
Je n'avais remarqué qu'après avoir posté qu'il préférait une solution sous Linux.
De ce que j'ai lu, on peut l'utiliser avec Wine mais pas à 100% de ses fonctionnalités.
J'ai pris la solution simple, j'ai utilisé du python et ça. J'ai une boucle qui lit chaque ligne de mon csv, et ça remplit et envoie mon formulaire. La seule étape que j'ai pas réussi à intégrer, c'est la partie ou je sélectionne un document à upload.

Dernière modification par kéwa ; 24/05/2019 à 13h56.
Message supprimé par son auteur.
Citation :
Publié par Ternel
Je suis pas un grand fan de Python, mais en utilisant webbot je n'ai pas trouvé de méthode pour envoyer le fichier dans une balise input.

En revanche aucun problème en utilisant selenium.
Moi non plus, mais la solution était assez simple pour que je m'en sorte. Même si avoir une pause dans ma boucle pour envoyer à la main mon fichier est assez frustrant.

Je vais essayer de mixer ça avec selenium.
Parfait pour selenium, ça a marché nickel.

Bon par contre j'ai du tout reprendre et abandonner webbot, mais ça va sur 20 ligne.

code pour ceux que ça intéresse
Code:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import csv

user = "user"
pwd = "pass"
driver = webdriver.Chrome()
driver.get("url/login/")

elem = driver.find_element_by_id("username")
elem.send_keys(user)
elem = driver.find_element_by_id("password")
elem.send_keys(pwd)
elem.send_keys(Keys.ENTER)
with open('file.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        else:
            colonne1 = row[0]
            colonne2 = row[1]
            driver.get(url)
            elem = driver.find_element_by_id("id")
            elem.clear()#vide la cellule
            elem.send_keys(colonne0)        
            driver.find_element_by_name("name").send_keys(colonne1)
            driver.find_element_by_xpath("//button[@type='submit']").click()
            print(f'\t{row[0]} {row[1]} {row[2]} {row[3]} {row[4]}')

            line_count += 1
    print(f'Processed {line_count} lines.')
driver.quit()

Dernière modification par kéwa ; 25/05/2019 à 22h46.
Message supprimé par son auteur.
Citation :
Publié par derioss
Ca reste moins dégueulasse qu'un autoit.

Ne pas oublier le driver.quit() à la fin pour fermer le brownser.
J'ai pu tester en condition réel, c'est plutôt propre. Un peu long, et pas optimisé, mais pour le temps de dev investi, ça le fait. Avant pour publier un formulaire ça me prenait 30 secondes et je devais contrôler pas mal d'info. Là en 30 secondes, il y a en 8 de fait.

J'ai pas mis le driver.quit() pendant les tests, et tant que je découvre tout ça. Mais oui c'est mieux avec.

édit : c'est vraiment une bonne solution débutant++ au final.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés