PowerShell : Compléter champs web

PowerShell : Compléter champs web - Shell/Batch - Programmation

Marsh Posté le 03-01-2019 à 16:27:53    

Bonjour,
 
En PowerShell, je souhaite remplir des champs html automatiquement.
Le site html semble simple :
 

Code :
  1. <input type="text" name="monlogin" size="15" maxlength="15"/>
  2. <input type="password" name="elcode" size="15" maxlength="15"/>
  3. <input type="submit" name="go" value="log on" class="x1">
  4. <input type="reset" value="  refaire  " class="x2">


 
 
Je me suis inspiré de ce code qui fonctionne (sic) avec Office mail 365 en remplaçant "getElementById" par "getElementsByTagName" car dans le html ci-dessus il y a un nom pas d'ID de champs, seulement un name. :
 
 
 

Code :
  1. # Remplacer les valeurs suivantes par vos informations
  2. $loginpage = "https://monnouveausite.com"
  3. $username= "moncompte"
  4. $password= "monmotdepasse"
  5. # On crée l'objet qui va permettre l'ouverture de la page
  6. $ie = New-Object -com internetexplorer.application;
  7. # Tant que les champs 'User' et 'Password' n'ont pas été remplis, on cache la page
  8. $ie.visible = $false
  9. # Le browser navige jusqu'à la page de login définie plus haut
  10. $ie.navigate($loginpage)
  11. # Le script attend que la page charge
  12. while($ie.ReadyState -ne 4) {start-sleep -m 100}
  13. # On popule les champs requis par nos informations de login
  14. # Les ID sont ceux présents dans le code HTML de la page
  15. $ie.Document.getElementsByTagName("monlogin" ).value = $username
  16. $ie.Document.getElementsByTagName("elcode" ).value = $password
  17. sleep -Seconds 2
  18. # On clique sur le boutton, l'id est celui trouvé dans le code HTML
  19. $ie.Document.getElementsByTagName("go" ).click()
  20. # A ce moment on affiche la page web
  21. $ie.visible=$true


(le code est bien plus lisible sur le lien mais sans mes petites modif' évoquées :) )
 
 
 
Le résultat est que la page d'ouvre bien... Mais il ne se passe rien !
Les champs ne se remplissent pas, et le formulaire n'est pas soumis.
 
Je n'ai pas d'erreur, je ne vois pas ou cela bloque... ?
 
D'avance, merci à vous ! :)
 
Jpass


Message édité par jpass2 le 04-01-2019 à 14:50:40
Reply

Marsh Posté le 03-01-2019 à 16:27:53   

Reply

Marsh Posté le 03-01-2019 à 16:54:28    

getElementsByTagName returne un tableau, il faut donc rajouter le bon indexe. Par contre c'est pas la bonne fonction je pense, c'est pour des tag HTML genre <div> ou <input>, pas pour des name=. On pourrait tenter un getElementsByTagName("input" )[0/1]. Et je suis pas sûr si il faut pas mettre de minuscule à "Document".

Reply

Marsh Posté le 04-01-2019 à 12:20:14    

Salut Rat de combat,
 
Merci de ton retour mais je suis franchement désolé, je n'ai pas tout compris à ce que tu essayes de me faire comprendre ! Je n'ai probablement pas encore une expérience suffisante pour en être capable :)
 
Si tu peux ré expliciter, merci :)  
 
La seule affirmation que je peux te dire, c'est que le bout de code original fonctionne sur mail365, donc avec un D majuscule à "Document" :)
 
Merci !!

Reply

Marsh Posté le 04-01-2019 à 13:45:04    

Comme tu as 4 types différents, tu peux faire  

Code :
  1. document.querySelectorAll('input[type=text]')[0].value = $username;
  2. document.querySelectorAll('input[type= password]')[0].value = $password;


 

Reply

Marsh Posté le 04-01-2019 à 14:10:45    

David Boring a écrit :

Comme tu as 4 types différents, tu peux faire

Code :
  1. document.querySelectorAll('input[type=text]')[0].value = $username;
  2. document.querySelectorAll('input[type= password]')[0].value = $password;
 



Salut David, merci de ton aide !

 

J'ai remplacé ces 2 lignes : $ie.Document.getElementsByTagName("monlogin" ).value = $username et $ie.Document.getElementsByTagName("elcode" ).value = $password par ce que tu m'as donné (avec et sans le "$ie." ) mais... pas mieux...  :??:


Message édité par jpass2 le 04-01-2019 à 14:15:48
Reply

Marsh Posté le 04-01-2019 à 14:17:11    

En vrai js, cela fonctionne pourtant.
Désolé, je ne connais pas PowerShell
 

Reply

Marsh Posté le 04-01-2019 à 14:33:08    

Peut-être un début d'explication, j'ai rajouté des espions :  
 
write-host T1
while($ie.ReadyState -ne 4) {start-sleep -m 100}  
write-host T2
 
Le T2 ne s'affiche jamais... ?
C'est pourtant un code qui est utilisé partout.
Qui plus est, lorsque je test la version originale du code, tout fonctionne correctement... ?
Je n'ai pas changé grand chose mais cela vient forcément de là...  :whistle:  
 
Merci.


Message édité par jpass2 le 04-01-2019 à 15:57:57
Reply

Marsh Posté le 04-01-2019 à 15:30:22    

Et la page continue de s'afficher ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 04-01-2019 à 15:56:58    

yes...
Elle me nargue de s'afficher sans aucune erreur apparente ! :@

Reply

Marsh Posté le 04-01-2019 à 16:29:26    

Quel est le contenu de la fameuse page ? Une fois affichée, il n'ya plus rien qui charge nulle part ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 04-01-2019 à 16:29:26   

Reply

Marsh Posté le 05-01-2019 à 00:40:16    

MaybeEijOrNot a écrit :

Quel est le contenu de la fameuse page ? Une fois affichée, il n'ya plus rien qui charge nulle part ?

 

C'est à dire ?
Bah c'est le site normal qui charge.
Mais les champs en questions dans le script ne s'"auto-complete" pas.


Message édité par jpass2 le 05-01-2019 à 00:41:10
Reply

Marsh Posté le 05-01-2019 à 00:55:09    

Par "contenu", j'entendais le code source.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 05-01-2019 à 16:06:53    

MaybeEijOrNot a écrit :

Par "contenu", j'entendais le code source.


Ah pardon, j'ai mis l'extrait du code tout en haut de mon premier topic ;)
D'avance, merci à toi :)

Reply

Marsh Posté le 05-01-2019 à 18:30:32    

Si tu ne passes pas le ie.readystate c'est que visiblement ton internet explorer continu de charger quelque chose, si le problème n'intervient qu'avec ta page c'est que ça vient d'elle. Et clairement pas de cet extrait de code.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 05-01-2019 à 21:44:23    

MaybeEijOrNot a écrit :

Si tu ne passes pas le ie.readystate c'est que visiblement ton internet explorer continu de charger quelque chose, si le problème n'intervient qu'avec ta page c'est que ça vient d'elle. Et clairement pas de cet extrait de code.


Pourtant la seule chose que j'ai modifié sur mon PS1 c'est que j'ai remplacé getElementById (qui fonctionne avec un autre site) par getElementsByName.

Reply

Marsh Posté le 05-01-2019 à 23:11:11    

C'est bien ce que je dis, apparemment le problème ne vient pas du script mais du code source du site.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 06-01-2019 à 11:09:17    

David Boring a écrit :

Comme tu as 4 types différents, tu peux faire  

Code :
  1. document.querySelectorAll('input[type=text]')[0].value = $username;
  2. document.querySelectorAll('input[type= password]')[0].value = $password;


 


Je pense que c'est parce que tu utilises JQuery, une lib JS à laquelle il ne va pas avoir accès.
En JS, document.getElementsByTagname() retourne effectivement un tableau. Le paramètre à mettre est le nom d'une balise (tagname = nom de balise).
$MonTableau = $ie.Document.getElementsByTagName("input" );
$MonTableau va comporter des objets de type balise HTML avec leurs attributs value, name...
Par contre, je doute que par ce procédé tu puisses visualiser ton formulaire se remplir. Je pense que les actions sont effectuées en mémoire (mais à vérifier). Si j'ai raison, il faut que tu passes par un langage type AutoIt.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 20-02-2019 à 14:28:18    

MaybeEijOrNot a écrit :

C'est bien ce que je dis, apparemment le problème ne vient pas du script mais du code source du site.


Pourtant le code source est vraiment très simple (celui affiché en haut...)
 
D'avance, merci.

Reply

Marsh Posté le 20-02-2019 à 20:08:53    

S'il y a juste les 4 lignes données plus haut, ce n'est pas étonnant que ça ne fonctionne pas. Cela ne respecte pas la structure d'une page HTML et doit retourner une flopée d'erreurs ce qui conduit ton script à considérer que la page n'est pas chargée.
 
 
Remplace :

Code :
  1. while($ie.ReadyState -ne 4) {start-sleep -m 100}


 
Par :

Code :
  1. start-sleep -m 1000


 
Tu verras bien ce qu'il te dit, mais ce n'est pas gagné, car s'il considère que la page n'est pas chargée c'est que le DOM est mal monté, du coup il n'arrivera pas forcément à le manipuler...


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed