Alles was mir so einfällt, hauptsächlich wohl zur Programmierung

Texteingabe mit Selenium IDE / Eclipse RAP 1.5.1 Anwendung

Selenium ist ein praktisches Werkzeug zum automatisierten Test von Weboberflächen. Mit dem Firefox Plugin Selenium IDE lässt sich sehr leicht rumspielen. Allerdings stößt man auf Probleme, wenn man damit Eclipse RAP Anwendungen steuern will. Der Grund liegt in dem verwendeten Javascript Framework qooxdoo. Erste Probleme treten auf, wenn man einen einfachen Klick auf einen Button automatisieren will. Der normale Selenium Befehl 'click' funktioniert nicht. Hier hat mich googlen auf die Qooxdoo User Extensions for Selenium geführt. Selenium lässt sich glücklicherweise mit user extensions in Form von Javascript Dateien erweitern. Der unter dem Link beschrieben qxClick Befehl hilft - damit lassen sich RAP Buttons über Selenium ansteuern.

Das nächste Problem erwies sich als problematischer. Auch die Eingabe in Textfeldern klappte nicht. Weder mit 'type' noch mit 'typeKeys'. Diese Diskussion listet sehr schön die Probleme und erfolglosen Versuche auf, die ich auch probiert habe. Leider hat mir google aber keine Lösung gezeigt. Auch in der Eclipse RAP Wiki steht nur, dass type wohl nicht unterstützt wird. Da ich nicht so schnell aufgeben wollte, habe ich mir das Problem mit Apache JMeter und Firebug angeschaut. Dabei habe ich ein wenig über die interne Arbeitsweise von Eclipse RAP und Qooxdoo gelernt und letztendlich eine Lösung gefunden.

Meine kleine Testanwendung sieht wie folgt aus:

Beispielanwendung

Bei Click auf Ausgeben wird der Text im Textfeld als Alert Nachricht ausgegeben.

Jetzt habe ich zuerst mit JMeter aufgezeichnet, was passiert, wenn ich ganz normal Text eingebe und den Button klicke. Dabei habe ich gemerkt, dass Eclipse RAP nicht wirklich jeden Event zum Server schickt. Solange ich nur Text eingebe, passiert alles Clientseitig. Auch wenn ich das Textfeld verlasse geht noch keine Kommunikation los. Erst wenn ich den Button klicke wird genau ein Event zum Server geschickt. Dieser enthält zum einen die Information, welcher Schalter betätigt wurde und zum anderen auch den geänderten Text. Wenn ich den Schalter jetzt ein zweites mal drücke, wird der Event 'Schalter gedrückt' übertragen, aber ohne den Text in der Textbox.

Im Vergleich dazu der Ablauf, wenn ich mit Selenium IDE den type Befehl und dann qxClick verwende: Der type Befehl ändert den Text in der Textbox (input Element). Es sieht also auf den ersten Blick gut aus. Mit Hilfe von qxClick wird auch der richtige Event zum Server geschickt. Allerdings ohne den geänderten Text. Also habe ich mir das mal mit dem DOM Inspector / Firebug angeschaut. Ein Textfeld wird durch Eclipse RAP / qooxdoo als zwei HTML Elemente abgebildet. Eine div, welche dann als einziges Kind ein Input Element enthält. Die div entspricht dem eigentlichen Widget aus der Sicht von qooxdoo. Diese hat eine Eigenschaft qx_Widget vom Typ org.eclipse.rwt.widgets.Text. Das Input Element dient nur zur Darstellung im HTML. Wenn ich das direkt verändere, wirkt sich das nicht automatisch auch auf das qooxdoo Widget aus. Von da aus war es einfach. Ich habe mir angeschaut, welche Methoden das RWT Text Widget anbietet. Eine heißt mit setValue sehr vielversprechend. Also habe ich mir ein neues Selenium Kommando qxType geschrieben, welches intern setValue aufruft. Und siehe da - damit geht es.

Hier die notwendigen Erweiterungen in der user-extensions-qooxdoo.js Datei:

Selenium.prototype.doQxType = function(locator, eventParams)
{
var element = this.page().findElement(locator);
this.typeElementQx(element, eventParams);
}

Selenium.prototype.typeElementQx = function(element, eventParamString)
{
var text = eventParamString;
element.parentElement.qx_Widget.setValue(text);
};

Das Selenium Testskript sieht wie folgt aus:

Selenium Testskript

22:00:55 am 25.01.2013 von Ender - Kategorie: Programmierung

Comments

Noch keine Kommentare

Add Comments

Dieser Artikel ist geschlossen. Keine Kommentare mehr möglich.