Ich habe gerade meine Philosophieklausur geschrieben und bin mal wieder wahnsinnig neugierig wie das Ergebnis wohl sein wird. Da ich nicht auf Email vertraue :-D muss ich natürlich unbedingt regelmäßig prüfen ob die Ergebnisse schon da sind. Da ein echter Geek alles was mehr als zweimal passiert automatisiert frei nach dem Motto: Außerdem ist dies eine recht günstige Möglichkeit mal PhantomJS auszuprobieren dachte ich. Zuerst wollte ich Selenium nutzen aber, dass war dann zuviel Overhead wie ich fand. Außerdem habe ich grad eine gewisse Vorliebe für JavaScript entwickelt :-) Nach meinen ersten Gehversuchen mit PhantomJS merkte ich, dass die keine Promises unterstützen! Man endet letztlich in einer katastrophalen Callbackhölle und das Programmieren einfacher Abläufe macht überhaupt keinen Spaß mehr. Zum Glück gibt es CasperJS! Das ist ein Wrapper um PhantomJS der eben Promises anbietet um Abläufe besser coden zu können.vSelten freut man sich über das Wörtchen “then” so sehr ^^ Schauen wir uns also mal fix den Code an! var spawn = require(“child_process”).spawn; var casper = require('casper').create(); var login_url='https://pos.fernuni-hagen.de/qisserver/rds?state=user&type=0'; casper.myProc=spawn; casper.userAgent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'); casper.echo1=casper.echo; casper.echo=function(){}; // print out all the messages in the headless browser context casper.on('remote.message', function(msg) { this.echo('remote message caught: ' + msg); }); // print out all the messages in the headless browser context casper.on(“page.error”, function(msg, trace) { this.echo(“Page Error: “ + msg, “ERROR”); }); //print url changes to console casper.on(“url.changed”, function(url){ this.echo(“——–”); this.echo(“urlchange:”+url); this.echo(“——–”); }); casper.start(login_url, function() { //manual submit because caspers built in does not work //im guessing its because the submit buttons name is “submit”. //this causes some issues with phantomJS and should be avoided this.evaluate(function() { document.getElementById('asdf').value=”matrikelnummer”; document.getElementById('fdsa').value=”passwort”; //workaround needed when the submit buttons name is “submit” //for some reason phantomJS has a problem with that var button=document.getElementsByClassName(“submit”)[0]; button.name=”daniel”; document.forms[0].submit(); }); }); casper.then(function(){ this.click('.auflistung:nth-of-type(1)'); }); casper.then(function(){ //var link=this.getElementInfo('ul.liste li:nth-child(3) a'); //this.echo(“tha link:”+link.tag); this.click('ul.liste li:nth-child(3) a'); }); casper.then(function(){ this.click('li.treelist:nth-child(2) a'); }); casper.then(function(){ this.capture(“./ergebnisse.png”); this.captureSelector('table.png', 'form'); }); casper.then(function(){ var selector='table:nth-child(5)'; var infotag=this.getElementInfo(selector).tag; var contains= infotag.indexOf(“09.09.2013”); if (contains!=-1){ casper.echo1(“Results are there”); //var child1 = this.myProc('open',[ “-a”,”Safari”,”/Users/danielpaulus/notencheck/c/ergebnisse.png”]); //var child = this.myProc(“say”,[“results are there”]); }else{ casper.echo1(“Results are not there”); //var child = this.myProc(“say”,[“results are not there”]); } }); casper.run(function(){ //wait for processes to complete setTimeout(function(){casper.exit();}, 500); }); Das Skript macht letztlich nichts anderes als sich in den Hochschulbereich einzuloggen, zwei mal weiter zu klicken und zu schauen ob es einen Eintrag für das Klausurdatum gibt. Die casper.start() funktion führt den Post manuell aus. Das ist ein kleines Problem, der submit button auf der Seite heißt per namens attribut ebenfalls submit. Das macht probleme mit der von PhantomJS eingebauten submit funktion. Daher musste ich das manuell machen und den button umbenennen. Der neue Name ist eh viel besser :-) – PhantomJS has a Problem when the submit button’s name attribut is submit.– Danach wird über CSS3 Selektoren fleißig voran geklickt. Hervorzuheben ist hier die coole Möglichkeit von der gesamten Seite oder von einzelnen DOM Elementen Screenshots zu machen!! Sehr awesome! Am Ende sehen wir noch wie ich einen ChildProcess nutze. Ursprünglich wollte ich MacOS eingebautes say programm nutzen um mir stündlich per Stimme sagen zu lassen ob die Ergebnisse da sind oder nicht und im positiven Fall Safari mit einem Bild der Ergebnisübersicht öffnen zu lassen. Das fand ich dann aber blöd. Daher, Geek Tool to the rescue! Geek Tool runterladen und installieren und das ganze auf den Desktop rendern. Und finally it was done. Zusätzlich habe ich das Bild  von this.captureSelector('table.png', 'form'); Ebenfalls per Geek Tool auf den Desktop gesetzt. Weil Geek Tool ja jeglichen Konsoleninhalt auf den Desktop rendert, musste ich noch sämtlichen Log-Output abschalten. Coolerweise kann man das mit JavaScript immer ganz einfach in dem man einfach die jeweilige Log-Funktion überscheibt :-D Ja es ist sehr hacky aber ich find’s immer wieder witzig ^^ //Meine Log Funktion casper.echo1=casper.echo; //Log mal fleißig ins nix restliche Code hrhr casper.echo=function(){}; Das war’s :-)