am 2. Oktober 2009
Die heutige Projektwerkstatt ist eigentlich erst gestern entstanden und natürlich aus einer Notwendigkeit heraus. Der Name klingt ein wenig hochgestochen, passt aber doch ganz gut. Vielleicht starten wir einfach mal mit dem Problem, vor dem ich gestern stand.
Viele der großen Webseiten benutzen den IVW Tracker, um Besucherzahlen zu messen und auch um sie an die offiziellen Stellen zu kommunizieren und somit Werbepreise und ähnliches festlegen zu können. Es ist also ein Zählpixel ähnlich wie der von google Analytics, der die Page Impressionen zählt. Diese Impressionen werden aber nicht gezählt, wie wir uns das vorstellen würden, sondern sie zählen die Klicks. Ein gelöstes Sudoku auf einer Webseite kann also gut und gerne 100 PIs produzieren.
Gehen wir mal davon aus, dass unser Sudoku in JavaScript oder Flash produziert wurde. Ich würde jetzt gerne einen Test schreiben, der prüft, ob auch alle Klicks richtig an IVW weitergeleitet werden, dabei will ich natürlich den JavaScript Code auf der Seite nicht anfassen. Alles eine Black Box für mich. Ob der Browser auch wirklich die Pixel feuert ist somit schwer rauszufinden,obwohl man ja nur wissen will, ob der Browser die doofen Pixel abgefragt hat.
Wenn ich wüsste, wo der Pixel in den Dom-Tree reingerendert wird, dann könnte ich prüfen, ob sich da was geändert hat. Da hab ich aber eigentlich keine Lust zu, denn ein generischer Ansatz wäre natürlich besser. Dann könnte ich auch hier meine Black Box Sicht beibehalten.
Jetzt kommt meine Idee ist Spiel. Wie wäre es, wenn mein Browser einfach über einen Proxy (der natürlich nur mitschreibt und den Rest weiterleitet an die echte Seite) geht und der mir sagt, ob die Pixel abgefragt wurden. Der Browser würde dann eine API zur Verfügung stellen, über die ich dann alle Infos abfragen könnte, die er so gesammelt hat. Gepaart mit Selenium könnte eine Verwendung so aussehen:
...
$selenium->setRunId( $testlaufId );
$selenium->open( '/' );
$selenium->click( 'button1' );
$jProxyConnection = new JournalingProxyConnection( '192.168.1.2', $testlaufId );
$imageCount = $jProxyConnection->getImageLoadCount( 'ivw*.png' );
$this->assertEquals( 2, $imageCount );
...
Wahrscheinlich gibt es einen viel besseren Weg, das feuern der Pixel zu testen, der fällt mir aber gerade nicht ein. In der Handhabung fände ich es eigentlich ganz nett, wenn ich in meinen PHPUnit Tests so auf die Daten zugreifen könnte. Also …. wer hat Lust das Tool zu schreiben? Kann ja nicht so schwer sein.
Die RunId habe ich übrigens hinzugefügt, da der Proxy ja irgendwie gruppieren muss. Selenium sollte dann hinter jede URL, die aufgerufen wird ein runId=... setzen.