In fast allen Projekten bei codecentric benutzen wir das Robot Framework für Akzeptanztests. Das Robot Framework ist ein Schlüsselwort-getriebenes Testautomatisierungsframework. Eine Einführung dazu ist hier verfügbar.
Die Selenium IDE ist ein Firefox-Addon, welches den Entwickler bei der Aufzeichnung der Testfälle unterstützt. Ein interessantes Feature ist die Möglichkeit aus verschiedenen Zwischenablage-Formaten auszuwählen, in welches das Testskript konvertiert werden kann, zum Beispiel HTML (default), JUnit, Python oder Ruby.
Während der Startphase meines aktuellen Projektes kam ich auf die Idee ein Format für das Robot Framework zu entwickeln. Nach nur wenigen Suchanfragen bei Google hab ich schnell gemerkt, dass es nicht wirklich kompliziert ist die Selenium IDE zu erweitern. Der Plan ist also, dass man mit dem Firefox Addon die Möglichkeit hat die Testfälle aufzuzeichnen und direkt durch kopieren und einfügen das Robot Keyword Format erhält.
Das Ziel
Ein Selenium Befehl besteht aus 3 Attributen: selenium-command, target und value. Das default-Format ist immer HTML und sieht so aus:
1<tr> 2 <td>select</td> 3 <td>id=feldId</td> 4 <td>Test</td> 5</tr>
Das Format in Java:
1selenium.select("id=feldId", "Test");
Wir wollen sowas erhalten:
1Select From List id=feldId test
Die API
Für die Implementierung braucht man nur ein paar Methoden implementieren. Die formatCommands-Methode konvertiert den Testfall bzw. die einzelnen Kommandos in das Zielformat.
1function formatCommands(commands) {
2 var result = '';
3 for (var i = 0; i < commands.length; i++) {
4 var command = commands[i];
5 if (command.type == 'command') {
6 var keyword = KEYWORDS[command.command];
7 if(keyword == null){
8 keyword = "Call Selenium Api " + command.command;
9 }
10 var target = command.target.replace(/id=/, '');
11 result += keyword + SEPARATOR + target + SEPARATOR + command.value + "\n";
12 keyword = null;
13 }
14 }
15 return result;
16}
Die parse-Methode liest den String des erzeugten Test Cases ein und aktualisiert ggf. vorgenommene Änderungen. Zusätzlich ist es möglich weitere Optionen und Methoden zu definieren, aber die benötigen wir hier erstmal nicht.
1function parse(testCase, source) {
2 var doc = source;
3 var commands = [];
4 while (doc.length > 0) {
5 var line = /(.*)(\r\n|[\r\n])?/.exec(doc);
6 var array = line[1].split(SEPARATOR);
7 if (array.length >= 3) {
8 var command = new Command();
9 command.command = array[0];
10 command.target = array[1];
11 command.value = array[2];
12 commands.push(command);
13 }
14 doc = doc.substr(line[0].length);
15 }
16 testCase.setCommands(commands);
17}
Interessanter ist die folgende Definition:
1//Mapping: Selenium Commands on to Selenium Robot Keywords 2var KEYWORDS = { 3 type: "Input Text", 4 select: "Select From List", 5 verifyValue: "Textfield Should Contain" 6 //[...] 7}; 8 9//Separator for splitting commands(2 blanks) 10var SEPARATOR = " ";
Standardmäßig wird immer das generische “Call Selenium Api”-Keyword mit der korrespondierenden Selenium-Methode generiert. Aber ich denke es ist besser, wenn direkt die Robot Keywords erzeugt werden. Also muss man hier ein Mapping definieren. Es ist auch möglich die Standard Keywords durch Eigene auszutauschen. Ich würde hier empfehlen, dass man erst dann ein Mapping definiert, wenn das Keyword bereits mit der zu testenden Anwendung ausprobiert wurde. So kann man direkt erkennen, wenn ein neues Keyword im Test verwendet wurde, weil in dem generierten Testfall dann „Call Selenium Api“ auftaucht.
Installation
- Selenium IDE öffnen
- Zu „Options → Options… → Formats“ navigieren
- Eine neue Format-Definition mit dem Namen “robotframework-rc” hinzufügen
- Die Inhalte der Datei “robotframework-rc.js” einfügen
Usage
Nun ist es sehr einfach die Testfälle aufzuzeichnen und direkt die Robot Keywords daraus zu generieren. Einfach unter Options->Clipboard Format den Eintrag „robotframework-rc“ auswählen. Generell ist zu empfehlen keine kompletten Testläufe mit der Selenium IDE aufzuzeichnen und sie 1:1 in einen Robot Tests zu kopieren. Das Haupteinsatzargument von Schlüsselwort-getriebenen Tests ist Wiederverwendbarkeit 😉 Aber zumindest die initiale Aufzeichnung ist nun sehr einfach.
Selenium IDE
Robot Framework Keywords
1Select From List feldId Test 2Input Text feldId2 AnotherValue 3Textfield Should Contain feldId Test
Der komplette Quellcode ist auf https://github.com/denschu/selenium-ide-format-robotframework verfügbar. Freue mich natürlich über Feedback 🙂 In meinem nächsten Blogeintrag zeige ich, wie man eigene Locators in Selenium implementiert.
Weitere Beiträge
von Dennis Schulte
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Dennis Schulte
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.