Web Application Testing in .NET - WatiN

Written on September 20, 2006

Unit Tests haben sich im Bereich der Softwareentwicklung inzwischen einigermaßen etabliert, sei es ASP.NET oder WinForms. Bei ASP.NET beschränken sich diese Tests allerdings nach wie vor allenfalls auf den CodeBehind. Das HTML-Resultat war unter .NET bisher nicht vernünftig testbar. Genau diese Lücke zu schließen versucht WatiN, ein Open Source Web Application Testing Framework für .NET.

Dieses Posting soll einen kurzen Einblick in die Arbeitsweise von WatiN geben.

Zunächst benötigt man die aktuellste Version von WatiN, welche hier heruntergeladen werden kann.

In unserem Beispiel werden wir WatiN in einer Konsolenapplikation verwenden, hierzu erzeugen wir in Visual Studio ein neues Konsolenprojekt:

Um WatiN nutzen zu können, wird ein Verweis auf die WatiN.Core.dll benötigt, welche sich in dem o.g. Download befindet:

Um die Grundfunktionalität zu testen, ist folgender Code notwendig:

using System;
using WatiN.Core;

namespace WatiNGettingStarted {

class WatiNConsoleExample {
    [STAThread]
    static void Main(string[] args) {
        // Öffnen eines neuen Internet Explorer Fenster
        // und Aufrufen der Google-Website
        IE ie = new IE("http://www.google.com");

        // Suche nach dem Such-Textfeld und Eingabe von "WatiN".
        ie.TextField(Find.ByName("q")).TypeText("WatiN");

        // Klick auf den Such-Button.
        ie.Button(Find.ByValue("Google Search")).Click();

        // Diesen Kommentar löschen, um den Internet Explorer
        // und das Konsolenfenster sofort zu schließen.
        //ie.Close();
        }
    }
}

Nach dem Kompilieren und Starten der Konsolen-Applikation sollte sich ein Internet Explorer-Fenster öffnen und die Google Website mit den Suchergebnissen für "WatiN" angezeigt werden.

Nachdem die Applikation nun grundlegend funktioniert, werden wir sie so erweitern, dass Seiteninhalte ausgelesen werden können und an die Konsolenapplikation zurückgegeben werden.

Hierzu wird die Internet Explorer Developer Toolbar benötigt (die Toolbar ist zwingend notwendig, um die Automatisierung von Webseiten sinnvoll steuern zu können).

Nachdem wir den DOM-Explorer der Developer Toolbar geöffnet haben ("View DOM"-Button), können wir die Tabelle mit den Suchresultaten in der Seite über die Funktion "Select Element by click" im "Find"-Menü auswählen. Der DOM Explorer zeigt die Tabelle dann in der DOM-Hierarchie an:

WatiN überprüft standardmäßíg den Body-Bereich der HTML-Seite, weshalb wir uns direkt auf die Suche nach der Tabelle mit den Suchresultaten machen können. Die gesuchte Tabelle ist die dritte in der Seite, sodass wir die Table-collection verwenden können, um eine Referenz auf die Tabelle zu erhalten. Der Code sieht wie folgt aus:

Table table = ie.Tables[2];

Es gibt noch einen weiteren Weg, um an diese Tabelle zu kommen, in dem wir den class-Namen der Tabelle (class=t bt)verwenden. Da keine andere Tabelle diesen Namen zugewiesen hat, ist sie eindeutig definiert als die gesuchte Tabelle. Um die Tabelle über den class-Namen zu finden, verwenden wir Find.ByCustom:

Table table = ie.Table(Find.ByCustom("classname","t"));

An diesem Punkt haben wir eine Referenz auf die Tabelle mit den Suchergebnis-Statistiken. Danach müssen wir noch die Tabellenzeile und -zelle finden, in der die Information steckt. Die Zeile ist einfach, da nur eine in dieser Tabelle existiert. Um die Zelle zu erhalten, verwenden wir die TableCells collection. Die gewünschte Information befindet sich in der zweiten Zelle.

string resultStats = table.TableRows[0].TableCells[1].Text;

Zuletzt müssen wir diese Information noch auf der Konsole ausgeben. Somit ergibt sich folgender Code:

using System;
using WatiN.Core;

namespace WatiNGettingStarted {

class WatiNConsoleExample {
    [STAThread]
    static void Main(string[] args) {
        // Öffnen eines neuen Internet Explorer Fenster
        // und Aufrufen der Google-Website
        IE ie = new IE("http://www.google.com");

        // Suche nach dem Such-Textfeld und Eingabe von "WatiN".
        ie.TextField(Find.ByName("q")).TypeText("WatiN");

        // Klick auf den Such-Button.
        ie.Button(Find.ByValue("Google Search")).Click();

        // Suchen der Tabellenzelle welche die Suchergebnis-
        // Statistiken beinhaltet.
        Table table = ie.Table(Find.ByCustom("classname","t bt"));
        string resultStats = table.TableRows[0].TableCells[1].Text;

        // Ausgabe der Statistik auf der Konsole.
        Console.WriteLine(resultStats);
        // Diesen Kommentar löschen, um den Internet Explorer
        // und das Konsolenfenster sofort zu schließen.
        //ie.Close();
        }
    }
}

Nach dem Start der Konsolenanwendung sollte sich folgendes Bild ergeben:

Womit die kurze Einführung in WatiN auch schon beendet ist ;-)