====== Pronote : récupérer le tableau des moyennes par classe ====== ===== Ressources ===== Lien : * https://developer.mozilla.org/fr/docs/Web/API/Document * https://www.alsacreations.com/article/lire/1445-dom-queryselector-queryselectorall-selectors-api.html * https://openclassrooms.com/courses/creez-des-pages-web-interactives-avec-javascript/parcourez-le-dom ===== Principe ===== * Accéder au tableau des moyennes avec le client Web de Pronote * Utiliser un script Javascript qui va parcourir le DOM de la page et extraire les informations * Mémoriser ces informations dans un objet Javascript * Mémoriser cet objet sur serveur Web en utilisant une API REST ===== Structure de la page HTML contenant le tableau des moyennes par classe ===== ...

Tableau des moyennes par classe 

...
B1 SIO
...
Semestre 1
...
35 élèves
Moyenne générale
... ...
AEMJI
AGL1
1
1
... ...> la liste verticale des étudiants et de leur moyenne annuelle
ANDRE Antoine
11,42
... ...> les différentes moyennes de l'étudiant horizontalement ...> les différentes moyennes des autres étudiants horizontalement
11,00
9,83
...   ...>moyenne de la classe et des groupes ...
===== Parcours du DOM ===== Lien : https://openclassrooms.com/courses/creez-des-pages-web-interactives-avec-javascript/parcourez-le-dom * récupérer la classe avec getElementById("GInterface.Instances[1].Instances[0].Instances[0].bouton_Edit") var classe= document.getElementById("GInterface.Instances[1].Instances[0].Instances[0].bouton_Edit").innerHTML.replace(" ", " "); * récupérer le semestre avec getElementById("GInterface.Instances[1].Instances[0].Instances[1].bouton_Edit") var semestre = document.getElementById("GInterface.Instances[1].Instances[0].Instances[1].bouton_Edit").innerHTML.replace(" ", " "); * parcourir la liste des matières dans le tableau avec getElementById("GInterface.Instances[1].Instances[3]_Contenu_2") * 1ère ligne pour obtenir le libellé de la matière : * attribut title de la balise td pour le libellé long * contenu de la balise DIV pour le libellé court * 2ème ligne pour obtenir le coefficient (idem pour libellé long de la matière et DIV pour le coefficient) // objet tableau avec la structure suivante : // {titre: "", classe: "", semestre: "", moyenneClasse: x, nbEleves: x, // matieres: [{nomLong: "", nomCourt: "", coef: x, moyenneMatiereClasse: x}, // {nomLong: "", nomCourt: "", coef: x, moyenneMatiereClasse: x}, // ...], // eleves: [{nom: "", moyenneEleveSemestre: x, // moyenneMatiereEleve: [{matiere: "nomCourtMatiere", moyenne: x}, // {matiere: "nomCourtMatiere", moyenne: x}, // ...] // }] // } // fonction libelle // extraire le nom de la matière du libelle long //- au debut de la chaine enlever le libelle court //- en fin de chaine enlever le coefficient //- supprimer les espaces avant et apres function libelle(valeur) { if (valeur.indexOf(' ')) { valeur = valeur.substring(valeur.indexOf(' ') + 1); } if (valeur.indexOf('Coeff')) { valeur = valeur.substring(0,valeur.indexOf('Coeff')); } return valeur.trim(); } var tableau = new Object(); tableau.titre = document.getElementById("breadcrumbBandeau").innerHTML.replace(" ", " "); tableau.classe = document.getElementById("GInterface.Instances[1].Instances[0].Instances[0].bouton_Edit").innerHTML.replace(" ", " "); tableau.semestre = document.getElementById("GInterface.Instances[1].Instances[0].Instances[1].bouton_Edit").innerHTML.replace(" ", " "); var i = 0; var temp = new Object(); // récuperation du nombre d'eleves var tabNbEleve = document.getElementById("GInterface.Instances[1].Instances[3]_Contenu_1"); // utilisation d'une expression rationnelle pour extraire le nombre d'eleves var re = /([0-9]+)/; tableau.nbEleves = re.exec(tabNbEleve.childNodes[0].childNodes[0].childNodes[1].childNodes[0].innerHTML)[0]; // recuperation de la moyenne de la classe var tabMoyenneClasse = document.getElementById("GInterface.Instances[1].Instances[3]_Contenu_7"); tableau.moyenneClasse = tabMoyenneClasse.childNodes[0].childNodes[0].childNodes[2].childNodes[0].innerHTML; // récuperation des noms de matieres var tabMatiere = document.getElementById("GInterface.Instances[1].Instances[3]_Contenu_2"); i = 0; // creation tableau des objets matieres tableau.matieres = []; // acces 1er TBODY, 1er TR pour le nom des matieres puis à tous les TD tabMatiere.childNodes[0].childNodes[0].childNodes.forEach(function(matiere) { // attribut title du TD pour le nom long des matières // contenu balise DIV pour le nom court // memorisation dans le tableau matiere tableau.matieres[i] = {nomLong: libelle(matiere.title), nomCourt: matiere.childNodes[0].innerHTML}; i++; }) i = 0; // acces 1er TBODY, 2eme TR pour le coefficient des matieres puis à tous les TD tabMatiere.childNodes[0].childNodes[1].childNodes.forEach(function(coef) { // attribut title du TD pour le nom long des matières // contenu balise DIV pour le nom court temp = tableau.matieres[i]; temp.coef = coef.childNodes[0].innerHTML; tableau.matieres[i] = temp; i++; }) // recuperation des noms d'eleves et de leur moyenne semestrielle var tabEleves = document.getElementById("GInterface.Instances[1].Instances[3]_Contenu_4"); // creation tableau des objets eleves tableau.eleves = []; i = 0; // acces 1er TBODY puis à tous les TR des eleves tabEleves.childNodes[0].childNodes.forEach(function(eleve) { // acces contenu balise DIV pour le nom //console.log(nom.childNodes[1].childNodes[0].innerHTML); tableau.eleves[i] = {nom: eleve.childNodes[1].childNodes[0].innerHTML, moyenneEleveSemestre: eleve.childNodes[2].childNodes[0].innerHTML}; i++; }) // recuperation des moyennes semestrielles des matieres de chaque eleve var tabMoyenneEleves = document.getElementById("GInterface.Instances[1].Instances[3]_Contenu_5"); var j = 0; i = 0; // acces 1er TBODY puis à tous les TR des eleves avec utilisation de l'indice i tabMoyenneEleves.childNodes[0].childNodes.forEach(function(moyennesEleve) { // creation tableau des objets moyenneMatiereEleve de l'eleve tableau.eleves[i].moyenneMatiereEleve = []; j = 0; // parcours de tous les TD et acces contenu balise DIV de chaque moyenne et utilisation de l'indice j moyennesEleve.childNodes.forEach(function(moyenne){ // recupere nom de la matiere dans tableau.matieres[i].nomCourt // creation objet moyenne matiere avec nom court et moyenne tableau.eleves[i].moyenneMatiereEleve[j] = {matiere: tableau.matieres[j].nomCourt, moyenne: moyenne.childNodes[0].innerHTML}; j++; }) i++; }) // recuperation des moyennes semestrielles des matieres de la classe var tabMoyenneMatiereClasse = document.getElementById("GInterface.Instances[1].Instances[3]_Contenu_8"); j = 0; // acces 1er TBODY, 1er TR puis à tous les TD tabMoyenneMatiereClasse.childNodes[0].childNodes[0].childNodes.forEach(function(moyenneMatiereClasse){ // creation tableau des objets moyenneMatiereClasse temp = tableau.matieres[j]; temp.moyenneMatiereClasse = moyenneMatiereClasse.childNodes[0].innerHTML; tableau.matieres[j] = temp; j++; }) ===== Retour projet 2017 ===== * [[hackathlon:2017|PROJET 2017]]