IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Applications et environnements graphiques Discussion :

Mozrepl: Commander Firefox avec le shell


Sujet :

Applications et environnements graphiques

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 23
    Points
    23
    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



    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    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...

    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'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 23
    Points
    23
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 377
    Points
    19 377
    Par défaut
    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'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. intructions de commande if avec shell
    Par lastmagik dans le forum Linux
    Réponses: 7
    Dernier message: 29/11/2010, 14h46
  2. probleme avec du shell et la commande sed
    Par cobra85 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 10/04/2009, 16h31
  3. Problème avec la commande cd dans un shell
    Par kanko dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 12/09/2006, 09h40
  4. Commander des fenêtres GTK avec le shell
    Par clebig dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 31/07/2006, 11h58
  5. Commander des fenêtres gtk avec le shell
    Par clebig dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 31/07/2006, 10h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo