colles.py
est un script écrit en python 3 qui permet d’obtenir les décomptes d’heures de colles effectuées afin de les mettre en paiement par saisie sur l’application ASIE à partir de leurs déclarations par les enseignants et colleurs sur plusieurs instances de Cahier de Prépa. C’est un logiciel libre, distribué sous licence GPL v3.
colles.py
est un script écrit en python 3 qui génère une
interface graphique permettant de relever les notes de colles (khôlles
ou interrogations orales) sur plusieurs instances de cahier de prépa, chacun
correspondant à une classe, et qui produit les déclarations à saisir sur
l’application ASIE (Aide à la saisie des indemnités en établissement)
par l’établissement.
L’idée du script colles.py
est d’émuler le comportement
d’un gestionnaire :
Ainsi, colles.py
permet de :
se connecter automatiquement à chacun des cahiers de prépa ;
procéder au relevé des (notes de) colles ;
générer un fichier de tableur au format ODS (libreoffice calc) de synthèse des déclarations de colles contenant les informations :
Mois ; Nom colleur ; Prénom ; Nombre d'heures pour chaque classe
générer un fichier de tableur au format ODS d’aide à la saisie ASIE, de la forme :
Mois ; Prof CPGE ; Code indemnités ; Nom colleur ; Prénom ;
Code taux DCP ; Nombre d'heures ; type déclaration ;
date saisie ASIE ; commentaires
colles.py
s’appuie sur :
une distribution python 3 avec les bibliothèques non standard
tkinter
et selenium
;
un navigateur internet et son pilote. Je vous recommande l’utilisation de firefox et de son pilote geckodriver qui sont pour l’instant les seuls documentés.
C’est un logiciel libre, distribué sous licence GPL v3.
La dernière version est la 0.0.7 (03/04/2024).
Type | Fichier |
---|---|
code python | colles.py |
modèle de saisie | saisieASIE.ots |
modèle de synthèse | synthese.ots |
documentation | colles.pdf |
Pour utiliser colles.py
, il est nécessaire d’avoir sur
son ordinateur personnel :
la suite office libreoffice ;
une distribution python 3 (version ) ;
>>> import platform
>>> platform.python_version()
'3.11.2'
la bibliothèque python (interface graphique) ;
>>> import tkinter
>>> tkinter.TkVersion
8.6
et la bibliothèque python (gestion du navigateur) ;
>>> import selenium
>>> selenium.__version__
'4.8.3'
Si vous avez une des bibliothèques dans une version précédente,
faites une mise à niveau avec votre gestionnaire pip
avec
l’option -U
ou , par exemple :
>>> pip install pip --upgrade
>>> pip install selenium --upgrade
ou avec conda
avec l’option update
, par
exemple :
>>> conda update conda
>>> conda update selenium
un navigateur et son pilote à utiliser avec Selenium with python:
Navigateur | URL où trouver le pilote |
---|---|
Chrome | https://sites.google.com/a/chromium.org/chromedriver/downloads |
Edge | https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ |
Firefox | https://github.com/mozilla/geckodriver/releases |
Safari | https://webkit.org/blog/6900/webdriver-support-in-safari-10/ |
Je vous recommande l’utilisation de firefox et de son pilote
geckodriver
qui sont des logiciels libres performants et dont l’utilisation par
colles.py
est la seule qui soit documentée. En fonction de
la version de selenium disponible
dans vos dépots, prenez les versions du pilote geckodriver
et de firefox
adaptées.
geckodriver | firefox | selenium |
---|---|---|
v0.33.0 | >= 113 | >= 3.14 |
v0.31.0 | >= 91 | >= 3.14 |
v0.30.0 | 78<=90 | 3.14<=4.0 |
v0.29.0 | 60<=90 | 3.14<=4.0 |
v0.25.0 | 57<=90 | 3.14<=4.0 |
v0.20.1 | 55<=62 | >= 3.5 |
Voir ici pour la liste complète.
Il n’est pas nécessaire d’avoir d’environnement de développement, mais vous pouvez librement utiliser pyzo si vous voulez (voir ici pour l’installation).
Pour utiliser colles.py
avec pyzo et Miniconda avec MS
Windows, il faut :
télécharger et installer libreoffice ;
télécharger et installer firefox ;
télécharger et installer pyzo :
https://github.com/pyzo/pyzo/releases
https://github.com/pyzo/pyzo/releases/download/v4.13.3/pyzo-4.13.3-win64.exe
pour windows 7, préférez la version 4.9.0
:
https://github.com/pyzo/pyzo/releases/download/v4.9.0/pyzo-4.9.0-win64-windows7.exe
télécharger et installer Miniconda 3 :
https://repo.continuum.io/miniconda/Miniconda3-latest-Windows-x86_64.exe
ouvrir pyzo en mode administrateur (clic-droit> exécuter en tant qu’administrateur) ;
choisir miniconda comme distribution python (cliquer sur
use this env...
) ;
installer la bibliothèque selenium
en tapant dans le
shell python :
conda install selenium
répondre oui (y
) pour confirmer l’installation des
dépendances ;
installer la bibliothèque tkinter
en tapant dans le
shell python :
conda install tkinter
ou, pour les versions les plus récentes :
conda install -c anaconda tk
répondre oui (y
) pour confirmer l’installation des
dépendances ;
fermer pyzo et le relancer en mode « normal » ;
télécharger le driver gecko
sur github :
https://github.com/mozilla/geckodriver/releases/download/v0.33.0/geckodriver-v0.33.0-win64.zip
décompresser l’archive et mettre le fichier
geckodriver.exe
dans un répertoire, par exemple
driver
;
ouvrir le fichier colles.py
et éditer la ligne :
plugin="C:\\le\\long\\chemin\\de\\geckodriver.exe"
qui permet de renseigner la localisation du driver
gecko
;
toujours dans le fichier colles.py
, vérifier et si
besoin éditer ou décommenter les lignes :
exe_navigateur='C:\\Program Files\\Mozilla Firefox\\firefox.exe'
exe_libreoffice = 'C:\\Program Files\\LibreOffice\program\\soffice.exe'
qui permet de renseigner la localisation des éxécutables de firefox
et de libreoffice, ici donnés dans le cas d’une installation par défaut
sur une machine 64 bits (en "C:\\Program Files (x86)\\...
pour une machine 32 bits).
Pour utiliser colles.py
avec pyzo et Anaconda avec Mac
OS X, il faut :
télécharger et installer libreoffice ;
télécharger et installer firefox ;
télécharger et installer pyzo :
https://github.com/pyzo/pyzo/releases
https://github.com/pyzo/pyzo/releases/download/v4.13.3/pyzo-4.13.3-macos_x86_64.dmg
télécharger et installer Anaconda :
https://repo.anaconda.com/archive/Anaconda3-2023.07-2-MacOSX-x86_64.pkg
ouvrir pyzo et choisir anaconda comme distribution python
(cliquer sur use this env...
) ;
installer la bibliothèque selenium
en tapant dans le
shell python :
conda install selenium
répondre oui (y
) pour confirmer l’installation des
dépendances ;
fermer pyzo ;
télécharger le driver gecko
sur github:
https://github.com/mozilla/geckodriver/releases/download/v0.33.0/geckodriver-v0.33.0-macos.tar.gz
décompresser l’archive et mettre le fichier
geckodriver
dans un répertoire, par exemple
driver
;
ouvrir le fichier colles.py
et éditer la ligne :
plugin="/usr/$(whoami)/chemin/de/geckodriver"
qui permet de renseigner la localisation du driver
gecko
;
toujours dans le fichier colles.py
, vérifier et si
besoin éditer ou décommenter les lignes :
exe_navigateur= '/Applications/Firefox.app/Contents/MacOS/firefox'
exe_libreoffice = '/Applications/LibreOffice.app/Contents/MacOS/soffice'
qui permet de renseigner la localisation des éxécutables de firefox et de libreoffice, ici donnés dans le cas d’une installation par défaut.
Attention Un bug graphique empêche l’exécution des objets tkinter avec pyzo alors qu’ils fonctionnent très bien depuis un terminal. Pour contourner ce problème sans avoir à lancer de terminal, il est possible de créer un lanceur. Pour ce faire :
lancer une recherche de l’éditeur AppleScript
en
cliquant sur la loupe en haut à droite ;
éditer le code suivant :
tell application "Terminal"
activate
do script "python3 /usr/$(whoami)/chemin/de/colles.py"
end tell
en modifiant l’emplacement de votre dossier colles
dans
lequel figure le script colles.py
;
vérifier le bon fonctionnement en cliquant sur
Éxécuter
puis sauvegarder votre script comme une
application à partir de l’AppleScript
:
Fichier--Exporter
;Format de fichier
, sélectionner
Application
et laisser tout le reste décoché ;Enregistrer
.Le lanceur (raccourci) est alors créé est permet de lancer le script
colles.py
en double-cliquant dessus.
Pour utiliser colles.py
avec une distribution GNU/Linux
de base Debian (Ubuntu, Mint, etc), incluant python3
, il
faut :
Installer libreoffice,
firefox et les
bibliothèques tkinter
et selenium
en tapant
dans un terminal :
$ sudo apt install libreoffice firefox-esr python3-tk python3-selenium
avec votre gestionnaire de paquets préféré ;
télécharger le driver gecko
sur github :
https://github.com/mozilla/geckodriver/releases/download/v0.33.0/geckodriver-v0.33.0-linux64.tar.gz
décompresser l’archive et mettre le fichier
geckodriver
dans un répertoire, par exemple
driver
;
ouvrir le fichier colles.py
et éditer la ligne :
plugin="/usr/$(whoami)/chemin/de/geckodriver"
qui permet de renseigner la localisation du driver
gecko
;
toujours dans le fichier colles.py
, vérifier et si
besoin éditer la ligne :
exe_navigateur="/usr/bin/firefox"
qui permet de renseigner la localisation de l’éxécutable du navigateur (ici firefox, avec une installation par défaut) ;
jouer du chmod +x
pour le rendre exécutable et se
faire un lien symbolique vers /home/$(whoami)/bin
avec
ln -s
.
Selon l’annexe VII de l’arrêté du 10 février 1995 fixant l’organisation générale des études et les horaires des CPGE, chaque élève de CPGE bénéficie de 40 minutes de colles par semaine, auxquelles s’ajoutent sur l’année :
Selon l’article 17, les interrogations orales sont réalisées :
Sur le Cahier de Prépa de chacune des classes, rendez-vous dans la rubrique « Gestion des utilisateurs », sélectionner « Les comptes », puis :
créer un compte type « Lycée » ;
lui associer toutes les matières en sélectionnant le premier carré du pop-up ;
selectionner une « Saisie du mot de passe » ;
renseigner la zone de texte avec :
nom,prenom,mot-de-passe
valider !
Les identifiants de connexion seront alors :
login="pnom"
password="mot-de-passe"
Pour chaque matière scientifique ou la langue vivante 1 (LV1) pour laquelle il y a des colles :
Par exemple, pour les mathématiques :
Pour le cas des lettres, les colles se font à l’élève et selon un rythme différent. On paramétrera donc la matière avec :
Certaines matières ne comportent pas de colle, comme l’informatique commune ou les TIPE. Dans ce cas, on prendra soin de désactiver la fonction pour éviter toute mauvaise saisie :
colles.py
Le navigateur internet et l’éxécutable libreoffice ont normalement été configurés en renseignant les variables globales :
exe_navigateur
exécutable du navigateur firefox (chemin absolu) ;
plugin
exécutable du pilote gecko
(chemin absolu) ;
exe_libreoffice
exécutable de libreoffice (chemin absolu) ;
lors de l’installation.
Afin d’isoler et centraliser tous les fichiers téléchargés des différents Cahier de Prépa, on définit un répertoire de téléchargement spécifique à la gestion des colles, différent du répertoire par défaut. Pour ce faire, il faut renseigner la variable globale :
downloads
répertoire de téléchargement des fichiers des différents Cahier de Prépa (chemin absolu).
Si le répertoire n’existe pas, il sera créé.
Télécharger et copier dans le répertoire downloads
les
modèles de feuilles de calcul pour :
saisieASIE.ots
;synthese.ots
.En cas d’oubli, ces fichiers seront téléchargés dès la première synthèse réalisée.
Les noms des deux fichiers de modèle de feuille de calcul sont
définis dans le dictionnaire modeles
sous la forme :
modeles = {
"saisie": "saisieASIE.ots",
"synthese": "synthese.ots"
}
Éditer le fichier synthese.ots
pour ajuster le nombre de
colonnes correspondant au nombre de classes (fixé à 5 sur le fichier
téléchargé), par simple clic droit sur une colonne classe
,
ajouter une colonne à droite ou à gauche.
Notez que, par défaut, un double-clic génère un nouveau document avec
ce modèle qu’il vous faudra ensuite enregister comme modèle (extension
.ots
) une fois les modifications faites. Le plus simple est
certainement de lancer l’interface graphique depuis un terminal (shell
UNIX) :
$ libreoffice -o synthese.ots
où l’option -o
permet d’ouvrir le fichier modèle pour
édition.
Pour définir les classes et leurs Cahier de Prépa respectifs, on
renseigne un dictionnaire classes
où chaque clé est le nom
de la classe, par exemple PCSI
, et où chaque valeur est un
dictionnaire de la forme :
{
"annee" : <int>, # 1 ou 2
"effectif" : <int>, # nombre d'élèves
"short" : <text> # suffixe de l'URL de https://cahier-de-prepa.fr/
"login" : <text> # identifiant de connexion de type lycée
"password" : <text> # mot de passe correspondant
}
Par exemple au lycée Jean Perrin de Lyon, on a :
classes = {
"MPSI" : {"annee" : 1, "effectif" : 46, "short" : "mpsi-perrin"},
"PCSI" : {"annee" : 1, "effectif" : 40, "short" : "pcsi-perrin"},
"MP" : {"annee" : 2, "effectif" : 21, "short" : "mp-perrin" },
"PC" : {"annee" : 2, "effectif" : 23, "short" : "pc-perrin"},
"PSI" : {"annee" : 2, "effectif" : 36, "short" : "psi-perrin"}
}
Indépendamment du fait que ce soit regrettable, il est tout à fait
possible qu’une classe n’ait pas de cahier de prépa, mais qu’un autre
cahier y face appel (par exemple celui d’une matière, comme décrit dans
la section cahiers). Auquel cas, il suffit de ne
pas renseigner son URL abrégée "short"
. La définition de la
classe ne sera alors utile que pour déterminer le code
taux DCP.
Si le cahier de prépa n’est
pas hébergé « avec les autres » (par exemple s’il est auto-hébergé), il
est aussi possible de définir son URL complète avec la clé
"URL"
sous la forme :
classes = {
"classe" : {
"annee" : <int>,
"effectif" : <int>,
"URL" : "https://une-autre-URL-de-cahier-de-prepa.fr/classe"
},
...
}
Les clés annee
et effectif
permettent de
compléter le code ASIE nécessaire à la détermination du code
correspondant au taux DCP :
Année | Effectif | Chaire sup’ | Autres |
---|---|---|---|
1 | 091 | 008 | |
1 | 20 à 35 | 090 | 007 |
1 | 001 | 006 | |
2 | 090 | 007 | |
2 | 20 à 35 | 001 | 006 |
2 | 157 | 161 |
Le choix a été fait de ne pas faire de distinction entre les professeurs de chaire supérieure et les autres, bien que leurs taux soient différents et de ne garder comme indication pour la saisie ASIE :
Année | Effectif | Code taux DCP |
---|---|---|
1 | "HI 1ÈRE ANNÉE CPGE (MOINS DE 20 ÉLÈVES)" |
|
1 | 20 à 35 | "HI 1ÈRE ANNÉE CPGE (20 À 35 ÉLÈVES)" |
1 | "HI 1ÈRE ANNÉE CPGE (PLUS DE 35 ÉLÈVES)" |
|
2 | "HI 2ÈME ANNÉE CPGE (MOINS DE 20 ÉLÈVES)" |
|
2 | 20 à 35 | "HI 2ÈME ANNÉE CPGE (PLUS DE 35 ÉLÈVES)" |
2 | "HI 2ÈME ANNÉE CPGE (20 À 35 ÉLÈVES)" |
Il est possible de détourner la vue d’un cahier de prépa pour centraliser
une matière, auquel cas chaque « matière » du cahier devrait
correspondre à une classe. Dans ce cas, il faut renseigner un
dictionnaire cahiers
sous la forme :
cahiers = {
"nom" : {
"matière" : "<nom de la matière>",
"short" : "<URL abrégée>"
},
...
}
par exemple pour l’anglais au lycée Jean Perrin :
cahiers = {
"anglais" : { "matière" : "anglais", "short" : "anglais-perrin"}
}
La clé "matière"
est indispensable et permet de
déclencher l’interversion entre classe et matière pour établir le
décompte des heures de colles.
Dans tous les cas, c’est le dictionnaire global cahiers
qui sera seul utilisé. Pour ce faire, le code le complète
automatiquement avec toutes les entrées du dictionnaire
classes
et
Afin de simplifier la gestion des identifiants de connexion aux différents Cahier de Prépa, le plus simple est certainement d’utiliser le même jeu d’identifiants pour tous les cahiers. Dans ce cas, on renseignera les variables globales :
login
identifiant du compte lycée ;
password
mot de passe.
Ces identifiants seront considérés comme identifiants par défaut
s’ils sont non précisés lors de la définition d’une classe de
classes
ou d’un cahier de cahiers
.
Pour définir des identifiants propres à un cahier, il suffit de
préciser les clés "login"
et "password"
, sous
la forme :
classes = {
"classe" : {
"annee" : <int>,
"effectif" : <int>,
"short" : "<URL abrégée>",
"login" : "<identifiant>",
"password" : "<mot de passe>"
},
...
}
ou, de façon équivalente pour un cahier :
cahiers = {
"nom" : {
"matière" : "<nom de la matière>",
"short" : "<URL abrégée>",
"login" : "<identifiant>",
"password" : "<mot de passe>"
},
...
}
Il est évidemment possible de lire les identifiants de connexion à
dans un fichier chiffré, par exemple avec GnuPG
:
from subprocess import check_output
= check_output("gpg -dq chemin/identifiants.gpg", shell=True
password 'UTF-8').splitlines()[0] ).decode(
ou alors avec pass
(qui utilise
GnuPG) :
from subprocess import check_output
= check_output("pass identifiants", shell=True
password 'UTF-8').splitlines()[0] ).decode(
Afin de faciliter la saisie ASIE et éviter tout problème avec
d’éventuels homonymes, on renseignera un fichier CSV de
colleurs
sous la forme :
alias ; Nom ; Prénom ; prof CPGE
où :
alias
Nom
et Prénom
prof CPGE
x
ou X
si le colleur est
enseignant en CPGE (vide sinon).
Pour définir ce fichier, on le placera dans le répertoire
downloads
et on précisera son nom avec la variable globale
fichier_colleurs
; par exemple :
fichier_colleurs = "colleurs.csv"
dont le contenu pourrait être :
alias;Nom;Prénom;prof CPGE
A. CDAIRE;Alphabet;CDAIRE;x
R. EAU;Robert;EAU;x
O. TARCIE;Octave;TARCIE;
...
Comme le code des indemnités pour la saisie ASIE dépend du statut du colleur :
Statut | Code indemnités |
---|---|
Enseignant CPGE | 0207 |
Autre | 2249 |
Comme le code indemnités est le premier champ de sélection pour la saisie ASIE, le fichier d’aide à la saisie sera trié avec ce code comme clé primaire.
Il se peut que des colleurs collant dans plusieurs classes n’aient pas les mêmes noms sur tous les cahiers de prépa. Auquel cas, on peut renseigner un dictionnaire :
renommer = {
"nom1 à changer": "nom1 correct",
"nom2 à changer": "nom2 correct"
}
pour que leurs noms dans les fichiers de synthèses soient conformes.
La configuration minimale de colles.py
sur GNU/Linux,
doit être de la forme :
="pnom"
login="mot-de-passe"
password
= {
classes "MPSI" : {"annee" : 1, "effectif" : 46, "short" : "mpsi-perrin"},
"PCSI" : {"annee" : 1, "effectif" : 40, "short" : "pcsi-perrin"},
"MP" : {"annee" : 2, "effectif" : 21, "short" : "mp-perrin"},
"PC" : {"annee" : 2, "effectif" : 23, "short" : "pc-perrin"},
"PSI" : {"annee" : 2, "effectif" : 36, "short" : "psi-perrin"}
}
= "/home/.../gestion_colles/colles_2023-2024"
downloads = {
modeles "saisie": "saisieASIE.ots",
"synthese": "synthese.ots"
}= "colleurs.csv"
fichier_colleurs
= {
renommer "nom1 à changer": "nom1 correct",
"nom2 à changer": "nom2 correct"
}
='/usr/bin/firefox'
exe_navigateur='/home/.../gestion_colles/geckodriver'
plugin= '/usr/lib/libreoffice/program/soffice' exe_libreoffice
Exécuter le script colles.py
qui ouvre alors une
interface graphique de la forme :
et une fenêtre du navigateur firefox.
L’interface graphique est structurée en 4 blocs :
un bloc de connexions aux différents Cahier de Prépa. En cliquant sur le nom d’un cahier, on s’y connecte automatiquement, dans l’interface de « Relève des colles ». Une fois les opérations réalisées manuellement, on se déconnecte en cliquant sur « Se déconnecter » ;
un bloc permettant de réaliser les relevés des colles. Après avoir fixé la date de fin, c’est-à-dire la date jusqu’à laquelle on souhaite relever les notes (non encore relevées), on peut :
Dans les deux cas, la connexion au Cahier de Prépa, la création du relevé, son téléchargement avec le nom du cachier et la déconnexion sont automatiques.
Afin de simplifier l’utilisation, la date de fin est par défaut initialisée au dernier jour du mois précédent.
Un bloc permettant de télécharger puis réaliser les fichiers de synthèse. Après avoir modifié la date des relevés, par défaut fixée à celle du jour, un clic sur le bouton « Télécharger les fichiers » permet de télécharger tous les fichiers de cahiers de prépa afin de faire la synthèse.
Ensuite, un clic sur le bouton « Fichiers de synthèse » permet de générer, à partir des fichiers téléchargés, deux fichiers CSV :
de synthèse regroupant toutes les classes et tous les colleurs et trié par Nom de la forme :
Mois ; Colleur ; Classe ; Nombre d'heures/classe
et avec pour nom
"synthèse-colles_AAAA-MM-JJ.csv"
;
un fichier d’aide à la saisie ASIE regroupant tous les colleurs, mais trié par code indemnités, puis Nom, de la forme :
Mois ; Prof CPGE ; Code indemnités ; Colleur ;
Code taux DCP ; Nombre d'heures
et avec pour nom
"saisie-colles_AAAA-MM-JJ.csv"
;
et deux fichiers de tableur au format ODS (libreoffice calc)
correspondant et avec pour noms respectifs
"synthèse-colles_AAAA-MM-JJ.ods"
et
"saisie-colles_AAAA-MM-JJ.ods"
.
Un bloc de déconnexion qui permet de quitter l’application avec
le bouton Quitter
.
Si votre interface est incomplète, c’est probablement que la hauteur spécifiée avec la ligne :
"320x800") master.wm_geometry(
est insuffisante. Dans ce cas, il faut adapter le 800
à
vos besoins.
Pour réaliser un relevé des (notes de) colles, il faut :
cliquer sur « Tous les cahiers » dans la section « Relever les colles des cahiers » ou, en cas de problème, cliquer sur le nom de chaque cahier ;
cliquer sur « Télécharger les fichiers » dans la section « Synthèse des colles » ;
cliquer sur « Fichiers de synthèse » dans la section « Synthèse des colles »
Avec cahier de prépa, dès qu’une colle est relevée, elle est marquée avec la date du relevé. Une colle ne peut pas être relevée deux fois. Ainsi, seules les colles déclarées avant la date de relevé choisie et non encore relevées sont prises en compte dans un nouveau relevé.
Comme les saisies ASIE doivent préciser le mois d’exercice, on propose de procéder aux ramassages des heures de colles d’un mois donné le 10 du mois suivant. Les colles déclarées en retard seront affectées au ramassage suivant.
Si un élève est absent à une colle, il faut le noter ABS
sur cahier de prépa. Cette
note sera corrigée ultérieurement une fois le rattrapage effectué.
Dans le cas où les fichiers téléchargés auraient été supprimés, il est possible de les télécharger de nouveau. Pour cela, dans la section « Synthèse des colles » :
Dans le cas où vous auriez appliqué des corrections manuelles aux fichiers téléchargés, il est possible de générer de nouveau les fichiers de synthèse. Pour cela, dans la section « Synthèse des colles » :
Outil | URL |
---|---|
pyzo | http://www.pyzo.org/ |
selenium | https://github.com/SeleniumHQ/selenium/ |
Mozilla firefox | https://www.mozilla.org/fr/firefox/ |
Pilote Mozilla gecko |
https://github.com/mozilla/geckodriver/releases |
pyzo | http://www.pyzo.org/ |