Précédent   Forum du club des développeurs et IT Pro > Systèmes > Linux > Applications et environnements graphiques
Applications et environnements graphiques Questions sur l'utilisation d'applications et des interfaces graphiques (KDE, Gnome, XFCE... )
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/12/2012, 13h37   #1
cassignol
Candidat au titre de Membre du Club
 
Inscription : avril 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 18
Points : 12
Points : 12
Par défaut Mozrepl: Commander Firefox avec le shell

La MSA (mutalité sociale agricole) a mis en place un service en ligne pour déclarer les salariés.
Pour chaque salarié il y a 4 formulaires à remplir. Si vous avez 10 vendangeurs
vous y passé la nuit.

J'ai cherché un truc pour automatiser tout cela.

Au début j'ai pensé à Perl avec WWW::Mechanize ou LWP, mais ça marche pas avec HTTPS et Javascript sous Linux.

De plus avant d'envoyer le formulaire je veux le vérifier.

Et la je suis tombé sur MozRepl .

C'est une extention Firefox qui permet de controler le navigateur en lui envoyant du code Javascrit par le port 4242 avec un client type telnet ou netcat.

Il existe bien sur un module Perl qui utilise cette extension WWW::Mechanize::Firefox.
Mais je le trouve incomplet. Pour remplir des formulaires il manque des fonctions
pour les TextArea ou les SelectList. Du moins j'y suis pas arrivé, et Perl j'aime pas trop.

Par chance il existe Fresno


Citation:

Introduction

Fresno provides unix command line access to the Javascript interpreter of your running Firefox instance.

It is a complement to MozRepl, so you will need to have that installed and running in your firefox.

C'est un script shell qui utilise Expect et Telnet.

Mais j'arrive pas à lui faire exécuter du code Javascript contenue dans un fichier.

Dans le script suivant, je crée un fichier /tmp/test.js, que je fait exécuter sucessivement
par ma fonction moz_script et fresno.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
 
cat > /tmp/test.js <<EOF  
 
    repl.whereAmI()
 
    repl.print(this)
 
    repl.print(this.window) 
 
    repl.print(this.document)   
 
    repl.print(this.document.title)
EOF
 
 
moz_script () { # $1: URL d'un fichier javascript   
expect <<EOF
 
     log_user 0 
     spawn  netcat localhost 4242      
 
     expect "repl>"; log_user 1; send "repl.load(\"$1\")\r"
 
     expect  "repl>"; send "repl.quit()\r"    
 
EOF
}
 
moz_script file:///tmp/test.js   
 
echo -e "\n---------------------------------------------------"
 
fresno -l /tmp/test.js

Et voila ce que j'obtient


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
 
repl.load("file:///tmp/test.js")
[object ChromeWindow] - Document title: "lemouv - direct - Mercredi 5 Decembre 10:51:53 - Iceweasel"
[object ChromeWindow]
[object ChromeWindow]
[object XULDocument]
lemouv - direct - Mercredi 5 Decembre 10:51:53 - Iceweasel
repl> 
---------------------------------------------------
[object ChromeWindow] - Document title: "lemouv - direct - Mercredi 5 Decembre 10:51:53 - Iceweasel"
[object Object]
 
 
!!! TypeError: this.document is undefined
 
Details:
 
  fileName: chrome://mozrepl/content/repl.js -> file:///tmp/test.js
  lineNumber: 10

J'ai essayer plusieurs options mais rien n'y fait.
Par contre la commande:


Code :
1
2
3
4
 
 
bash: ./fresno -j "repl.print(this.document)"
[object XULDocument]

elle marche c'est à ne rien y comprendre.

Aprés tous ces echecs j'ai écrit un sript shell mozrepl.sh qui contient la fonction moz_script et toutes les fonctions pour remplir des formulaires.

Le début ressemble à ça:


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
 
moz_cmd () { # $1: commande javascript
expect <<EOF
    spawn  nc localhost 4242
    expect "repl>"; send "$*\r"
    expect "repl>"; send "repl.quit()\r"
EOF
}
 
moz_script () { # $1: URL d'un fichier javascript   
expect <<EOF
    log_user 0
    spawn  nc localhost 4242    
    expect "repl>"; send "repl.enter(content)\r"
    expect "repl>"; log_user 1; send "repl.load(\"$1\")\r"
    expect "repl>"; send "repl.quit()\r"
EOF
}
 
moz_getURL () { # $1: URL   
    moz_cmd "content.location.href = '$1'"            
}
 
 
moz_waitURL () {  # $1: URL     
    while ! moz_cmd "repl.print(content.location.href)" | grep "$1"
    do 
        echo "WAIT URI: $1"  
        sleep 1      
    done 
    sleep 1  
}
 
 
moz_setInput () { # $1: nom  $2: valeur
 
cat > /tmp/setInput.js <<EOF
 
    var c = this.document.getElementsByTagName("input");  // [object HTMLCollection]
                                                          // [object HTMLInputElement] .type=text .name=q .value=Shakira
    for ( var i=0; i<c.length; i++ ) {
        if ( c[i].type == "text" || c[i].type == "password" )
            if ( c[i].name == "$1") {    
                c[i].value = "$2";                
            }
    }  
 
EOF
    moz_script file:///tmp/setInput.js 
}
 
 
moz_submitFormByName () { # $1: nom formulaire
 
cat > /tmp/submitForm.js <<EOF
 
    var c = this.document.getElementsByTagName("form");
 
    for ( var i=0; i<c.length; i++ ) {        
        if ( c[i].name == "$1" )
            c[i].submit();
    }
EOF
    moz_script file:///tmp/submitForm.js 
 
}

Pour l'utiliser il suffit d'ajouter la ligne source ./mozrepl.sh dans le script.

Exemple pour s'identifier sur le site MSA:


Code :
1
2
3
4
5
6
7
8
9
10
11
 
 
# MSA Login
 
moz_getURL  'http://www.msagrandsud.fr'
moz_waitURL 'http://www.msagrandsud.fr'
 
moz_setInput "identifiant" "1690611069043" 
moz_setInput "motDePasse"  "*************"
moz_submitFormByName "_58_fm"
moz_waitURL "https://monespaceprive.msa.fr/enligne/Login/Login.do"

Et pour remplir un formulaire:


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
 
# MSA Information emploi salarié
 
while [ ! $(moz_getInput 'page') ] || [ $(moz_getInput 'page') -ne 3 ]; do sleep 1; done
sleep 1
 
moz_setInput "dateEmbauche"   ${data["DATE EMBAUCHE"]}
moz_setInput "heureEmbauche"  ${data["HEURE EMBAUCHE"]}
 
moz_setInput "dureeMinCDD" ${data["CDD MIN"]}
 
moz_setInput "emploiOccupe"   ${data["EMPLOI"]}
 
if expr match "${data["CONTRAT"]}" '.*VENDANGE'
then     
    v=$(moz_listSelectValues "typeContrat" | grep -i "vendange"   | cut -f1)
    moz_setSelect "typeContrat" $v
else
    v=$(moz_listSelectValues "typeContrat" | grep -i "saisonnier" | cut -f1)
    moz_setSelect "typeContrat" $v  
 
    moz_setInput "travaux" ${data["EMPLOI"]}
fi
 
moz_setInputCheckbox "typeTravailleur" 1
 
moz_setInput "salaireHeureBrut" ${data["BRUT"]}
 
moz_setInput "conventionColl" "Viticulture"
 
moz_setInput "caisseComp" "Humanis"
 
zenity --info --text "Vérifiez le formulaire. Validez-le pour continuer."
[ $? != 0 ] && exit

Toutes les infos sur le salarié sont dans le tableau data.

Le plus dur c'est de savoir si la page demandée est bien affichée.
On peut vérifier l'adresse, mais des pages différente peuvent avoir la même adresse ou on peut avoir été redirigé sur une autre page. On peut également vérifier le titre de la page. Ou la précence d'un élément de formulaire.

C'est ce que fait l'instruction:
Code :
while [ ! $(moz_getInput 'page') ] || [ $(moz_getInput 'page') -ne 3 ]; do sleep 1; done
Au final j'ai un truc qui marche mais ça resemble à un horrible bricolage.
Et ce qui me désole le plus c'est de pas utiliser fresno et de pas comprendre pourquoi ?
cassignol est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 12/12/2012, 00h07   #2
N_BaH
Modérateur
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 752
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 752
Points : 6 625
Points : 6 625
Bonjour,

si je résume :

fresno ne fonctionne pas.
alors, il faut t'adresser au mainteneur du projet pour obtenir des explications concernant ce dysfonctionnement.
moi, je n'ai pas trouvé d'adresse pour le faire...

Citation:
Le plus dur c'est de savoir si la page demandée est bien affichée.
fresno est-il censé le permettre ?


en ce qui concerne le fichier de fonctions :
  • le shebang, pour un fichier sourcé, n'est pas utile, puisque de toutes manières, il s'exécutera dans le script appelant, qui, lui, dispose d'un shebang pour dire au noyau quel shell devra interpréter ses commandes, et donc celles du script sourcé !
  • tu peux éviter le grep | sed, car sed sait lire les regex
  • il y a quelques codes quasi identiques dans des fonctions; en chipotant, au détriment de la lisibilité, il est possible de "factoriser"...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/12/2012, 14h05   #3
cassignol
Candidat au titre de Membre du Club
 
Inscription : avril 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 18
Points : 12
Points : 12
Par défaut Merci pour les remarques

On peut sélectionner des lignes et ensuite leurs appliquer une subsitution de caractéres en une seule commande avec sed. Je suis pas informaticien et j'ai la mauvaise habitude de faire du copier coller sans trop réfléchir. Merci du conseil.

Code :
1
2
3
4
5
6
7
8
 
# Si j'ai bon a la place de:
 
grep '/home/' /etc/passwd | sed 's/knoppix/KNOPPIX/'
 
# On ecrit:
 
sed -n '/home/{s/knoppix/KNOPPIX/g;p};' /etc/passwd
Dans les pages d'aide de Mozrepl Custom-command ils conseillent de créer un fichier d'initialisation en javascript.

Ils donnent quelques exemples à la page Custom commands library.

Regrouper toutes les fonctions javascript dans un seul fichier permet de factoriser le code
et d'avoir un truc plus lisible que mes documents en lignes dans un script shell qui crée un fichier temporaire pour chaque fonctions.

L'idée de mon post est de trouver de tel fichiers écrit par des pros du javascript
et de reprendre ma sale habitude du copier coller.

J'ai trouvé peu de pages sur internet sur Mozrepl.
Je comprend pas pourquoi un truc aussi puissant est si peu utilisé ?

Quant à un bug de fresno je suis pas sur. Il y a une histoire de contexte d'exécution dans Mozrepl que j'ai pas bien compris.

De toute maniere vu l'adresse internet de fresno liée au M.I.T.
C'est pas moi, pauvre viticulteur du sud de la France qui vais me permettre la moindre remarque.
cassignol est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/12/2012, 14h44   #4
N_BaH
Modérateur
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 752
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 752
Points : 6 625
Points : 6 625
Citation:
De toute maniere vu l'adresse internet de fresno liée au M.I.T.
C'est pas moi, pauvre viticulteur du sud de la France qui vais me permettre la moindre remarque.
les programmes sont faits pour les utilisateurs; il n'y a qu'eux qui peuvent faire remonter les difficultés rencontrées lors de l'utilisation, les lacunes de la documentations,...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h21.


 
 
 
 
Partenaires

Hébergement Web