2010-11-13

WUD2010HH: Living Place Hamburg

Meine Notizen zum Vortrag "Living Place Hamburg: Neue Möglichkeiten zur benutzerzentrierten Entwicklung" beim World Usability Day 2010 in Hamburg von Kai von Luck.

  • Ambiguous Computing ist allgegenwärtig, aber nicht sichtbar. Daher müssen die "Computer" ohne Handbuch auskommen. Ein anschauliches Beispiel ist die EC-Karte.
  • Game-Entwicklung schwieriger als Office-Entwicklung, da man Nutzer nicht zwingen kann ein Spiel zu spielen. Ein Spiel funktioniert oder eben nicht.
  • Touchscreen fühlt sich immer komplett anders an, als Monitor/Maus/Tastatur.
  • Das GameCity Lab im Creative Lab:
    • Projekt "Emotional Tent" zusammen mit Künstlern: Ziel ist es, den Kunden zu überraschen - das führt zu einem Erlebnis.
    • Schönes Beispiel, wie die virtuelle Erlebniswelt zur Realität wird: Wenn man den Betrachter selbst auf einem Screen zeigt und ihm dann mittels Bluebox-Trick in der virtuellen Welt auf den Kopf tippt, dann führt dies zu einer "Wegwisch"-Reaktion in der Realität.
    • Enjoyable Interfaces, zB: HackFwd - Ten Simple Rules For Making Enjoyable Interfaces - Marcus Hauer
  • Development Lab:
    • Lotus Notes als Urgestein des CSCW. Heute ist CSCW das Enterprise 2.0
    • Multitouchscreens mit Reaktionszeiten über 100-150ms sind nicht akzeptabel.
    • Auf einem großen Flughafen sollte man das Boarding-Signal nicht überall gleichzeitig anzeigen, sondern abhängig von der Entfernung zum Gate.
    • Der perfekte Wecker weckt dich natürlich nicht in einer Tiefschlafphase und passt sich auch deinem Terminkalender und der Nahverkehrsentfernung zu deinem ersten Termin an. Vielleicht beschreibe ich mal ausführlicher, was mein perfekter Wecker alles können müsste. Der Wecker ist eine Studentenarbeit, die gerade läuft. Auf folgende Ideen wäre ich nicht gekommen:
      • Wenn das Wetter gut ist, fahren die Jalousien hoch, wenn das Wetter schlecht ist, wird statt dessen ein Sonnenaufgang simuliert.
      • Und im Gespräch zwischen den Sessions hatte jemand die Idee: Wenn das Wetter gut ist (und der Termin nicht so weit weg), dann fahre ich Fahrrad, wenn das Wetter schlecht ist, nehme ich die Bahn - das kann der Wecker doch bitte schön auch noch berücksichtigen.
    • Der Rote-Kreuz-Notknopf für alte Leute funktioniert nicht - er müsste automatisch gedrückt werden. Das könnte ambiguous computing leisten.
    • Enterprise 2.0 ist nicht Google für Unternehmen, sondern Facebook für Unternehmen. - Die Menschen machen das Wissen der Firma aus, nicht die geschriebenen Informationen.
    • People First: Eine unternehmensinterne Suchanfrage liefert neben einer Liste an Ergebnisdokumenten auch eine Liste an Mitarbeitern, die einem weiterhelfen könnten.
    • Social Technical Concurrency - könnte ein interessantes Thema sein: Die soziale Struktur im Entwicklerteam gibt Rückschlüsse auf die Programmierung einer "gewachsenen" Architektur.
  • Usability Lab: Living Place Hamburg: A place for concepts of IT based modern living.

Vielen Dank an alle Beteiligten, für die interessanten Anregungen und vielen Dank auch an das Studententeam für die Führung durch das Usability-Labor der HAW und die Living Place Wohnung.


2010-11-12

World Usability Day 2010 Hamburg (WUD2010HH)

Gestern war der World Usability Day 2010 - unter anderem auch in Hamburg.

In diesem Jahr fand die Konferenz nach dem BarCamp Prinzip statt. Da es nicht so viele Teilnehmer wie im letzten Jahr waren, vermute ich, dass dieses Konzept nicht so viele Leute anlockt - da man im Vorfeld nicht weiß über was geredet/diskutiert wird. Dennoch fand ich das Prinzip sehr gut, denn die Diskussionsrunden, die am Nachmittag stattfanden, waren sehr konstruktiv und informativ - Masse ist eben nicht Klasse.

Vielen Dank auch an das Orga-Team, das fleißig für den ganzen Aufbau und für Speis und Trank gesorgt hat.

Am Vormittag habe ich am Workshop "Living Place Hamburg: Neue Möglichkeiten zur benutzerzentrierten Entwicklung" teilgenommen. Workshop trifft es an dieser Stelle vielleicht nicht direkt, aber es war dennoch außerordentlich interessant: Kai von Luck hat die diversen Projekte der HAW Hamburg aus seinem Bereich vorgestellt:

  • Creative Lab: Projekte mit Künstlern
  • Development Lab: Business CSCW und Enterprise 2.0
  • Usability Lab: Usability Studien


Den Living Place Hamburg haben wir uns dann vor Ort angeschaut. Eine Ein-Zimmer-Wohnung als Usability Lab. Hier kann man untersuchen, wie sich Mensch und Technik im Ambiguous Computing verhalten.

Am Nachmittag habe ich mich an folgenden Diskussionen beteiligt:

  • Können theoretische Grundlagen aus der Psychologie für UX-Design dienen (und wie implementiert man dies)?
  • Agiles User Centered Design - Herausforderungen, Erfahrungen, Kompromisse, Lösungen.
  • Check-Ins: Wofür und warum.

Bilder von dem Event gibt es (bald?) bei flickr (WUD2010HH) und natürlich habe ich mich auch wieder am Micro-Sponsoring beteiligt.

In den folgenden Tagen werde ich meine Notizen zu den Sessions online stellen.


2010-11-05

Rubrik: Skurrile Fehlermeldungen zum Wochenende

Seit einiger Zeit arbeite ich mit einem Microsoft SQL Server 2008. Ich muss zugeben, dass ich noch nicht bis ins letzte Detail der Materie vorgedrungen bin, aber dennoch: Die Fehlermeldungen, die der Server so von sich gibt, sind alles andere als selbsterklärend.

Heutiges Beispiel:

Fehler im OLAP-Speichermodul: Ein doppelter Attributschlüssel wurde bei der Verarbeitung gefunden: Tabelle: dbo_dimVoucherCode, Spalte: Comment, Wert: . Das Attribut ist 'Comment'.

Nun gut, man kann sich da schon etwas drunter vorstellen: Das Attribut Comment enthält Werte, die nicht eindeutig sind. Das sehe ich ein. Verwunderlich ist lediglich, dass dieser Fehler aus dem Nichts auftaucht, aber wem glauben wir schon, wenn er sagt "Ich habe nichts geändert" ...

Was ich aber nicht verstehe, ist die Tatsache, das das Attribut an dieser Stelle auch gar nicht eindeutig sein muss - war es ja auch in der Vergangenheit nie!

A duplicate attribute key has been found when processing - ein Beitrag aus den Microsoft-Foren - geht auf diesen Fehler ein und Jeroen Schalken findet eine Lösung:
"In the end the solution was setting the TRIM to NONE on the key field. And leave the rest of the settings as set by AS2008. I can't think of an explenation."
Frei übersetzt so viel wie "Am Ende einer langen verzweifelten Reise, habe ich beim Key-Feld die Einstellung TRIM auf NONE gesetzt. [...] Ich kann mir nicht erklären, wieso das die Lösung ist."

Auch ich kann mir das nicht erklären, aber ich sehe, dass es funktioniert. Mit diesem ungelösten Geheimnis gehe ich jetzt ins Wochenende und vergesse die ganze Angelegenheit. Vielleicht stoße ich ja in ein paar Jahren wieder auf diesen Blog-Beitrag und belächle ihn, weil ich dann weiß, was da im Hintergrund des Servers so alles passiert. Bis dahin hilft er ja vielleicht auch dem ein oder anderen wie mir.

2010-11-01

OSX Bash Kommandos - meine Favoriten

Ein paar Highlights (wie ich finde):
  • pushd und popd: Ein Stack für Verzeichnisse
  • !! wiederholt das letzte Kommando. Sehr schön ist also:
    sudo !!
  • escape . macht das selbe ohne das Kommando gleich auszuführen
  • cp /path/longfilename.ext{,-old}

Ein paar Aliase:
  • alias mkcd='_(){ mkdir $1; cd $1; }; _' erstellt ein Verzeichnis und wechselt gleich hinein
  • alias ffile='find . -name $1': Suche nach Dateien
  • alias pwdc='pwd; pwd | pbcopy' gibt das aktuelle Verzeichnis aus und kopiert es gleich in die Zwischenablage


2010-10-27

Online-Marketing Notizen

In einem vorherigen Blogpost habe ich bereits die Online-Marketing Buzzwords aufgelistet, die mir bei der Lektüre von Einführungsliteratur zum Thema Online-Marketing über den Weg gelaufen sind.
Dieser Post erweitert nun das Themengebiet um ein paar Notizen, die ich mir beim Stöbern gemacht habe.
Ziel dieses Beitrages ist es nicht, das Thema umfangreich zu beleuchten. Dafür ist es selbstverständlich viel zu komplex, sondern lediglich ein paar relevante Stichpunkte aufzulisten.

Online-Marketing umfasst folgende Bereiche:
  • Affiliate-Marketing
  • Suchmaschinen-Marketing bestehend aus
    •  SEO
    •  AdWords
  • Online-Werbung
  • Email-Marketing
  • Sozial Networks

Stichpunkte zu den einzelnen Themen:
(BTW: Unterscheidung zwischen Webseite (einzelne Seite) und Website (gesamter Webauftritt) beachten.)

AdWords:
  • Keyword-Kombinationen mit Städtenamen sind billiger
  • wenige relevante Keywords reichen
  • Über welche Suchbegriffe landen Nutzer auf der Website?

Suchmaschinen-Optimierung:
  • Städtenamen in URL, Meta-Tags, etc. einfügen (auch aus Umland)

Onsite-Optimierungen: 
  • Textoptimierungen
  • Struktur der Website
  • valider HTML-Code
  • Writing for the Web
  • Tools zur Überprüfung der Keyword-Density
  • pro Webseite nur einem Thema widmen
  • Google Sitemap integrieren
  • inhaltliche Nähe verschiedener Seiten durch Verlinkungen untereinander unterstützen
  • relevante Suchworte in den title-Tag
  • URL und title-Tag koppeln
  • Linktext sollte Wörter enthalten, um die es auf der Zielseite geht

Offsite-Optimierung:
  • Wie bekomme ich Backlinks?
  • Platzierung in: Google News, Google Images, YouTube, MyVideo, Clipfish, Sevenload, Blogs, Google Maps
  • News: Presseportale nutzen, zB. openpr.de
  • Landingpages mit Video haben eine 20% höhere Conversionrate
  • YouTube Videos pushen durch viele Views und vielen Kommentare
  • Bildersuche: Suchbegriff häufig in Nähe des Bildes verwenden
  • Bilder mit mind. 400px Breite hochladen

Soziale Netzwerke:
  • Bis 2012 nutzen rund ein Drittel der deutschen Bevölkerung Soziale Netzwerke! (heise.de/newsticker/meldung/print/107311)

2010-10-24

"Append JavaScript at the end of my html file" - Component for Tapestry 5.1

This post describes a service, that enables Tapestry to append JavaScript files and script parts at the end of a html file. Script files and scripts can be "dropped into the service" from any page class or component and will be rendered in that order (FIFO) at the end of the page.

Upgrade Tapestry 5.0.x to Tapestry 5.1. loads included JavaScript files in the HTML head. Reasons are discussed in the Upgrade Notes: http://tapestry.apache.org/tapestry5.1/upgrade.html
project-wide release notes. They told me that in fix for bug TAP5-544:
Firstly, JavaScript libraries would have to move (back) to the head, permanently, no configuration [...].
Maybe I did not understand the real concern, but: Why isn't it up to the developer to decide where to place script files?
I decided to write a component that appends my script files at the end of my html files. The most important reason for this descicion is, that--following Yahoo's performance guidelines--I'd like to first load my HTML DOM before loading the script files.

Write a Service to Collect Files to Append
We need an Interface to be able to use the perthread scope (more about scoypes: "a per-thread instance is created on demand, behind a shared proxy").
The Interface just consists of 4 methods. 2 to add Script files and Scripts to the list and 2 to get the lists when they should be rendered:

public interface IAppendedScriptsService {

    /**
     * Add a script file to the list of script files to append.
     *
     * @param scriptFile
     */
    public void addScriptFile(String scriptFile);

    /**
     * Add a script to the list of scripts to append.
     *
     * @param script
     */
    public void addScript(String script);

    /**
     * Returns a list with script files to append. Needs to be a list to preserve order of script files.
     *
     * @return list with script files to append.
     */
    public List
getScriptFiles();

    /**
     * Returns a list with scripts to append. Needs to be a list to preserve order of scripts.
     *
     * @return list with scripts to append.
     */
    public List
getScripts();
}

The implementation of the Interface could looks like the following block. Don't forget to set the scope to perthread.

@Scope(value = ScopeConstants.PERTHREAD)
public class AppendedScriptsService implements IAppendedScriptsService {

    private final List
scriptFiles = new ArrayList();
    private final List
scripts = new ArrayList();

    @Override
    public void addScriptFile(String scriptFile) {
        this.scriptFiles.add(scriptFile);
    }

    @Override
    public void addScript(String script) {
        this.scripts.add(script);
    }

    @Override
    public List
getScriptFiles() {
        return this.scriptFiles;
    }

    @Override
    public List
getScripts() {
        return this.scripts;
    }

}

Build the Component
The Component was easy to write. It consists of just one method to render the scripts:
    // Inject the service we just wrote.
    @Inject
    private IAppendedScriptsService appendedScriptsService;


    // This method is called when component should be rendered. (Markup writer infos)
    void beginRender(MarkupWriter markupWriter) {


        // Output script files.
        if (!this.appendedScriptsService.getScriptFiles().isEmpty()) {
            for (final String file : this.appendedScriptsService.getScriptFiles()) {
                // There might be another (tapestry conform way) to create the source link. My way is
                String fileUrl = "MyAssetsServerURL".resolveRelative(file);
                markupWriter.element("script", "type", "text/javascript", "src", fileUrl);
                markupWriter.end();
            }
        }


        // Output script snippets.
        if (!this.appendedScriptsService.getScripts().isEmpty()) {
            for (final String script : this.appendedScriptsService.getScripts()) {
                markupWriter.element("script", "type", "text/javascript");
                markupWriter.getElement().text(script);
                markupWriter.end();
            }
        }


    }

That's all to implement. Just one last step to make this run:

Activate Service in AppModule
To activate your Service, following method must be inserted into AppModule.java (or just insert the binder-line if there is already such a method):
public static void bind(ServiceBinder binder) {
  binder.bind(IAppendedScriptsService.class, AppendedScriptsService.class);
}
User Component
To use this Component, you just have to add this into a class of a page or component: 
@Inject
private IAppendedScriptsService appendedScriptsService;


/**
* Append JavaScripts
**/
void setupRender() {
    this.appendedScriptsService.addScriptFile("UrlToScript");
    appendedScriptsService.addScript("var x = 'cool';");
}
The order of scripts and script files is preserved.

Do you have any comments? Let's discuss this in the Nabble Forum. I posted the Topic: "Append JavaScript at the end of my html file" - Component for Tapestry 5.1
EDIT: Howard Lewis Ship commented in the Nabble Forum:
The correct approach is to modify the DocumentLinker service (which is internal) to place the

2010-10-22

Glaubwürdigkeit und das Web 2.0

How to Build Credibility on the Web beschreibt, wie man sich im Web ausdrücken sollte, um zum einen glaubhaft zu klingen und zum anderen aber auch aus der Masse des Contents im Web hervorzustechen. Hierbei ist es natürlich wichtig, das Interesse derjenigen auch zu halten, wenn man das Interesse einmal wecken konnte.

Viele Dinge, die in dem Artikel aufgeführt werden, halte ich für selbstverständlich, so dass ich hier nicht näher darauf eingehe - zum Beispiel sollte man immer ehrlich sein -, aber besonders erwähnenswert finde ich folgende zwei Punkte. Den ersten 'Profil', weil ich dabei immer etwas träge bin (wie man auch an meinem Profil erkennen kann). Den zweiten 'Netzwerke bilden', weil es hierbei in meinen Augen nicht einfach nur darum geht, alle die man kennt in seinem sozialen Netzwerk als Freund hinzuzufügen, sondern langfristig mit völlig neuen Leuten in Kontakt zu kommen, die sich mit den gleichen Dingen beschäftigen, wie man selbst.

Profil: Die "Über mich"-Seiten sollten gut ausgefüllt sein, wobei man nicht nur kurz seine Stadt angeben sollte, sondern auch Gründe, warum andere einem zu den Themen, über die man spricht, zuhören sollten.

Netzwerke bilden: Baue ein Netzwerk mit Leuten, denen du im Netz vertraust und die im selben Umfeld tätig sind.

2010-10-21

Online-Marketing Buzzwords

Um bei Gesprächen mit unserer Marketung-Abteilung auch mal zu wissen, wovon die so reden ;-) habe ich ein Buch über Online-Marketing gelesen.

In diesem ersten Teil liste ich alle Buzzwords auf, die mir in dem Buch über den Weg gelaufen sind. In einem zweiten Beitrag werde ich dann Stichworte zu einigen der Themenbereiche veröffentlichen.

Hier sind die Buzzwords, die man täglich so braucht:
  • Affililate-Marketung: Ein 'Advertiser/Merchant' schaltet Werbung auf der Website eines 'Affilialte/Publisher' und bezahlt diesem eine erfolgsabhängige Provision
  • Closed-Loop Opt-In: Rechtliche Absicherung beim Versenden von Newslettern. Empfänger muss neben der Zustimmung auf einer Webseite auch noch eine Email bestätigen. Erst dann werden ihm Newsletter und Werbemails geschickt.
  • Conversion Tracking: Misst die Effektivität, mit der Website-Besucher zu einer bestimmten Aktion, zB. einer Bestellung, gelenkt werden.
  • Empfehlungsmarketing: Kunden werben Kunden, bzw. Freunde werben Freunde.
  • Keyword-Advertising: Textanzeigen auf '->SERP', zB. mit Google AdWords
  • Keyword-Density: Dichte, mit der ein Schlüsselwort auf einer Webseite vorkommt.
  • OffSite-Optimierung: Verbesserung des '->Page Ranks' durch Maßnahmen außerhalb der eigenen Website, zB. durch Backlinks.
  • OnSite-Optimierung: Verbesserung des '->Page Ranks' durch Maßnahmen auf der eigenen Website
  • Organische Suchergebnisse: reine Ergebnisliste einer Suchmaschinen-Suche ohne jegliches '->Keyword-Advertising'
  • Page Rank: Ergebnisse einer Suchmaschinen-Suche sind eine geordnete Liste. Die Ordnung ergibt sich aus dem PageRank-Algorithmus. (nach Larry Page)
  • ROI (Return on Investment) - Kapitalrendite: Wie hoch ist die Rendite gemessen am eingesetzten Kapital?
  • SEO (Search Engine Optimization) - Suchmaschinenoptimierung: Verbesserung des '-> Page Ranks' durch '->Offsite-' und '->Onsite-Optimierung'
EDIT: In einem weiteren Post gehe ich auf meine Online-Marketing Notizen ein.

Neuer RSS Feed

Meine neue RSS-Feed-Adresse ist: http://feeds.feedburner.com/janp

2010-10-05

Design for Mobile: What Gestures do People Use?

Luke Wroblewski schreibt in seinem Blog Ideation + Design immer Kurzfassungen von Vorträgen, an denen er teilnimmt.
Relativ aktuell ist eine Stichpunktesammlung 'What Gestures do People Use?' vom Vortrag von Dan Mauney von der 'Design for Mobile'-Konferenz in Chicago IL.

Es geht hierbei um eine Untersuchung, welche Gestiken Nutzer bei mobilen Endgeräten verwenden. Die Versuchspersonen wurden beauftragt, verschiedene Operationen durchzuführen und hierbei beobachtet.

Besonders erwähnenswert finde ich folgende drei Punkte:


  • Viele Nutzer haben die gefragten Operationen in einem Menü gesucht, obwohl sie gebeten wurden, die Operationen durch Gestiken auszuführen.
  • Die Wischgestik ('swipe') wurde für diverse Operationen verwendet (löschen, multi-select, ausschneiden, scrolling). Es ist also fraglich, ob man beim Entwerfen einer mobilen Benutzerschnittstelle dieser Gestik eine eindeutige Funktion zuweisen kann.
  • Wenn User nicht genau wussten, wie sie eine Funktion erreichen können, haben sie ein Symbol (zum Beispiel ein Fragezeichen für Hilfe) auf den Screen gemalt. Gute Idee - ich glaube, dass ich da nicht drauf gekommen wäre.

2010-10-04

Tapestry5 in Eclipse

Seit einiger Zeit entwickle ich Tapestry 5 in Eclipse und es ist an der Zeit nach guten Plugins zur Unterstützung zu schauen. Bisher hat es nicht viel gegeben, aber heute starte ich eine neue Recherche.

Basis-Setup:
Borut Bolčina schreibt einen Blog über Tapestry 5. Dort hat er sehr ausführlich beschrieben, wie man das Basis-Setup seiner Entwicklungsumgebung macht.
Dort ist auch die Einrichtung von Eclipse Tidy beschrieben. Eclipse Tidy ist super, um HTML-Dateien zu formatieren, aber mit Tapestry gibt es das Problem, dass man ständig neue Komponenten entwickelt und diese mit t:myComponent in den TMLs referenziert. Jede neue Komponente muss man dann in den Eclipse Tiny-Einstellungen hinzufügen. Das kann - insbesondere bei vielen Entwicklern an einem Projekt - sehr nervig werden. Andererseits: Wenn man es gleich von vornherein durchzieht geht es vielleicht.

Code-Completion:
Einen immensen Umfang an Code-Templates findet man im Tapestry WikiTapestry5HowToEclipseCodeTemplates

Im Wiki findet man auch einen Beitrag über Code-Completion in TMLs. Das ist großartig!

Pugins:
Nun aber endlich zu den Plugins. Bisher habe ich loom-t5 von Chris Scheid und tapestry4e von Juan M. Salamanca gekannt und dabei wird es leider auch bleiben, da ich keine weiteren Plugins gefunden habe. In wie weit sich diese Plugins lohnen, schreibe ich im kommenden Blogpost.


Fazit:
Auch wenn ich leider keine neuen Plugins gefunden habe, welches mir eine Verbindung zwischen den TMLs und den Java-Klassen schafft - so dass zum Beispiel die in einer Klasse eingebundenen Komponenten, Properties, etc. im TML mit Code-Completion verfügbar sind: Es lohnt sich immer mal zu schauen, was es Neues gibt.

2010-09-30

Kalender App fürs iPhone

Vor einigen Wochen habe ich endlich eine vernünftige Kalender App für das iPhone gefunden: Week Cal - iCal for your iPhone.
Man hat eine gesamte Woche im Überblick und dank des hochauflösenden Displays des iPhone 4 kann man - wenn man die Schriftgröße auf minimal setzt - sogar bei parallelen Terminen alles lesen.

2010-09-28

ctrl-z und Eclipse auf dem Mac

Ich verwende Eclipse 3.4 auf dem Mac, habe meine Sprache in OSX auf Deutsch eingestellt und habe eine US-Tastatur im Notebook.

Als Keyboard-Layout habe ich das USGerman Keyboard Layout von http://hci.rwth-aachen.de/USGermanKeyboard. Das ist großartig, da man so einfach mit option+a, etc. die deutschen Umlaute 'zur Hand' hat.

Woran es genau liegt, weiß ich nicht, aber mein Eclipse (US Version) reagiert nicht auf cmd+z, um einen Schritt rückgängig zu machen, sondern auf cmd-y. Man gewöhnt sich da zwar dran, aber heute stelle ich das mal um.
Unter Eclipse -> Preferences... -> General -> Editors -> Keys finde ich die richtige Einstellung: Undo: cmd-z, Redo: cmd-y. Wenn ich diese Werte ändere, erkennt die Kiste erstaunlicherweise y als Z und z als Y. Warum auch immer, denn an allen anderen Stellen in Eclipse (zumindest habe ich noch keine gefunden) bleibt mein y ein y und mein z ein z.

Ich habe nun also Undo auf cmd-Y gelegt, indem ich cmd-z gedrückt habe und Redo auf shift+cmd+Y, indem ich shift+cmd+z gedrückt habe. -> Jetzt muss ich nicht mehr umdenken, aber mal sehen wie lange ich brauche, nicht mehr wie bisher cmd+y als Workaround zu benutzen.

2010-08-12

Selenium web application testing system

Selenium is a testing framework for Web Applications. With a Selenium test environment, you can programmatically create tests and run them as often as you need. This will ensure that you do not accidentally destroys any previously developed feature during later on development. 


Last year, I set up such a Selenium test environment at work. During the preparation for installing such an environment for a customer, I created a "have-to-read" documentation. It summarizes important issues for the use of Selenium. It is for developers who want to use a Selenium installation, to write their own tests. The information comes--largely--from the selenium-site http://seleniumhq.org/ and is represented here as a "short documentary"--the essentials at a glance with links to the source Selenium Documentation.


If you want to start with selenium, and the framework is set up already, then check this out. 

Commonly Used Selenium Commands

Selenium Commands

Selenium Server

Selenium Server receives Selenium commands from your test program, interprets them, and reports back to your program the results of running those tests.
The RC server bundles Selenium Core and automatically injects it into the browser. This occurs when your test program opens the browser (using a client library API function). Selenium-Core is a JavaScript program, actually a set of JavaScript functions which interprets and executes Selenese commands using the browser’s built-in JavaScript interpreter.
The Server receives the Selenese commands from your test program using simple HTTP GET/POST requests. This means you can use any programming language that can send HTTP requests to automate Selenium tests on the browser.

Client Libraries

A Selenium client library provides a programming interface (API), i.e., a set of functions, which run Selenium commands from your own program. Within each interface, there is a programming function that supports each Selenese command.
The client library takes a Selenese command and passes it to the Selenium Server for processing a specific action or test against the application under test (AUT). The client library also receives the result of that command and passes it back to your program. Your program can receive the result and store it into a program variable and report it as a success or failure, or possibly take corrective action if it was an unexpected error.

Learning the API

Starting the Browser

$this->setBrowser("*firefox");$this->setBrowserUrl("http://www.google.com/");
This example opens the browser and represents that browser by assigning a “browser instance” to a program variable. This program variable is then used to call methods from the browser. These methods execute the Selenium commands, i.e. like open or type or the verify commands.
parameters
  • host: Specifies the IP address of the computer where the server is located. Usually, this is the same machine as where the client is running, so in this case localhost is passed. In some clients this is an optional parameter.
  • port: Specifies the TCP/IP socket where the server is listening waiting for the client to establish a connection. This also is optional in some client drivers.
  • browser: The browser in which you want to run the tests. This is a required parameter.
  • url: The base url of the application under test. This is required by all the client libs and is integral information for starting up the browser-proxy-AUT communication.

Running Commands

Once you have the browser initialized and assigned to a variable (generally named “selenium”) you can make it run Selenese commands by calling the respective methods from the browser variable. For example, to call the type method of the selenium object:
selenium.type("field-id","string to type")
In the background the browser will actually perform a type operation, essentially identical to a user typing input into the browser, by using the locator and the string you specified during the method call.

Adding Some Spice to Your Tests



Troubleshooting Common Problems






Test Design Considerations

  • verify/assertText is the most specific test.
  • With Xpath and DOM you can locate an object with respect to another object on the page.
  • Locate dynamic ID: You need programming logic like:
String[] checkboxIds = selenium.getAllFields(); 
if (!GenericValidator.isBlankOrNull(checkboxIds[i])) {   
    if (checkboxIds[i].indexOF("addFOrm") > 1) { 
        selenium.click(checkboxIds[i]);   
    } 
} 
  • Waiting for AJAX Element:
// Loop 
initialization.for (int second = 0;; second++) {    

    // If loop is reached 60 seconds then break the loop.     
    if (second >= 60) break;     

    // Search for element "link=ajaxLink" and if available then break loop.        try { 
        if (selenium.isElementPresent("link=ajaxLink")) break; 
    } catch (Exception e) {
        // log
    } 

    // Pause for 1 second.
    Thread.sleep(1000); 
} 
This certainly isn’t the only solution. AJAX is a common topic in the user group and we suggest searching previous discussions to see what others have done along with the questions they have posted.
  • UI Mapping: What makes a UI map heplful? Its primary purpose for making test script management much easier. When a locator needs to be edited, there is a central location for easily finding that object.
public void testNew() throws Exception {      
    selenium.open("http://www.test.com");         
    selenium.type(admin.username, "xxxxxxxx");         
    selenium.click(admin.loginbutton);         
    selenium.click(admin.events.createnewevent);         
    selenium.waitForPageToLoad("30000");          
    selenium.click(admin.events.cancel);       
    selenium.waitForPageToLoad("30000");         
    selenium.click(admin.events.viewoldevents);      
    selenium.waitForPageToLoad("30000");
} 
    
admin.username = loginForm:tbUsername; 
admin.loginbutton = loginForm:btnLogin; 
admin.events.createnewevent = adminHomeForm:_activitynew; 
admin.events.cancel = addEditEventForm:_IDcancel; 
admin.events.viewoldevents = adminHomeForm:_activityold; 
  • Data Driven Testing: Refer to the RC wiki for examples of reading data from spread sheet or using data provider capabilities of TestNG with java client driver.