SlideShare ist ein Scribd-Unternehmen logo
1 von 6
Downloaden Sie, um offline zu lesen
www.dotnetpro.de 5.2013 Sonderdruck  1
U
nit-Tests sind zu aufwendig. Für Inte­
grationstests fehlt die Zeit. Systemtests
können auch noch am Projektende ge-
macht werden. Und ohnehin, Sie machen doch
Ihre Arbeit von Anfang an richtig – warum also
so umfangreich (und wiederholt) testen?
Diese – hier überspitzt dargestellte – Ansicht
kommt Ihnen vermutlich aus einigen IT-Projek-
ten bekannt vor. Als professioneller Entwickler
wissen Sie zwar, dass hochwertige Software nur
mithilfe von Qualitätssicherungsmaßnahmen
entstehen kann, doch gelegentlich ist etwas
Überzeugungsarbeit nötig, um den Nutzen sol-
cher Maßnahmen zu vermitteln.
Ein möglicher Ansatz: Führen Sie einen auto­
matisierten GUI-Test vor. Ein Formular, das sich
wie von selbst mit Daten füllt, automatisch auf
richtiges Verhalten geprüft und schließlich ab-
gesendet wird, sagt mehr als tausend Worte;
besonders wenn dies mit fünf verschiedenen
Datensätzen in jeweils drei unterschiedlichen
Clients geschieht. Noch besser: Diese Tests kön-
nen zusammen mit der entwickelten Software
ausgeliefert und im Rahmen eines Abnahme-
tests eingesetzt werden, sodass ein unmittelba-
rer Zeitgewinn sichtbar wird. Dies kommt allen
Beteiligten zugute – eine höhere Akzeptanz von
regelmäßigen Systemtests und damit oft der
Qualitätssicherung allgemein ist ein wichtiger
Beitrag zum Gelingen des Projekts.
Das Tool
Im .NET-Umfeld stehen diverse Tools für die
GUI-Automation zur Verfügung, von denen vier
Test-Automation mit Selenium WebDriver
Der große Formular-Check
Webanwendungen wiederholt von Hand zu testen ist monoton und ineffizient. Nach Erweiterung der Grundfunktio-
nen nimmt WebDriver Ihnen lästige Arbeiten wie das Ausfüllen von Formularen ab.
Auf einen Blick
Martin Gossen ist als IT-
Berater bei iks tätig. Er erstellt
individuelle Geschäftsanwendun-
gen mit C#, ASP.NET und SQL
Server. Besonderen Fokus legt er
dabei auf automatisiertes Testen
und Usability-Analysen. Sie
erreichen ihn unter m.gossen@
iks-gmbh.com.
Inhalt
▸  Selenium-Tools für die GUI-
Automatisation.
▸  Das Tool Selenium WebDriver
im Detail.
▸  Beispiel eines automatisierten
Tests.
dnpCode
A1305Selenium
in [1] vorgestellt wurden. Dabei bietet sich als
Testumgebung für Webanwendungen das weit-
verbreitete und frei verfügbare Produkt Selenium
[2] an. Genau genommen handelt es sich bei Se-
lenium um eine Sammlung mehrerer Tools, die
in Tabelle 1 aufgeführt sind.
Dieser Artikel befasst sich mit Selenium Web-
Driver (Selenium 2), einer Implementierung des
WebDriver-APIs, das als Entwurf für eine W3C-
Spezifikation vorliegt [3]. Ähnlich Selenium
IDE imitiert Selenium WebDriver das Verhal-
ten eines realen Anwenders, indem es mit dem
Webbrowser beziehungsweise der geladenen
Webseite interagiert. Elemente der Webseite
(DOM-Elemente) werden dabei über Selekto-
ren ausgewählt und anschließend ausgelesen
oder manipuliert. Dabei sind alle Aktionen in
der gleichen Weise eingeschränkt wie bei einem
echten Anwender; zum Beispiel kann ein But-
ton, der ausgeblendet oder inaktiv ist, auch von
den beiden Automations-Tools nicht angeklickt
werden.
Während Selenium IDE als reines Firefox-
Plug-in eher die Funktion eines aufgebohrten
Makro-Recorders erfüllt, lässt sich Selenium
WebDriver für anspruchsvolle Steuerungsauf-
gaben auch in anderen Browsern und damit für
professionelle Systemtests von Webanwendun-
gen einsetzen. Technisch gesehen verfolgt Se-
lenium WebDriver auch den solideren Ansatz,
denn es nutzt im Gegensatz zu Selenium IDE
die in aktuellen Browsern bereits integrierten
Funktionen zur Automation [4].
Im Folgenden soll der Begriff „WebDriver“
nicht die Schnittstelle, sondern das Selenium-
Tool bezeichnen. Eine Dokumentation zum
kompletten Selenium-API finden Sie in [5].
Installation und Einrichtung
Am einfachsten legen Sie mit WebDriver los, in-
dem Sie in Visual Studio ein neues Projekt vom
Typ Klassenbibliothek erstellen (vorzugsweise
nicht auf Laufwerk C:, siehe unten) und über
die Paket-Manager-Konsole die folgenden Nu-
Get-Pakete hinzufügen:
PM Install-Package Selenium.WebDriver
PM Install-Package Selenium.Support
Es ist außerdem sinnvoll, ein Test-Framework
wie NUnit [6] zu installieren. Es soll in diesem
Tabelle 1
Selenium Tools.
Tool Beschreibung
Selenium IDE Ein Firefox-Add-on, das als Makro-Recorder fungiert. In die Makros können
Überprüfungen mittels Assert und Verify eingebunden werden. Zudem ist das
schrittweise Abspielen von Testfällen und das Setzen von Breakpoints möglich.
Selenium Client API Erweitert Selenium IDE um diverse Programmiersprachen (inklusive C#).
Selenium RC (Remote Control) Ein Proxy-Server, der von einem Selenium-Client-Treiber ferngesteuert wird.
Ermöglicht die Testautomatisierung von GUI-Tests in Kombination mit Conti-
nuous Integration. Ist offiziell als deprecated (überholt) gekennzeichnet.
SeleniumWebDriver (Selenium 2) Der Nachfolger von Selenium RC mit objektorientiertem API. Spricht den
Browser direkt über dessen Automations-API an.
Selenium Grid Eine Erweiterung, die eine parallele Ausführung von Tests auf mehreren Servern
ermöglicht.
Sonderdruck
2 Sonderdruck 5.2013 www.dotnetpro.de
[Abb. 1] Ein-
binden eines
gemeinsamen
Ordners in
VirtualBox.
Zusammenhang zwar nicht für Unit-Tests
eingesetzt werden, eignet sich aber gut
für die Konfiguration und Ausführung
der Einzeltests. Eine Einführung in NUnit
finden Sie in [7]. Sie können anschließend
die installierte NUnit-Assembly Ihrem
Projekt hinzufügen oder sich wieder bei
NuGet bedienen:
PM Install-Package NUnit
Je nachdem, in welchen Browsern Sie
Ihre Tests ausführen wollen, sind noch
externe Browser-Treiber notwendig. Ein-
zelheiten hierzu finden Sie auf der Sele
nium-Download-Seite; allerdings sind die
dortigen Angaben und verknüpften Versi-
onen nicht immer aktuell. So soll man der
Windows-Umgebungsvariablen %PATH%
den Speicherort des Internet-Explorer-
Treibers hinzufügen, was aber nicht un-
bedingt nötig ist. Hingegen sollte man
darauf achten, dass die Browser-Treiber
nicht durch eine Firewall behindert wer-
den; unter Windows 7 erhalten Sie beim
ersten Zugriffsversuch eine entsprechen-
de Meldung.
Den IE-Treiber finden Sie in [8], den
Chrome-Treiber in [9]. Für Firefox ist kein
weiterer Treiber nötig. Beachten Sie, dass
neuere Treiber eventuell nicht mit alten
Versionen der Browser funktionieren;
während die ZIP-Datei des Chrome-Trei-
bers die Versionsnummer im Dateinamen
trägt, müssen Sie beim Internet Explorer
im Zweifelsfall mit älteren Treiberdateien
experimentieren. Legen Sie die Treiberda-
teien ins Assembly-Verzeichnis des Visual-
Studio-Projekts (zum Beispiel /bin/Debug).
Wenn Sie mit genau festgelegten Brow-
serversionen testen müssen, können Sie
einen virtuellen Rechner zum Beispiel mit
Oracles VM VirtualBox [10] aufsetzen und
auf diesem die gewünschten Versionen
installieren (automatische Programm-
Updates ausschalten!). Wenn Sie Ihr Vi­
sual-Studio-Projekt nun beispielsweise
auf Laufwerk D: angelegt haben, können
Sie dieses in der virtuellen Maschine als
gemeinsamen Ordner einbinden (siehe
Abbildung 1).
Dies hat den Vorteil, dass Konfigurati-
onspfade auf beiden Rechnern gleich sind
und die Tests jederzeit aus der virtuellen
Maschine wie auch Ihrem Entwicklerrech-
ner heraus ausgeführt werden können
(sofern beide mit den gleichen Browser-
Treibern zurechtkommen).
Listing 1
Ein einfacher WebDriver-Test.
using System;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
namespace SeleniumDemo.DotNetPro.Test
{
public class DotNetProTest1
{
[Test]
public void FindSeleniumArticle()
{
// Instantiate browser driver
using (IWebDriver driver = new FirefoxDriver())
{
// Set timeout
TimeSpan waitTimespan = TimeSpan.FromSeconds(15);
driver.Manage().Timeouts().ImplicitlyWait(waitTimespan);
// Navigate to target URL
driver.Url = http://www.dotnetpro.de;
// Get page elements for searching
IWebElement searchBox =
driver.FindElement(By.Id(TB_SearchTerm));
IWebElement searchButton =
driver.FindElement(By.Id(BT_Search));
// Execute search
searchBox.Clear();
searchBox.SendKeys(Selenium);
searchButton.Click();
// Get element from result page
IWebElement searchResultsArea =
driver.FindElement(By.Id(ctl09_PNL_SearchResult));
// Assert correct result
Assert.IsTrue(searchResultsArea.Text.Contains(
Fahren Sie schon Automatik?));
// Finish up
try
{
driver.Quit();
}
catch
{
// Ignore if browser can't be closed
}
}
}
}
}
www.dotnetpro.de 5.2013 Sonderdruck3
Hello dotnetpro
Ein erster Test ist schnell entwickelt. Nach-
dem ein Browser-Treiber instanziert und
mit einem Timeout versehen ist, können
Sie schon zur Zielseite navigieren. Nun
wählen Sie Seitenelemente (zum Beispiel
Textfelder eines Formulars) anhand ihrer
ID aus und führen Aktionen auf Ihnen aus.
Anschließend testen Sie, ob die Seite wie
erwartet reagiert hat, indem Sie die Werte
weiterer Seitenelemente prüfen. Listing 1
zeigt dies am Beispiel der Artikelsuche auf
der dotnetpro-Startseite. In diesem Fall
wird getestet, ob der in [1] genannte Arti-
kel gefunden wird, wenn man eine Suche
mit dem Stichwort„Selenium“ durchführt.
Nachdem Sie das Projekt kompiliert
haben, können Sie ein NUnit-Projekt an-
legen, die erzeugte Assembly des Visual-
Studio-Projekts dem NUnit-Projekt hin-
zufügen und den Test ausführen. Wenn
alles gut geht, können Sie WebDriver nun
bei der Arbeit zusehen und am Ende ein
positives Testergebnis abnicken (siehe
Abbildung 2).
Selektoren und Aktionen
Nicht immer besitzen Seitenelemente ei-
ne eindeutige ID, anhand derer sie iden-
tifiziert werden können; oder aber die
­ID ändert sich vom einen zum anderen
Seitenaufruf (zum Beispiel bei dynamisch
erzeugten Controls). Aus diesem Grund
bringt WebDriver eine Reihe von Selek­
tor-Strategien mit, die in Tabelle 2 aufge-
führt sind. So lassen sich Elemente unter
an­derem anhand eines Name-­Attributs,
ihrer CSS-Klasse oder der Position in der
DOM-Hierarchie ermitteln. Mithilfe von
Java­Script ergeben sich weitere Mög-
lichkeiten; zum Beispiel lassen sich die
jQuery­-Selektoren [11] verwenden. Da
Selektoren auch mehrere Elemente zu-
rückgeben können, ist eine weitere Fil-
terung durch eigenen Code möglich. Aus
Performance-Gründen sollten Sie aber
möglichst eindeutige ID- und CSS-Selek-
toren benutzen. Sofern die zu testende
Webseite unter Ihrer eigenen Kontrolle ist,
empfiehlt es sich daher, alle relevanten
Seitenelemente mit einer ID zu versehen.
Bei CSS- und XPath-Selektoren muss
bedacht werden, dass diese von den
Browsern unterschiedlich unterstützt
werden; so wird Groß-/Kleinschreibung
teilweise ignoriert, teilweise nicht. Einzel-
heiten hierzu finden Sie in [12].
Haben Sie das gewünschte Seitenele-
ment über die FindElement- beziehungs-
weise FindElements-Methode gefunden
(siehe Listing 1), steht es Ihnen als Objekt
vom Typ IWebElement zur Verfügung und
Sie können über seine Eigenschaften bei-
spielsweise ermitteln, ob es momentan
angezeigt wird, ob es aktiv ist und wie sein
Inhaltstext lautet. Über Methoden können
Sie es unter anderem anklicken oder einen
Text setzen. Wenn Sie wissen, dass es sich
um ein Control mit selektierbaren Werten
handelt (zum Beispiel ein Drop-down-
Control), können Sie es in ein Select­
Element-Objekt kapseln und auf diesem
eine von mehreren SelectBy-Methoden
aufrufen, um einen Wert zu setzen.
IWebElement dropdown =
driver.FindElement(By.Id(ctrl1));
SelectElement selectableDropdown =
new SelectElement(dropdown);
// Possible select by methods
selectableDropdown.SelectByIndex(42);
selectableDropdown.SelectByValue(foo);
selectableDropdown.SelectByText(bar);
Das Entwurfsmuster Page Object
Den Prinzipien der Clean-Code-Entwick-
lung [13] zufolge sollte jede Anwendung
das Single-Responsibility-Prinzip beach-
ten. Die Entwickler von WebDriver haben
sich das zu Herzen genommen und emp-
fehlen den Einsatz des Page-Object-Mus-
ters [14]. Das Page Object repräsentiert
die zu testende Webseite; dem steht eine
separate Testklasse gegenüber. Innerhalb
des Page Object lassen sich Felder über ei-
nen Selektor deklarativ an DOM-Elemente
Listing 2
Die Klasse für das Page Object
der Startseite.
public class DefaultPage {
const string url =
http://www.dotnetpro.de;
const string pageTitle =
Herzlich willkommen!;
// Page Elements
[FindsBy(Using = TB_SearchTerm)]
IWebElement searchBox;
[FindsBy(Using = BT_Search)]
IWebElement searchButton;
// Properties
public string Url {
get { return url; }}
public string PageTitle {
get { return pageTitle; }}
// Methods
public SearchPage Search(
string searchText) {
// Execute search
searchBox.Clear();
searchBox.SendKeys(searchText);
searchButton.Click();
return new SearchPage();
}
}
Tabelle 2
Selektoren für DOM-Elemente.
Selektor Beschreibung
ClassName Class-Attribut des DOM-Elements.
CssSelector CSS-Selektor.
Id ID-Attribut des DOM-Elements.
LinkText Vollständiger Text eines Hyperlinks.
Name Name-Attribut des DOM-Elements.
PartialLinkText Partieller Text eines Hyperlinks.
TagName Name des DOM-Elements.
XPath XPath-Selektor.
JavaScript Rückgabewert einer JavaScript-
Funktion.
[Abb. 2] Ein erfolgreicher NUnit-Test.
www.dotnetpro.de 5.2013 Sonderdruck 4
binden; hierzu dient das FindsBy-Attribut.
Weiterhin stellt das Page Object nach au-
ßen hin Eigenschaften und Methoden be-
reit, die für die Testklasse von Nutzen sind.
Ein Beispiel: Das Page Object einer
Log­in-Seite könnte eine LogOn-Metho-
de ­bereitstellen sowie eine Eigenschaft
IsLogged­On. Diese können von der Test-
klasse benutzt werden, um den Anmelde-
vorgang eines Anwenders zu automatisie-
ren und anschließend auf Erfolg zu prüfen.
Das Page Object selbst sollte keinen
Testcode enthalten, also kein Assert aus-
führen.
Hierbei gibt es allerdings eine Aus­
nahme: Bei der Instanzierung kann das
­Page Object sicherstellen, dass die richti-
ge Webseite (und eventuell wichtige Sei-
tenelemente) geladen wurde und bereit
ist, auf Testeingaben zu antworten. Dies
wird am einfachsten anhand des Seiten-
titels festgestellt; wenn dieser nicht ein-
deutig ist, kann auch auf Vorhandensein
eines beliebigen DOM-Elements geprüft
werden.
Das Zusammenspiel von Page Object
und Testklasse veranschaulichen die
­Listings 2, 3 und 4.
Screenshots und Protokollierung
Bekanntlich können Tests auch fehlschla-
gen – ist es doch gerade Sinn eines Tests,
Fehler aufzudecken. Um Hinweise auf
die Fehlerursache zu erhalten, können
Sie im entscheidenden Moment einen
Listing 3
Die Klasse für das Page Object
der Suchseite.
public class SearchPage
{
const string pageTitle = Suche;
// Properties
public string PageTitle {
get { return pageTitle; }}
// Page Elements
[FindsBy(Using =
ctl09_PNL_SearchResult)]
IWebElement searchResultsArea;
// Properties
public IWebElement SearchResultsArea
{
get { return searchResultsArea; }
}
}
Screenshot der Webseite anfertigen las-
sen. Hierfür bringt WebDriver eigens eine
GetScreenshot-Methode mit.
var screenshot =
((ITakesScreenshot)driver).GetScreenshot();
screenshot.SaveAsFile(path, ImageFormat.Png);
Für weitergehende Protokollierung des
Fehlers oder auch des Erfolgsfalls für die
Testdokumentation müssen Sie auf die
.NET-Standardklassen oder auf Logging-
Frameworks zurückgreifen.
Listing 4
Die Testklasse für die Page Objects aus Listing 2 und 3.
public class DotNetProTest2
{
[Test]
public void FindSeleniumArticle()
{
// Instantiate browser driver
using (IWebDriver driver = new FirefoxDriver())
{
// Set timeout
TimeSpan waitTimespan = TimeSpan.FromSeconds(15);
driver.Manage().Timeouts().ImplicitlyWait(waitTimespan);
// Create and initialize page object
DefaultPage defaultPage = new DefaultPage();
PageFactory.InitElements(driver, defaultPage);
// Navigate to target URL
driver.Url = defaultPage.Url;
// Make sure correct page was loaded
Assert.AreEqual(driver.Title, defaultPage.PageTitle);
// Execute search
SearchPage searchPage = defaultPage.Search(Selenium);
// Initialize resulting page
PageFactory.InitElements(driver, searchPage);
// Make sure correct page was loaded
Assert.AreEqual(driver.Title, searchPage.PageTitle);
// Assert correct result
Assert.IsTrue(searchPage.SearchResultsArea.Text.Contains(
Fahren Sie schon Automatik?));
// Finish up
try
{
driver.Quit();
}
catch
{
// Ignore if browser can't be closed
}
}
}
}
Eine Beispiellösung für Formular-
Tests
Zu diesem Artikel finden Sie auf der Heft-
DVD eine VS2012-Solution (.NET 4.5), die
aus den folgenden vier Projekten besteht:
◼	 DotNetPro.Test (enthält die abgedruck-
ten Listings),
◼	 SeleniumFormExtensions (Formular-
Erweiterungen),
◼	 WebApplication (eine Beispiel-Website),
◼	 WebApplication.Test (Tests für die Bei-
spiel-Website).
Sonderdruck
5 Sonderdruck 5.2013 www.dotnetpro.de
Um mit der Beispiellösung arbeiten zu
können, erstellen Sie zunächst im Webser-
ver (IIS) eine neue Site und weisen den Ord-
ner WebApplication als Stammverzeichnis
zu, sodass die Beispiel-Website als local­
host erreichbar ist. Der Anwendungspool
muss .NET 4.0 verwenden. Gegebenen-
falls müssen Sie dem Benutzerkonto des
Webservers noch Zugriff erteilen, indem
Sie entsprechende Rechte auf dem Ordner
einrichten. Auf dem Unterordner Upload
werden zudem Schreibrechte benötigt. Ob
dieWebsite wie gewünscht funktioniert, se-
hen Sie, wenn Sie im Browser zu localhost/
Profile.­aspx navigieren und sich dort an der
Website anmelden (User name: TestUser,
Password: TestPw). Nun sollte die Zielseite
Profile.aspx erscheinen (siehe Abbildung 3).
Der eigentliche Test besteht darin, das
Formular auszufüllen, abzusenden und
auf Korrektheit der übermittelten Werte
zu prüfen. Der Test ist dann erfolgreich,
wenn alle eingegebenen Werte auf der
anschließenden Bestätigungsseite kor-
rekt angezeigt werden. Profile.aspx ist ab-
sichtlich so konzipiert, dass verschiedene
Typen von Formular-Controls ausgefüllt
werden können.
Bei dem Projekt SeleniumFormExten­
sions handelt es sich um eine wiederver-
wendbare Klassenbibliothek, die Ihnen
die Arbeit mit Webformularen erleichtert.
Sie enthält im Wesentlichen folgende
Klassen: (siehe Abbildung 4):
◼	 Eine Basisklasse PageObject, die eine
FillForm- und einige Hilfsmethoden
zur Verfügung stellt, welche das Aus-
füllen von Formularen und generell die
Interaktion mit Seitenelementen ver-
einfachen (A).
◼	 Eine Basisklasse für Tests (Selenium­
Test), die sich um die Browser-Treiber
und die Protokollierung von Fehlern
kümmert sowie das Navigieren zu Web-
seiten erleichtert (B).
◼	 Eine Reihe von Konfigurationsklassen,
mit denen Sie Eigenschaften von Page
Objects und das genaue Verhalten beim
Ausfüllen der Formularfelder deklarativ
festlegen können. Hier wird zudem das
Einlesen von Testdaten aus XML-Datei-
en ermöglicht (C).
◼	 Strategien zum Setzen von Werten
(­Val­ue Setters) für verschiedene Con-
trol-Typen (D).
Hierauf aufbauend können Sie Ihre
eigenen Tests erstellen, wie im Projekt
WebApplication.Test demonstriert (siehe
Abbildung 5):
◼	 Die Klasse Page dient als Basisklasse für
die eigentlichen Page-Object-Klassen.
Somit repräsentiert die Page-Klasse die
Master Page der Website und enthält
folgerichtig eine Logout-Methode. Das
entsprechende Seitenelement – der
Log-Off-Hyperlink – befindet sich in der
Master Page (A).
◼	 Die Klasse Test dient als Basisklasse für
die konkreten Testklassen. In dieser
Klasse erfolgt die Vorbereitung (Setup)
und das Aufräumen (Teardown), das vor
beziehungsweise nach jedem Test not-
wendig ist. Im Beispiel erfolgt hier die
An- und Abmeldung an der Website (B).
◼	 Der Ordner Pages enthält die Page-Ob-
ject-Klassen, hierarchisch gegliedert wie
die entsprechenden Webseiten. Wie die-
se konfiguriert werden können, sehen
Sie in Tabelle 3. Weitere Erläuterungen
dazu finden Sie auch im Quellcode (C).
◼	 Der Ordner Tests beinhaltet die kon-
kreten Testklassen. Hier können Sie im
TestFixture-Attribut angeben, für welche
Browser die Tests ausgeführt werden
sollen, und im TestCaseSource-Attribut
bestimmen Sie, woher die Testdaten
stammen. Die Testmethoden benutzen
die Schablonenmethode Execute ihrer
Basisklasse, damit Fehler abgefangen
und protokolliert werden können (D).
◼	 Unter Properties/Settings.settings kon-
figurieren Sie das Projekt. Die meisten
Werte sind selbsterklärend. TestUser­
Name und TestUserPassword sind An-
meldedaten, die für jeden Test benötigt
werden; daher sind sie hier zentral ab-
gelegt. SourceCulture und TargetCulture
werden zum Umwandeln von Formaten
– speziell von eingelesenen Datums-
werten – verwendet (E).
◼	 Configuration/TestData enthält XML-
Dateien mit den zu verwendenden Test-
daten (F).
◼	 Configuration/TestFiles enthält Binärda-
teien zum Testen der Upload-Funktion
(G).
[Abb. 3] Die zu testende Seite Profile.aspx.
[Abb. 4] Das Projekt SeleniumFormExtensions.
[Abb. 5] Das Projekt WebApplication.Test.
Sonderdruck
www.dotnetpro.de 5.2013 Sonderdruck
Tabelle 3
Attribute zur Konfiguration von Page Objects.
Attribut Zielelement Eigenschaft Beschreibung
PageIdentifier Page-Object-
Klasse
Title Titel der Webseite.Wird benutzt, um festzustellen, ob die korrekte
Webseite geladen wurde.
ElementId ID eines DOM-Elements der Webseite.Wird benutzt, um festzustellen,
ob die korrekte Webseite geladen wurde.
PageUrl Page-Object-
Klasse
Url URL der repräsentierten Webseite. Zu diesem URL navigiert der
Browser-Treiber.
Configuration IWebElement-Feld Delay Zeitverzögerung beim Setzen eines Wertes in Millisekunden. Nütz-
lich, wenn das Element Zeit zum Reagieren benötigt.
Tab Name eines Formularreiters, der angeklickt wird, bevor ein Wert
gesetzt wird.
Click Das Element wird vor dem Setzen eines Wertes angeklickt.
Leave Das Element verliert nach dem Setzen eines Wertes den Fokus.
DataType Datentyp des zu setzenden Wertes.Wird bei der Umwandlung von
Werten in eine andere Culture benutzt.
SourceCulture Culture des eingelesenen Wertes.
TargetCulture Culture, in die ein Wert umgewandelt wird.
Format Format, in das ein Wert umgewandelt wird.
ElementType Control-Typ des Elements (zum Beispiel text oder select). Für jeden Typ
kann eine eigene Strategie zum Setzen von Werten benutzt werden.
SetMethod Ansatz, der zum Setzen eines Wertes gewählt wird.
SelectMethod Ansatz, der zur Auswahl eines Wertes gewählt wird.
◼	 Die Klasse Configuration/DataProvi­
der besorgt die Testdaten und stellt sie
den Testklassen zur Verfügung. Im Bei-
spiel liefert die UserProfiles-Eigenschaft
sukzessiv die Werte aller XML-Knoten
namens Profile der verfügbaren XML-
Dateien (H).
◼	 Der Ordner Log ist der Speicherort
für Fehlerprotokolle und zugehörige
Screenshots (J).
Um die Beispiellösung in Aktion zu
sehen, müssen Sie lediglich ein NUnit-
Projekt für die Assembly SeleniumDemo.
WebApplication.Test.dll anlegen und
ausführen. Damit es in allen drei Brow-
sern (Firefox, Internet Explorer, Chrome)
klappt, müssen diese natürlich installiert
sein. Je nach Browser-Version kann es
auch nötig sein, die vorhandenen Brow-
ser-Treiber (IEDriverServer Win32 2.28.0
und chromedriver win 23.0.1240.0) auszu-
tauschen.
Fazit
Selenium WebDriver bringt eine Reihe
solider Funktionen mit, die das Testen
von Webanwendungen erleichtern. Im
Zusammenspiel mit NUnit und etwas
zusätzlicher Handarbeit lässt sich daraus
ein hoch konfigurierbares System bauen,
das Ihnen viel Tipparbeit beim Testen
von Webformularen abnimmt und sich
in einen Continuous-Integration-Prozess
einbinden lässt. Nebenbei dient es als an-
schauliche Demonstration für wiederver-
wendbare Systemtests und kann damit er-
heblich zum Projekterfolg beitragen.  [bl]
[1] Hendrik Lösch, Michael Hanslik, Ein Vergleich
verbreiteter UI-Testing-Frameworks, Fahren
Sie schon Automatik?, dotnetpro 11/2012,
Seite 102 ff.,
www.dotnetpro.de/A1211CodedUI
[2] Selenium, http://seleniumhq.org
[3] W3C Entwurf WebDriver-API,
www.w3.org/TR/webdriver
[4] Selenium WebDriver Dokumentation,
www.dotnetpro.de/SL1304Selenium1
[5] Selenium WebDriver API,
www.dotnetpro.de/SL1304Selenium2
[6] NUnit, www.nunit.org
[7] Tam Hanna, Unit-Tests mit NUnit, Ebenbürti-
ger Ersatz, dotnetpro 12/2012, Seite 110 ff.,
www.dotnetpro.de/A1212Testen
[8] Internet Explorer Driver Server,
www.dotnetpro.de/SL1304Selenium3
[9] Chrome Driver,
www.dotnetpro.de/SL1304Selenium4
[10] Oracle VM VirtualBox, www.virtualbox.org
[11] jQuery-Selektoren,
www.dotnetpro.de/SL1304Selenium5
[12] Selenium, Locating UI Elements (WebEle-
ments): CSS- und XPath-Eigenheiten,
www.dotnetpro.de/SL1304Selenium6
[13] Clean Code, www.clean-code-developer.de
[14] Selenium-Wiki: Page-Object-Entwurfsmuster,
www.dotnetpro.de/SL1304Selenium7
iks Gesellschaft für
Informations- und
Kommunikationssysteme mbH
Siemensstraße 27
40721 Hilden
Telefon 0 21 03 - 58 72 -0
Telefax 0 21 03 - 58 72 -58
info@iks-gmbh.com
www.iks-gmbh.com
i s
k
Gesellschaft für
Informations- und
Kommunikationssysteme mbH
Softwareentwicklung
IT-Beratung
IT-Konzepte
Business Intelligence
Individuelle IT-Konzepte
und Softwarelösungen
Sonderdruck

Weitere ähnliche Inhalte

Was ist angesagt?

Automated testing of JavaFX UI components
Automated testing of JavaFX UI componentsAutomated testing of JavaFX UI components
Automated testing of JavaFX UI componentsWolfgang Weigend
 
Adobe flash builder 4.6 bitte lesen
Adobe flash builder 4.6   bitte lesenAdobe flash builder 4.6   bitte lesen
Adobe flash builder 4.6 bitte lesendenguyenst
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit MavenStefan Scheidt
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascriptjoergreichert
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...Marc Müller
 
Einführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core MiddlewaresEinführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core MiddlewaresMatthias Jauernig
 
Android Entwicklung (App Entwickler Konferenz 2010 der Telekom)
Android Entwicklung (App Entwickler Konferenz 2010 der Telekom)Android Entwicklung (App Entwickler Konferenz 2010 der Telekom)
Android Entwicklung (App Entwickler Konferenz 2010 der Telekom)greenrobot
 
Windows 8 für Entwickler
Windows 8 für EntwicklerWindows 8 für Entwickler
Windows 8 für EntwicklerJan Hentschel
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code CookbookUlrich Krause
 
Erfahrungsbericht Ausführbare Spezifikationen im Projektalltag
Erfahrungsbericht Ausführbare Spezifikationen im ProjektalltagErfahrungsbericht Ausführbare Spezifikationen im Projektalltag
Erfahrungsbericht Ausführbare Spezifikationen im ProjektalltagJens Nerche
 
Ecm 5 13_djaafar_jas_forge
Ecm 5 13_djaafar_jas_forgeEcm 5 13_djaafar_jas_forge
Ecm 5 13_djaafar_jas_forgeJasmine Conseil
 
Skripting prüfung, automatisierung und funktionserweiterung - Sebastian-Nic...
Skripting   prüfung, automatisierung und funktionserweiterung - Sebastian-Nic...Skripting   prüfung, automatisierung und funktionserweiterung - Sebastian-Nic...
Skripting prüfung, automatisierung und funktionserweiterung - Sebastian-Nic...MAX2014DACH
 
14.02.13 win ua-agent
14.02.13 win ua-agent14.02.13 win ua-agent
14.02.13 win ua-agentrehanseo
 
Deploy Magento Shops with Capistrano v3
Deploy Magento Shops with Capistrano  v3Deploy Magento Shops with Capistrano  v3
Deploy Magento Shops with Capistrano v3Roman Hutterer
 

Was ist angesagt? (19)

Automated testing of JavaFX UI components
Automated testing of JavaFX UI componentsAutomated testing of JavaFX UI components
Automated testing of JavaFX UI components
 
Adobe flash builder 4.6 bitte lesen
Adobe flash builder 4.6   bitte lesenAdobe flash builder 4.6   bitte lesen
Adobe flash builder 4.6 bitte lesen
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit Maven
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascript
 
Windows 8.1 UI für Entwickler
Windows 8.1 UI für EntwicklerWindows 8.1 UI für Entwickler
Windows 8.1 UI für Entwickler
 
Powershell 3.0
Powershell 3.0Powershell 3.0
Powershell 3.0
 
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
BASTA 2016 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch...
 
Einführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core MiddlewaresEinführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core Middlewares
 
Android Entwicklung (App Entwickler Konferenz 2010 der Telekom)
Android Entwicklung (App Entwickler Konferenz 2010 der Telekom)Android Entwicklung (App Entwickler Konferenz 2010 der Telekom)
Android Entwicklung (App Entwickler Konferenz 2010 der Telekom)
 
Windows 8 für Entwickler
Windows 8 für EntwicklerWindows 8 für Entwickler
Windows 8 für Entwickler
 
A/B Testing mit Node.js
A/B Testing mit Node.jsA/B Testing mit Node.js
A/B Testing mit Node.js
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code Cookbook
 
Einsteiger Workshop
Einsteiger WorkshopEinsteiger Workshop
Einsteiger Workshop
 
Erfahrungsbericht Ausführbare Spezifikationen im Projektalltag
Erfahrungsbericht Ausführbare Spezifikationen im ProjektalltagErfahrungsbericht Ausführbare Spezifikationen im Projektalltag
Erfahrungsbericht Ausführbare Spezifikationen im Projektalltag
 
Ecm 5 13_djaafar_jas_forge
Ecm 5 13_djaafar_jas_forgeEcm 5 13_djaafar_jas_forge
Ecm 5 13_djaafar_jas_forge
 
Skripting prüfung, automatisierung und funktionserweiterung - Sebastian-Nic...
Skripting   prüfung, automatisierung und funktionserweiterung - Sebastian-Nic...Skripting   prüfung, automatisierung und funktionserweiterung - Sebastian-Nic...
Skripting prüfung, automatisierung und funktionserweiterung - Sebastian-Nic...
 
14.02.13 win ua-agent
14.02.13 win ua-agent14.02.13 win ua-agent
14.02.13 win ua-agent
 
Ant Maven
Ant MavenAnt Maven
Ant Maven
 
Deploy Magento Shops with Capistrano v3
Deploy Magento Shops with Capistrano  v3Deploy Magento Shops with Capistrano  v3
Deploy Magento Shops with Capistrano v3
 

Andere mochten auch

Andere mochten auch (18)

Mehr Softwarequalitä: Usability
Mehr Softwarequalitä: UsabilityMehr Softwarequalitä: Usability
Mehr Softwarequalitä: Usability
 
iks auf der Jax 2010: Provisioning unter OSGi für Test und Betrieb
iks auf der Jax 2010: Provisioning unter OSGi für Test und Betrieb iks auf der Jax 2010: Provisioning unter OSGi für Test und Betrieb
iks auf der Jax 2010: Provisioning unter OSGi für Test und Betrieb
 
"RCP-Hilfe-System" - Ein Artikel im Eclipse Magazin 6/2010
"RCP-Hilfe-System" - Ein Artikel im Eclipse Magazin 6/2010"RCP-Hilfe-System" - Ein Artikel im Eclipse Magazin 6/2010
"RCP-Hilfe-System" - Ein Artikel im Eclipse Magazin 6/2010
 
Apps als motor zur digitalen transformation
Apps als motor zur digitalen transformationApps als motor zur digitalen transformation
Apps als motor zur digitalen transformation
 
Einfuehrung in mongo_db_iks
Einfuehrung in mongo_db_iksEinfuehrung in mongo_db_iks
Einfuehrung in mongo_db_iks
 
Mehr Softwarequalität: Technische Schulden (IKS-Thementag: 05.05.2015)
Mehr Softwarequalität: Technische Schulden (IKS-Thementag: 05.05.2015)Mehr Softwarequalität: Technische Schulden (IKS-Thementag: 05.05.2015)
Mehr Softwarequalität: Technische Schulden (IKS-Thementag: 05.05.2015)
 
Mehr Softwarequalität: Qualität als Treiber (IKS-Thementag: 05.05.2015)
Mehr Softwarequalität: Qualität als Treiber (IKS-Thementag: 05.05.2015)Mehr Softwarequalität: Qualität als Treiber (IKS-Thementag: 05.05.2015)
Mehr Softwarequalität: Qualität als Treiber (IKS-Thementag: 05.05.2015)
 
Mehr Softwarequalität: Softwarequalität ist steuerbar
Mehr Softwarequalität: Softwarequalität ist steuerbarMehr Softwarequalität: Softwarequalität ist steuerbar
Mehr Softwarequalität: Softwarequalität ist steuerbar
 
App-Projekte richtig steuern
App-Projekte richtig steuernApp-Projekte richtig steuern
App-Projekte richtig steuern
 
FAQs zur Technik
FAQs zur TechnikFAQs zur Technik
FAQs zur Technik
 
Mehr Softwarequalität: Team-Cleancoding
Mehr Softwarequalität: Team-CleancodingMehr Softwarequalität: Team-Cleancoding
Mehr Softwarequalität: Team-Cleancoding
 
Softwarequalität: Definitionen, Grenzen, Wünsche - Vortrag IKS-Meeting im Jan...
Softwarequalität: Definitionen, Grenzen, Wünsche - Vortrag IKS-Meeting im Jan...Softwarequalität: Definitionen, Grenzen, Wünsche - Vortrag IKS-Meeting im Jan...
Softwarequalität: Definitionen, Grenzen, Wünsche - Vortrag IKS-Meeting im Jan...
 
Micro, Nano, Mono - Microservices verständlich erklärt.
Micro, Nano, Mono  - Microservices verständlich erklärt.Micro, Nano, Mono  - Microservices verständlich erklärt.
Micro, Nano, Mono - Microservices verständlich erklärt.
 
Mehr Softwarequalität: Technische Schulden
Mehr Softwarequalität: Technische SchuldenMehr Softwarequalität: Technische Schulden
Mehr Softwarequalität: Technische Schulden
 
Mehr Softwarequalität: Qualität als Treiber
Mehr Softwarequalität: Qualität als TreiberMehr Softwarequalität: Qualität als Treiber
Mehr Softwarequalität: Qualität als Treiber
 
Agiles Arbeiten - Mythen, Trends und Best Practices
Agiles Arbeiten  - Mythen, Trends und Best PracticesAgiles Arbeiten  - Mythen, Trends und Best Practices
Agiles Arbeiten - Mythen, Trends und Best Practices
 
Ist Ihr Unternehmen reif für Microservices?
Ist Ihr Unternehmen reif für Microservices?Ist Ihr Unternehmen reif für Microservices?
Ist Ihr Unternehmen reif für Microservices?
 
Service goes green
Service goes greenService goes green
Service goes green
 

Ähnlich wie Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro

Testing XAML-based Windows Store Apps mit VS 2013
Testing XAML-based Windows Store Apps mit VS 2013Testing XAML-based Windows Store Apps mit VS 2013
Testing XAML-based Windows Store Apps mit VS 2013Nico Orschel
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Desktop Containers 12: Next Generation of ZENworks Application Virtualization
Desktop Containers 12: Next Generation of ZENworks Application VirtualizationDesktop Containers 12: Next Generation of ZENworks Application Virtualization
Desktop Containers 12: Next Generation of ZENworks Application VirtualizationGWAVA
 
Automatisiertes webauftritt testen
Automatisiertes webauftritt testenAutomatisiertes webauftritt testen
Automatisiertes webauftritt testenmradamlacey
 
Dnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyondDnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyondUlrich Krause
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsThorsten Kamann
 
Das eigene Test Lab, für jeden! (CeBIT-Edition mit Demo-Videos)
Das eigene Test Lab, für jeden! (CeBIT-Edition mit Demo-Videos)Das eigene Test Lab, für jeden! (CeBIT-Edition mit Demo-Videos)
Das eigene Test Lab, für jeden! (CeBIT-Edition mit Demo-Videos)Peter Kirchner
 
Aras PLM Installation
Aras PLM InstallationAras PLM Installation
Aras PLM InstallationAras
 
Software Entwicklung im Team
Software Entwicklung im TeamSoftware Entwicklung im Team
Software Entwicklung im Teambrandts
 
070-685 Zertifizierungsprüfung deutsch
070-685 Zertifizierungsprüfung deutsch070-685 Zertifizierungsprüfung deutsch
070-685 Zertifizierungsprüfung deutschholgerschmitz2011
 
Was ist eigentlich eine Unit?
Was ist eigentlich eine Unit?Was ist eigentlich eine Unit?
Was ist eigentlich eine Unit?Hendrik Lösch
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Joachim Baumann
 
Webbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriverWebbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriverAndi Albrecht
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsGFU Cyrus AG
 
Ueberlegungen Projektmanagement Web Applications
Ueberlegungen Projektmanagement Web ApplicationsUeberlegungen Projektmanagement Web Applications
Ueberlegungen Projektmanagement Web ApplicationsGünther Haslbeck
 
Ionic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenIonic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenHendrik Lösch
 
Software-Tests in PHP-Anwendungen
Software-Tests in PHP-AnwendungenSoftware-Tests in PHP-Anwendungen
Software-Tests in PHP-AnwendungenGjero Krsteski
 

Ähnlich wie Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro (20)

Testing XAML-based Windows Store Apps mit VS 2013
Testing XAML-based Windows Store Apps mit VS 2013Testing XAML-based Windows Store Apps mit VS 2013
Testing XAML-based Windows Store Apps mit VS 2013
 
Agiles Testen - Überblick
Agiles Testen - ÜberblickAgiles Testen - Überblick
Agiles Testen - Überblick
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Desktop Containers 12: Next Generation of ZENworks Application Virtualization
Desktop Containers 12: Next Generation of ZENworks Application VirtualizationDesktop Containers 12: Next Generation of ZENworks Application Virtualization
Desktop Containers 12: Next Generation of ZENworks Application Virtualization
 
Automatisiertes webauftritt testen
Automatisiertes webauftritt testenAutomatisiertes webauftritt testen
Automatisiertes webauftritt testen
 
Dnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyondDnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyond
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development Environments
 
Vagrant
VagrantVagrant
Vagrant
 
Das eigene Test Lab, für jeden! (CeBIT-Edition mit Demo-Videos)
Das eigene Test Lab, für jeden! (CeBIT-Edition mit Demo-Videos)Das eigene Test Lab, für jeden! (CeBIT-Edition mit Demo-Videos)
Das eigene Test Lab, für jeden! (CeBIT-Edition mit Demo-Videos)
 
Softwaretests: Werkzeuge zur Automatisierung
Softwaretests: Werkzeuge zur AutomatisierungSoftwaretests: Werkzeuge zur Automatisierung
Softwaretests: Werkzeuge zur Automatisierung
 
Aras PLM Installation
Aras PLM InstallationAras PLM Installation
Aras PLM Installation
 
Software Entwicklung im Team
Software Entwicklung im TeamSoftware Entwicklung im Team
Software Entwicklung im Team
 
070-685 Zertifizierungsprüfung deutsch
070-685 Zertifizierungsprüfung deutsch070-685 Zertifizierungsprüfung deutsch
070-685 Zertifizierungsprüfung deutsch
 
Was ist eigentlich eine Unit?
Was ist eigentlich eine Unit?Was ist eigentlich eine Unit?
Was ist eigentlich eine Unit?
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)
 
Webbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriverWebbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriver
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration Tools
 
Ueberlegungen Projektmanagement Web Applications
Ueberlegungen Projektmanagement Web ApplicationsUeberlegungen Projektmanagement Web Applications
Ueberlegungen Projektmanagement Web Applications
 
Ionic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenIonic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf Steroiden
 
Software-Tests in PHP-Anwendungen
Software-Tests in PHP-AnwendungenSoftware-Tests in PHP-Anwendungen
Software-Tests in PHP-Anwendungen
 

Mehr von IKS Gesellschaft für Informations- und Kommunikationssysteme mbH

Mehr von IKS Gesellschaft für Informations- und Kommunikationssysteme mbH (20)

Es wird Zeit KI zu nutzen - Wie es mit Azure KI Services und .NET MAUI gelingt
Es wird Zeit KI zu nutzen - Wie es mit Azure KI Services und .NET MAUI gelingtEs wird Zeit KI zu nutzen - Wie es mit Azure KI Services und .NET MAUI gelingt
Es wird Zeit KI zu nutzen - Wie es mit Azure KI Services und .NET MAUI gelingt
 
Thementag 2023 06 Dieses Mal machen wir alles richtig - 9 Hacks für wandelbar...
Thementag 2023 06 Dieses Mal machen wir alles richtig - 9 Hacks für wandelbar...Thementag 2023 06 Dieses Mal machen wir alles richtig - 9 Hacks für wandelbar...
Thementag 2023 06 Dieses Mal machen wir alles richtig - 9 Hacks für wandelbar...
 
Thementag 2023 04 Lindern, heilen oder gar fit machen.pdf
Thementag 2023 04 Lindern, heilen oder gar fit machen.pdfThementag 2023 04 Lindern, heilen oder gar fit machen.pdf
Thementag 2023 04 Lindern, heilen oder gar fit machen.pdf
 
Thementag 2023 05 Wer zu spät kommt, den bestraft das Leben - Modernisierung ...
Thementag 2023 05 Wer zu spät kommt, den bestraft das Leben - Modernisierung ...Thementag 2023 05 Wer zu spät kommt, den bestraft das Leben - Modernisierung ...
Thementag 2023 05 Wer zu spät kommt, den bestraft das Leben - Modernisierung ...
 
Thementag 2023 01 Mut zur Modernisierung - ein Praxisbeispiel.pdf
Thementag 2023 01 Mut zur Modernisierung - ein Praxisbeispiel.pdfThementag 2023 01 Mut zur Modernisierung - ein Praxisbeispiel.pdf
Thementag 2023 01 Mut zur Modernisierung - ein Praxisbeispiel.pdf
 
Thementag 2023 03 Einführung in die Softwaremodernisierung.pdf
Thementag 2023 03 Einführung in die Softwaremodernisierung.pdfThementag 2023 03 Einführung in die Softwaremodernisierung.pdf
Thementag 2023 03 Einführung in die Softwaremodernisierung.pdf
 
Thementag 2022 01 Verpassen Sie nicht den Anschluss.pdf
Thementag 2022 01 Verpassen Sie nicht den Anschluss.pdfThementag 2022 01 Verpassen Sie nicht den Anschluss.pdf
Thementag 2022 01 Verpassen Sie nicht den Anschluss.pdf
 
Thementag 2022 04 ML auf die Schiene gebracht.pdf
Thementag 2022 04 ML auf die Schiene gebracht.pdfThementag 2022 04 ML auf die Schiene gebracht.pdf
Thementag 2022 04 ML auf die Schiene gebracht.pdf
 
Thementag 2022 03 Ein Modell ist trainiert - und jetzt.pdf
Thementag 2022 03 Ein Modell ist trainiert - und jetzt.pdfThementag 2022 03 Ein Modell ist trainiert - und jetzt.pdf
Thementag 2022 03 Ein Modell ist trainiert - und jetzt.pdf
 
Thementag 2022 02 Der Deutschen Bahn in die Karten geschaut.pdf
Thementag 2022 02 Der Deutschen Bahn in die Karten geschaut.pdfThementag 2022 02 Der Deutschen Bahn in die Karten geschaut.pdf
Thementag 2022 02 Der Deutschen Bahn in die Karten geschaut.pdf
 
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine LearningDaten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
 
Erste Schritte in die neue Welt-So gelingt der Einstieg in Big Data und Machi...
Erste Schritte in die neue Welt-So gelingt der Einstieg in Big Data und Machi...Erste Schritte in die neue Welt-So gelingt der Einstieg in Big Data und Machi...
Erste Schritte in die neue Welt-So gelingt der Einstieg in Big Data und Machi...
 
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
 
Big Data und Machine Learning - Wer braucht das schon!?
Big Data und Machine Learning - Wer braucht das schon!?Big Data und Machine Learning - Wer braucht das schon!?
Big Data und Machine Learning - Wer braucht das schon!?
 
Erste Schritte in die neue Welt - So gelingt der Einstieg in Big Data und Mac...
Erste Schritte in die neue Welt - So gelingt der Einstieg in Big Data und Mac...Erste Schritte in die neue Welt - So gelingt der Einstieg in Big Data und Mac...
Erste Schritte in die neue Welt - So gelingt der Einstieg in Big Data und Mac...
 
Darf es ein bisschen mehr sein - Konzepte Strategien zur Bewältigung großer u...
Darf es ein bisschen mehr sein - Konzepte Strategien zur Bewältigung großer u...Darf es ein bisschen mehr sein - Konzepte Strategien zur Bewältigung großer u...
Darf es ein bisschen mehr sein - Konzepte Strategien zur Bewältigung großer u...
 
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine LearningDaten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
 
Big Data und Machine Learning - Wer braucht das schon!?
Big Data und Machine Learning - Wer braucht das schon!?Big Data und Machine Learning - Wer braucht das schon!?
Big Data und Machine Learning - Wer braucht das schon!?
 
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine LearningDaten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
Daten / Information / Wissen - Möglichkeiten und Grenzen des Machine Learning
 
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
Darf es ein bisschen mehr sein - Konzepte und Strategien zur Bewältigung groß...
 

Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro

  • 1. www.dotnetpro.de 5.2013 Sonderdruck 1 U nit-Tests sind zu aufwendig. Für Inte­ grationstests fehlt die Zeit. Systemtests können auch noch am Projektende ge- macht werden. Und ohnehin, Sie machen doch Ihre Arbeit von Anfang an richtig – warum also so umfangreich (und wiederholt) testen? Diese – hier überspitzt dargestellte – Ansicht kommt Ihnen vermutlich aus einigen IT-Projek- ten bekannt vor. Als professioneller Entwickler wissen Sie zwar, dass hochwertige Software nur mithilfe von Qualitätssicherungsmaßnahmen entstehen kann, doch gelegentlich ist etwas Überzeugungsarbeit nötig, um den Nutzen sol- cher Maßnahmen zu vermitteln. Ein möglicher Ansatz: Führen Sie einen auto­ matisierten GUI-Test vor. Ein Formular, das sich wie von selbst mit Daten füllt, automatisch auf richtiges Verhalten geprüft und schließlich ab- gesendet wird, sagt mehr als tausend Worte; besonders wenn dies mit fünf verschiedenen Datensätzen in jeweils drei unterschiedlichen Clients geschieht. Noch besser: Diese Tests kön- nen zusammen mit der entwickelten Software ausgeliefert und im Rahmen eines Abnahme- tests eingesetzt werden, sodass ein unmittelba- rer Zeitgewinn sichtbar wird. Dies kommt allen Beteiligten zugute – eine höhere Akzeptanz von regelmäßigen Systemtests und damit oft der Qualitätssicherung allgemein ist ein wichtiger Beitrag zum Gelingen des Projekts. Das Tool Im .NET-Umfeld stehen diverse Tools für die GUI-Automation zur Verfügung, von denen vier Test-Automation mit Selenium WebDriver Der große Formular-Check Webanwendungen wiederholt von Hand zu testen ist monoton und ineffizient. Nach Erweiterung der Grundfunktio- nen nimmt WebDriver Ihnen lästige Arbeiten wie das Ausfüllen von Formularen ab. Auf einen Blick Martin Gossen ist als IT- Berater bei iks tätig. Er erstellt individuelle Geschäftsanwendun- gen mit C#, ASP.NET und SQL Server. Besonderen Fokus legt er dabei auf automatisiertes Testen und Usability-Analysen. Sie erreichen ihn unter m.gossen@ iks-gmbh.com. Inhalt ▸ Selenium-Tools für die GUI- Automatisation. ▸ Das Tool Selenium WebDriver im Detail. ▸ Beispiel eines automatisierten Tests. dnpCode A1305Selenium in [1] vorgestellt wurden. Dabei bietet sich als Testumgebung für Webanwendungen das weit- verbreitete und frei verfügbare Produkt Selenium [2] an. Genau genommen handelt es sich bei Se- lenium um eine Sammlung mehrerer Tools, die in Tabelle 1 aufgeführt sind. Dieser Artikel befasst sich mit Selenium Web- Driver (Selenium 2), einer Implementierung des WebDriver-APIs, das als Entwurf für eine W3C- Spezifikation vorliegt [3]. Ähnlich Selenium IDE imitiert Selenium WebDriver das Verhal- ten eines realen Anwenders, indem es mit dem Webbrowser beziehungsweise der geladenen Webseite interagiert. Elemente der Webseite (DOM-Elemente) werden dabei über Selekto- ren ausgewählt und anschließend ausgelesen oder manipuliert. Dabei sind alle Aktionen in der gleichen Weise eingeschränkt wie bei einem echten Anwender; zum Beispiel kann ein But- ton, der ausgeblendet oder inaktiv ist, auch von den beiden Automations-Tools nicht angeklickt werden. Während Selenium IDE als reines Firefox- Plug-in eher die Funktion eines aufgebohrten Makro-Recorders erfüllt, lässt sich Selenium WebDriver für anspruchsvolle Steuerungsauf- gaben auch in anderen Browsern und damit für professionelle Systemtests von Webanwendun- gen einsetzen. Technisch gesehen verfolgt Se- lenium WebDriver auch den solideren Ansatz, denn es nutzt im Gegensatz zu Selenium IDE die in aktuellen Browsern bereits integrierten Funktionen zur Automation [4]. Im Folgenden soll der Begriff „WebDriver“ nicht die Schnittstelle, sondern das Selenium- Tool bezeichnen. Eine Dokumentation zum kompletten Selenium-API finden Sie in [5]. Installation und Einrichtung Am einfachsten legen Sie mit WebDriver los, in- dem Sie in Visual Studio ein neues Projekt vom Typ Klassenbibliothek erstellen (vorzugsweise nicht auf Laufwerk C:, siehe unten) und über die Paket-Manager-Konsole die folgenden Nu- Get-Pakete hinzufügen: PM Install-Package Selenium.WebDriver PM Install-Package Selenium.Support Es ist außerdem sinnvoll, ein Test-Framework wie NUnit [6] zu installieren. Es soll in diesem Tabelle 1 Selenium Tools. Tool Beschreibung Selenium IDE Ein Firefox-Add-on, das als Makro-Recorder fungiert. In die Makros können Überprüfungen mittels Assert und Verify eingebunden werden. Zudem ist das schrittweise Abspielen von Testfällen und das Setzen von Breakpoints möglich. Selenium Client API Erweitert Selenium IDE um diverse Programmiersprachen (inklusive C#). Selenium RC (Remote Control) Ein Proxy-Server, der von einem Selenium-Client-Treiber ferngesteuert wird. Ermöglicht die Testautomatisierung von GUI-Tests in Kombination mit Conti- nuous Integration. Ist offiziell als deprecated (überholt) gekennzeichnet. SeleniumWebDriver (Selenium 2) Der Nachfolger von Selenium RC mit objektorientiertem API. Spricht den Browser direkt über dessen Automations-API an. Selenium Grid Eine Erweiterung, die eine parallele Ausführung von Tests auf mehreren Servern ermöglicht. Sonderdruck
  • 2. 2 Sonderdruck 5.2013 www.dotnetpro.de [Abb. 1] Ein- binden eines gemeinsamen Ordners in VirtualBox. Zusammenhang zwar nicht für Unit-Tests eingesetzt werden, eignet sich aber gut für die Konfiguration und Ausführung der Einzeltests. Eine Einführung in NUnit finden Sie in [7]. Sie können anschließend die installierte NUnit-Assembly Ihrem Projekt hinzufügen oder sich wieder bei NuGet bedienen: PM Install-Package NUnit Je nachdem, in welchen Browsern Sie Ihre Tests ausführen wollen, sind noch externe Browser-Treiber notwendig. Ein- zelheiten hierzu finden Sie auf der Sele nium-Download-Seite; allerdings sind die dortigen Angaben und verknüpften Versi- onen nicht immer aktuell. So soll man der Windows-Umgebungsvariablen %PATH% den Speicherort des Internet-Explorer- Treibers hinzufügen, was aber nicht un- bedingt nötig ist. Hingegen sollte man darauf achten, dass die Browser-Treiber nicht durch eine Firewall behindert wer- den; unter Windows 7 erhalten Sie beim ersten Zugriffsversuch eine entsprechen- de Meldung. Den IE-Treiber finden Sie in [8], den Chrome-Treiber in [9]. Für Firefox ist kein weiterer Treiber nötig. Beachten Sie, dass neuere Treiber eventuell nicht mit alten Versionen der Browser funktionieren; während die ZIP-Datei des Chrome-Trei- bers die Versionsnummer im Dateinamen trägt, müssen Sie beim Internet Explorer im Zweifelsfall mit älteren Treiberdateien experimentieren. Legen Sie die Treiberda- teien ins Assembly-Verzeichnis des Visual- Studio-Projekts (zum Beispiel /bin/Debug). Wenn Sie mit genau festgelegten Brow- serversionen testen müssen, können Sie einen virtuellen Rechner zum Beispiel mit Oracles VM VirtualBox [10] aufsetzen und auf diesem die gewünschten Versionen installieren (automatische Programm- Updates ausschalten!). Wenn Sie Ihr Vi­ sual-Studio-Projekt nun beispielsweise auf Laufwerk D: angelegt haben, können Sie dieses in der virtuellen Maschine als gemeinsamen Ordner einbinden (siehe Abbildung 1). Dies hat den Vorteil, dass Konfigurati- onspfade auf beiden Rechnern gleich sind und die Tests jederzeit aus der virtuellen Maschine wie auch Ihrem Entwicklerrech- ner heraus ausgeführt werden können (sofern beide mit den gleichen Browser- Treibern zurechtkommen). Listing 1 Ein einfacher WebDriver-Test. using System; using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Firefox; namespace SeleniumDemo.DotNetPro.Test { public class DotNetProTest1 { [Test] public void FindSeleniumArticle() { // Instantiate browser driver using (IWebDriver driver = new FirefoxDriver()) { // Set timeout TimeSpan waitTimespan = TimeSpan.FromSeconds(15); driver.Manage().Timeouts().ImplicitlyWait(waitTimespan); // Navigate to target URL driver.Url = http://www.dotnetpro.de; // Get page elements for searching IWebElement searchBox = driver.FindElement(By.Id(TB_SearchTerm)); IWebElement searchButton = driver.FindElement(By.Id(BT_Search)); // Execute search searchBox.Clear(); searchBox.SendKeys(Selenium); searchButton.Click(); // Get element from result page IWebElement searchResultsArea = driver.FindElement(By.Id(ctl09_PNL_SearchResult)); // Assert correct result Assert.IsTrue(searchResultsArea.Text.Contains( Fahren Sie schon Automatik?)); // Finish up try { driver.Quit(); } catch { // Ignore if browser can't be closed } } } } }
  • 3. www.dotnetpro.de 5.2013 Sonderdruck3 Hello dotnetpro Ein erster Test ist schnell entwickelt. Nach- dem ein Browser-Treiber instanziert und mit einem Timeout versehen ist, können Sie schon zur Zielseite navigieren. Nun wählen Sie Seitenelemente (zum Beispiel Textfelder eines Formulars) anhand ihrer ID aus und führen Aktionen auf Ihnen aus. Anschließend testen Sie, ob die Seite wie erwartet reagiert hat, indem Sie die Werte weiterer Seitenelemente prüfen. Listing 1 zeigt dies am Beispiel der Artikelsuche auf der dotnetpro-Startseite. In diesem Fall wird getestet, ob der in [1] genannte Arti- kel gefunden wird, wenn man eine Suche mit dem Stichwort„Selenium“ durchführt. Nachdem Sie das Projekt kompiliert haben, können Sie ein NUnit-Projekt an- legen, die erzeugte Assembly des Visual- Studio-Projekts dem NUnit-Projekt hin- zufügen und den Test ausführen. Wenn alles gut geht, können Sie WebDriver nun bei der Arbeit zusehen und am Ende ein positives Testergebnis abnicken (siehe Abbildung 2). Selektoren und Aktionen Nicht immer besitzen Seitenelemente ei- ne eindeutige ID, anhand derer sie iden- tifiziert werden können; oder aber die ­ID ändert sich vom einen zum anderen Seitenaufruf (zum Beispiel bei dynamisch erzeugten Controls). Aus diesem Grund bringt WebDriver eine Reihe von Selek­ tor-Strategien mit, die in Tabelle 2 aufge- führt sind. So lassen sich Elemente unter an­derem anhand eines Name-­Attributs, ihrer CSS-Klasse oder der Position in der DOM-Hierarchie ermitteln. Mithilfe von Java­Script ergeben sich weitere Mög- lichkeiten; zum Beispiel lassen sich die jQuery­-Selektoren [11] verwenden. Da Selektoren auch mehrere Elemente zu- rückgeben können, ist eine weitere Fil- terung durch eigenen Code möglich. Aus Performance-Gründen sollten Sie aber möglichst eindeutige ID- und CSS-Selek- toren benutzen. Sofern die zu testende Webseite unter Ihrer eigenen Kontrolle ist, empfiehlt es sich daher, alle relevanten Seitenelemente mit einer ID zu versehen. Bei CSS- und XPath-Selektoren muss bedacht werden, dass diese von den Browsern unterschiedlich unterstützt werden; so wird Groß-/Kleinschreibung teilweise ignoriert, teilweise nicht. Einzel- heiten hierzu finden Sie in [12]. Haben Sie das gewünschte Seitenele- ment über die FindElement- beziehungs- weise FindElements-Methode gefunden (siehe Listing 1), steht es Ihnen als Objekt vom Typ IWebElement zur Verfügung und Sie können über seine Eigenschaften bei- spielsweise ermitteln, ob es momentan angezeigt wird, ob es aktiv ist und wie sein Inhaltstext lautet. Über Methoden können Sie es unter anderem anklicken oder einen Text setzen. Wenn Sie wissen, dass es sich um ein Control mit selektierbaren Werten handelt (zum Beispiel ein Drop-down- Control), können Sie es in ein Select­ Element-Objekt kapseln und auf diesem eine von mehreren SelectBy-Methoden aufrufen, um einen Wert zu setzen. IWebElement dropdown = driver.FindElement(By.Id(ctrl1)); SelectElement selectableDropdown = new SelectElement(dropdown); // Possible select by methods selectableDropdown.SelectByIndex(42); selectableDropdown.SelectByValue(foo); selectableDropdown.SelectByText(bar); Das Entwurfsmuster Page Object Den Prinzipien der Clean-Code-Entwick- lung [13] zufolge sollte jede Anwendung das Single-Responsibility-Prinzip beach- ten. Die Entwickler von WebDriver haben sich das zu Herzen genommen und emp- fehlen den Einsatz des Page-Object-Mus- ters [14]. Das Page Object repräsentiert die zu testende Webseite; dem steht eine separate Testklasse gegenüber. Innerhalb des Page Object lassen sich Felder über ei- nen Selektor deklarativ an DOM-Elemente Listing 2 Die Klasse für das Page Object der Startseite. public class DefaultPage { const string url = http://www.dotnetpro.de; const string pageTitle = Herzlich willkommen!; // Page Elements [FindsBy(Using = TB_SearchTerm)] IWebElement searchBox; [FindsBy(Using = BT_Search)] IWebElement searchButton; // Properties public string Url { get { return url; }} public string PageTitle { get { return pageTitle; }} // Methods public SearchPage Search( string searchText) { // Execute search searchBox.Clear(); searchBox.SendKeys(searchText); searchButton.Click(); return new SearchPage(); } } Tabelle 2 Selektoren für DOM-Elemente. Selektor Beschreibung ClassName Class-Attribut des DOM-Elements. CssSelector CSS-Selektor. Id ID-Attribut des DOM-Elements. LinkText Vollständiger Text eines Hyperlinks. Name Name-Attribut des DOM-Elements. PartialLinkText Partieller Text eines Hyperlinks. TagName Name des DOM-Elements. XPath XPath-Selektor. JavaScript Rückgabewert einer JavaScript- Funktion. [Abb. 2] Ein erfolgreicher NUnit-Test.
  • 4. www.dotnetpro.de 5.2013 Sonderdruck 4 binden; hierzu dient das FindsBy-Attribut. Weiterhin stellt das Page Object nach au- ßen hin Eigenschaften und Methoden be- reit, die für die Testklasse von Nutzen sind. Ein Beispiel: Das Page Object einer Log­in-Seite könnte eine LogOn-Metho- de ­bereitstellen sowie eine Eigenschaft IsLogged­On. Diese können von der Test- klasse benutzt werden, um den Anmelde- vorgang eines Anwenders zu automatisie- ren und anschließend auf Erfolg zu prüfen. Das Page Object selbst sollte keinen Testcode enthalten, also kein Assert aus- führen. Hierbei gibt es allerdings eine Aus­ nahme: Bei der Instanzierung kann das ­Page Object sicherstellen, dass die richti- ge Webseite (und eventuell wichtige Sei- tenelemente) geladen wurde und bereit ist, auf Testeingaben zu antworten. Dies wird am einfachsten anhand des Seiten- titels festgestellt; wenn dieser nicht ein- deutig ist, kann auch auf Vorhandensein eines beliebigen DOM-Elements geprüft werden. Das Zusammenspiel von Page Object und Testklasse veranschaulichen die ­Listings 2, 3 und 4. Screenshots und Protokollierung Bekanntlich können Tests auch fehlschla- gen – ist es doch gerade Sinn eines Tests, Fehler aufzudecken. Um Hinweise auf die Fehlerursache zu erhalten, können Sie im entscheidenden Moment einen Listing 3 Die Klasse für das Page Object der Suchseite. public class SearchPage { const string pageTitle = Suche; // Properties public string PageTitle { get { return pageTitle; }} // Page Elements [FindsBy(Using = ctl09_PNL_SearchResult)] IWebElement searchResultsArea; // Properties public IWebElement SearchResultsArea { get { return searchResultsArea; } } } Screenshot der Webseite anfertigen las- sen. Hierfür bringt WebDriver eigens eine GetScreenshot-Methode mit. var screenshot = ((ITakesScreenshot)driver).GetScreenshot(); screenshot.SaveAsFile(path, ImageFormat.Png); Für weitergehende Protokollierung des Fehlers oder auch des Erfolgsfalls für die Testdokumentation müssen Sie auf die .NET-Standardklassen oder auf Logging- Frameworks zurückgreifen. Listing 4 Die Testklasse für die Page Objects aus Listing 2 und 3. public class DotNetProTest2 { [Test] public void FindSeleniumArticle() { // Instantiate browser driver using (IWebDriver driver = new FirefoxDriver()) { // Set timeout TimeSpan waitTimespan = TimeSpan.FromSeconds(15); driver.Manage().Timeouts().ImplicitlyWait(waitTimespan); // Create and initialize page object DefaultPage defaultPage = new DefaultPage(); PageFactory.InitElements(driver, defaultPage); // Navigate to target URL driver.Url = defaultPage.Url; // Make sure correct page was loaded Assert.AreEqual(driver.Title, defaultPage.PageTitle); // Execute search SearchPage searchPage = defaultPage.Search(Selenium); // Initialize resulting page PageFactory.InitElements(driver, searchPage); // Make sure correct page was loaded Assert.AreEqual(driver.Title, searchPage.PageTitle); // Assert correct result Assert.IsTrue(searchPage.SearchResultsArea.Text.Contains( Fahren Sie schon Automatik?)); // Finish up try { driver.Quit(); } catch { // Ignore if browser can't be closed } } } } Eine Beispiellösung für Formular- Tests Zu diesem Artikel finden Sie auf der Heft- DVD eine VS2012-Solution (.NET 4.5), die aus den folgenden vier Projekten besteht: ◼ DotNetPro.Test (enthält die abgedruck- ten Listings), ◼ SeleniumFormExtensions (Formular- Erweiterungen), ◼ WebApplication (eine Beispiel-Website), ◼ WebApplication.Test (Tests für die Bei- spiel-Website). Sonderdruck
  • 5. 5 Sonderdruck 5.2013 www.dotnetpro.de Um mit der Beispiellösung arbeiten zu können, erstellen Sie zunächst im Webser- ver (IIS) eine neue Site und weisen den Ord- ner WebApplication als Stammverzeichnis zu, sodass die Beispiel-Website als local­ host erreichbar ist. Der Anwendungspool muss .NET 4.0 verwenden. Gegebenen- falls müssen Sie dem Benutzerkonto des Webservers noch Zugriff erteilen, indem Sie entsprechende Rechte auf dem Ordner einrichten. Auf dem Unterordner Upload werden zudem Schreibrechte benötigt. Ob dieWebsite wie gewünscht funktioniert, se- hen Sie, wenn Sie im Browser zu localhost/ Profile.­aspx navigieren und sich dort an der Website anmelden (User name: TestUser, Password: TestPw). Nun sollte die Zielseite Profile.aspx erscheinen (siehe Abbildung 3). Der eigentliche Test besteht darin, das Formular auszufüllen, abzusenden und auf Korrektheit der übermittelten Werte zu prüfen. Der Test ist dann erfolgreich, wenn alle eingegebenen Werte auf der anschließenden Bestätigungsseite kor- rekt angezeigt werden. Profile.aspx ist ab- sichtlich so konzipiert, dass verschiedene Typen von Formular-Controls ausgefüllt werden können. Bei dem Projekt SeleniumFormExten­ sions handelt es sich um eine wiederver- wendbare Klassenbibliothek, die Ihnen die Arbeit mit Webformularen erleichtert. Sie enthält im Wesentlichen folgende Klassen: (siehe Abbildung 4): ◼ Eine Basisklasse PageObject, die eine FillForm- und einige Hilfsmethoden zur Verfügung stellt, welche das Aus- füllen von Formularen und generell die Interaktion mit Seitenelementen ver- einfachen (A). ◼ Eine Basisklasse für Tests (Selenium­ Test), die sich um die Browser-Treiber und die Protokollierung von Fehlern kümmert sowie das Navigieren zu Web- seiten erleichtert (B). ◼ Eine Reihe von Konfigurationsklassen, mit denen Sie Eigenschaften von Page Objects und das genaue Verhalten beim Ausfüllen der Formularfelder deklarativ festlegen können. Hier wird zudem das Einlesen von Testdaten aus XML-Datei- en ermöglicht (C). ◼ Strategien zum Setzen von Werten (­Val­ue Setters) für verschiedene Con- trol-Typen (D). Hierauf aufbauend können Sie Ihre eigenen Tests erstellen, wie im Projekt WebApplication.Test demonstriert (siehe Abbildung 5): ◼ Die Klasse Page dient als Basisklasse für die eigentlichen Page-Object-Klassen. Somit repräsentiert die Page-Klasse die Master Page der Website und enthält folgerichtig eine Logout-Methode. Das entsprechende Seitenelement – der Log-Off-Hyperlink – befindet sich in der Master Page (A). ◼ Die Klasse Test dient als Basisklasse für die konkreten Testklassen. In dieser Klasse erfolgt die Vorbereitung (Setup) und das Aufräumen (Teardown), das vor beziehungsweise nach jedem Test not- wendig ist. Im Beispiel erfolgt hier die An- und Abmeldung an der Website (B). ◼ Der Ordner Pages enthält die Page-Ob- ject-Klassen, hierarchisch gegliedert wie die entsprechenden Webseiten. Wie die- se konfiguriert werden können, sehen Sie in Tabelle 3. Weitere Erläuterungen dazu finden Sie auch im Quellcode (C). ◼ Der Ordner Tests beinhaltet die kon- kreten Testklassen. Hier können Sie im TestFixture-Attribut angeben, für welche Browser die Tests ausgeführt werden sollen, und im TestCaseSource-Attribut bestimmen Sie, woher die Testdaten stammen. Die Testmethoden benutzen die Schablonenmethode Execute ihrer Basisklasse, damit Fehler abgefangen und protokolliert werden können (D). ◼ Unter Properties/Settings.settings kon- figurieren Sie das Projekt. Die meisten Werte sind selbsterklärend. TestUser­ Name und TestUserPassword sind An- meldedaten, die für jeden Test benötigt werden; daher sind sie hier zentral ab- gelegt. SourceCulture und TargetCulture werden zum Umwandeln von Formaten – speziell von eingelesenen Datums- werten – verwendet (E). ◼ Configuration/TestData enthält XML- Dateien mit den zu verwendenden Test- daten (F). ◼ Configuration/TestFiles enthält Binärda- teien zum Testen der Upload-Funktion (G). [Abb. 3] Die zu testende Seite Profile.aspx. [Abb. 4] Das Projekt SeleniumFormExtensions. [Abb. 5] Das Projekt WebApplication.Test. Sonderdruck
  • 6. www.dotnetpro.de 5.2013 Sonderdruck Tabelle 3 Attribute zur Konfiguration von Page Objects. Attribut Zielelement Eigenschaft Beschreibung PageIdentifier Page-Object- Klasse Title Titel der Webseite.Wird benutzt, um festzustellen, ob die korrekte Webseite geladen wurde. ElementId ID eines DOM-Elements der Webseite.Wird benutzt, um festzustellen, ob die korrekte Webseite geladen wurde. PageUrl Page-Object- Klasse Url URL der repräsentierten Webseite. Zu diesem URL navigiert der Browser-Treiber. Configuration IWebElement-Feld Delay Zeitverzögerung beim Setzen eines Wertes in Millisekunden. Nütz- lich, wenn das Element Zeit zum Reagieren benötigt. Tab Name eines Formularreiters, der angeklickt wird, bevor ein Wert gesetzt wird. Click Das Element wird vor dem Setzen eines Wertes angeklickt. Leave Das Element verliert nach dem Setzen eines Wertes den Fokus. DataType Datentyp des zu setzenden Wertes.Wird bei der Umwandlung von Werten in eine andere Culture benutzt. SourceCulture Culture des eingelesenen Wertes. TargetCulture Culture, in die ein Wert umgewandelt wird. Format Format, in das ein Wert umgewandelt wird. ElementType Control-Typ des Elements (zum Beispiel text oder select). Für jeden Typ kann eine eigene Strategie zum Setzen von Werten benutzt werden. SetMethod Ansatz, der zum Setzen eines Wertes gewählt wird. SelectMethod Ansatz, der zur Auswahl eines Wertes gewählt wird. ◼ Die Klasse Configuration/DataProvi­ der besorgt die Testdaten und stellt sie den Testklassen zur Verfügung. Im Bei- spiel liefert die UserProfiles-Eigenschaft sukzessiv die Werte aller XML-Knoten namens Profile der verfügbaren XML- Dateien (H). ◼ Der Ordner Log ist der Speicherort für Fehlerprotokolle und zugehörige Screenshots (J). Um die Beispiellösung in Aktion zu sehen, müssen Sie lediglich ein NUnit- Projekt für die Assembly SeleniumDemo. WebApplication.Test.dll anlegen und ausführen. Damit es in allen drei Brow- sern (Firefox, Internet Explorer, Chrome) klappt, müssen diese natürlich installiert sein. Je nach Browser-Version kann es auch nötig sein, die vorhandenen Brow- ser-Treiber (IEDriverServer Win32 2.28.0 und chromedriver win 23.0.1240.0) auszu- tauschen. Fazit Selenium WebDriver bringt eine Reihe solider Funktionen mit, die das Testen von Webanwendungen erleichtern. Im Zusammenspiel mit NUnit und etwas zusätzlicher Handarbeit lässt sich daraus ein hoch konfigurierbares System bauen, das Ihnen viel Tipparbeit beim Testen von Webformularen abnimmt und sich in einen Continuous-Integration-Prozess einbinden lässt. Nebenbei dient es als an- schauliche Demonstration für wiederver- wendbare Systemtests und kann damit er- heblich zum Projekterfolg beitragen. [bl] [1] Hendrik Lösch, Michael Hanslik, Ein Vergleich verbreiteter UI-Testing-Frameworks, Fahren Sie schon Automatik?, dotnetpro 11/2012, Seite 102 ff., www.dotnetpro.de/A1211CodedUI [2] Selenium, http://seleniumhq.org [3] W3C Entwurf WebDriver-API, www.w3.org/TR/webdriver [4] Selenium WebDriver Dokumentation, www.dotnetpro.de/SL1304Selenium1 [5] Selenium WebDriver API, www.dotnetpro.de/SL1304Selenium2 [6] NUnit, www.nunit.org [7] Tam Hanna, Unit-Tests mit NUnit, Ebenbürti- ger Ersatz, dotnetpro 12/2012, Seite 110 ff., www.dotnetpro.de/A1212Testen [8] Internet Explorer Driver Server, www.dotnetpro.de/SL1304Selenium3 [9] Chrome Driver, www.dotnetpro.de/SL1304Selenium4 [10] Oracle VM VirtualBox, www.virtualbox.org [11] jQuery-Selektoren, www.dotnetpro.de/SL1304Selenium5 [12] Selenium, Locating UI Elements (WebEle- ments): CSS- und XPath-Eigenheiten, www.dotnetpro.de/SL1304Selenium6 [13] Clean Code, www.clean-code-developer.de [14] Selenium-Wiki: Page-Object-Entwurfsmuster, www.dotnetpro.de/SL1304Selenium7 iks Gesellschaft für Informations- und Kommunikationssysteme mbH Siemensstraße 27 40721 Hilden Telefon 0 21 03 - 58 72 -0 Telefax 0 21 03 - 58 72 -58 info@iks-gmbh.com www.iks-gmbh.com i s k Gesellschaft für Informations- und Kommunikationssysteme mbH Softwareentwicklung IT-Beratung IT-Konzepte Business Intelligence Individuelle IT-Konzepte und Softwarelösungen Sonderdruck