Selenium besteht aus mehreren Komponenten. Es gibt neben dem Macro-Editor (Caputure-and-replay) als Addon für den Firefox auch noch die Testrunnner und sogar serverseitige Module.
Beispielsweise kann man mit Capture-and-replay sich einen Testfall zusammenbauen (oder: ein Makro zusammenstellen). Zu anfangs wurde das sogar ganz normal als HTML-Tabelle (im drei Spaltenlayout?) gespeichert und war dann über einen JavaScript-Testrunner abspielbar. Es steht jedem frei, diesen Testfall auch mit der Hand anzulegen, das Firefox-Plugin ist nur eine Hilfestellung, die darüber hinaus im Zweifel auch eine schlechte Wahl vorschlagen wird.
Die serverseitigen Treiber (Stichwort: WebDriver seit Selenium 2, http://seleniumhq.org/docs/09_webdriver.html) zielen auf den automatisierten UI-Test ab. Beispielsweise für Java (es gibt auch was für die "anderen Welten") entsprechende (Maven-)Libraries, um einen Browser komplett "fernzusteuern". Durch die Abstraktion gibt es fertige Implementierungen für IE, Firefox und Chrome.. und sogar einen UnitDriver, der sogar einfaches JavaScript headless ausführen kann. Bei einer komplexen RIA mit ExtJS stürzt der Treiber zwar ab, aber bspw. eine AutoSuggest-Suche bei Google lässt sich damit ohne Browser testen (via Rhino?).
Selenium teilt aber das Problem aller Web-UI-Tests: Bei generischen Informationen und sich schon gering ändernden Daten sind Testfälle teilweise nur mit Mühe zu konstruieren. Positiv ist, das man etwa über die WebDriver-Schicht nach allem möglichen Suchen und Matchen kann: getElement(s) by id, tagName, className, XPath.
Alternative für Unittests: JSUnit.
Erfahrungswerte.
Allesamt lässt sich prima in eine JUnit-Umgebung integrieren, natürlich muss dabei beachtet werden, dass der ausführende Rechner die Voraussetzungen hat. Die Selenium-Tests habe ich bisher mangels grafischer Oberfläche auf dem Buildserver (Hudson) nur manuell angestoßen: die Firefox-Instanz wird dann zur Laufzeit geöffnet (neues Profil, parallel zu einer offenen), getestet und wieder geschlossen.
Bei Oberflächentests in Webanwendungen - und inbesondere bei Javascript-lastigen, die Daten *nachladen* - ist es teilweise etwas tricky. So habe ich mir (in Java) einen eigenen WaitForCondition-Callback-Wrapper (inkl. Timeout) bauen müssen. Eingebaut ist sowas nämlich nur für normale Pageloads, aber nicht für normale Ajax-Requests der Anwendung.