{"id":3992,"date":"2024-01-30T14:53:11","date_gmt":"2024-01-30T14:53:11","guid":{"rendered":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/?p=3992"},"modified":"2024-02-15T15:10:29","modified_gmt":"2024-02-15T15:10:29","slug":"flaui-erfahrung-aus-dem-projekt","status":"publish","type":"post","link":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/","title":{"rendered":"FlaUI, Erfahrung aus dem Projekt"},"content":{"rendered":"\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vorwort-5c34af4b-8188-42eb-bd94-6141a7b86fbb\"><strong>Vorwort<\/strong><\/h2>\n\n\n\n<p>Automatisiertes Testen von grafischen Oberfl\u00e4chen ist ein wichtiges Thema. F\u00fcr jede GUI-Technologie gibt es mehrere Bibliotheken, die es sorgsam auszuw\u00e4hlen gilt, um z\u00fcgig ein qualitativ hochwertiges und akkurates Ergebnis zu bekommen. &nbsp;<\/p>\n\n\n\n<p>Im Bereich Web-Technologien gibt es viele bekannte Frameworks wie Selenium, Playwright, Cypress und viele mehr. Aber auch im Bereich WPF oder Winforms gibt es passende Vertreter und ich m\u00f6chte heute FlaUI vorstellen.<\/p>\n\n\n\n<p>FlaUI ist eine .NET-Klassenbibliothek f\u00fcr automatisiertes Testen von Windows Apps, insbesondere der UI. Sie baut auf den hauseigenen Microsoft Bibliotheken f\u00fcr UI Automation auf.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Element-4-8-1.png\" alt=\"\" class=\"wp-image-2375\" style=\"width:700px\"\/><figcaption class=\"wp-element-caption\"><em>Abbildung: Pyramide der Test-Automatisierung<\/em><\/figcaption><\/figure>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"geschichte-b7db0e3f-e613-4755-bffa-b378532a687c\"><strong>Geschichte<\/strong><\/h2>\n\n\n\n<p>Am 20. Dezember 2016 hat Roman Roemer die erste Fassung von FlaUI auf Github ver\u00f6ffentlicht. Unter der Version 0.6.1 wurden die ersten Schritte in Richtung Klassenbibliothek f\u00fcr das Testen von .NET Produkten gelegt. Seitdem wurde diese konsequent und mit gro\u00dfem Eifer weiterentwickelt, um die Bibliothek mit neuen und besseren Funktionen zu erweitern. Die neueste Version tr\u00e4gt die Versionsnummer 4.0.0 und bietet Features wie z.B. das Automatisieren von WPF und Windows Store App Produkten sowie das Tool FlaUI Inspect, welches die Struktur von .NET Produkten ausliest und wiedergibt.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"installation-beb2b174-20b5-48ef-9e21-96a43e7b48a7\"><strong>Installation<\/strong><\/h2>\n\n\n\n<p>\u00dcber GitHub oder NuGet kann FlaUI geladen und installiert werden. Zudem werde ich f\u00fcr diesen Artikel und das nachfolgende Beispiel noch weitere Plugins \/ Frameworks sowie Klassenbibliotheken verwenden wie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C# von OmniSharp<\/li>\n\n\n\n<li>C# Extensions von Jchannon<\/li>\n\n\n\n<li>NuGet Package Manager von Jmrog<\/li>\n\n\n\n<li>.NET Core Test Explorer von Jun Han<\/li>\n\n\n\n<li>Die neueste Windows SDK<\/li>\n\n\n\n<li>NUnit Framework<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"beispiel-f24649db-745f-4e09-b80d-2808e8cdd0c5\"><strong>Beispiel<\/strong><\/h2>\n\n\n\n<p>In diesem Beispiel werde ich mit mehreren unterschiedlichen Methoden eine typisches Windows-App, hier den Taskmanager, maximieren bzw. den Ausgangszustand wiederherstellen. Au\u00dferdem sollen unterschiedliche Elemente markiert werden.<\/p>\n\n\n\n<p>Bei der Arbeit an diesem Artikel ist mir aufgefallen, dass Windows ein besonderes Verhalten aufweist: Wird ein Programm maximiert, \u00e4ndert sich nicht nur der Name und andere Eigenschaften des Buttons, sondern auch die AutomationID. Das f\u00fchrte dazu, dass ich den Methodenaufrufen zwei verschiedene \u00dcbergabestrings f\u00fcr die AutomationID, \u201eMaximize\u201c und \u201eRestore\u201c, mitgeben musste, die beide denselben Button ansprechen.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"code-c-438ec9a5-0467-4fda-8d82-22cedd238e58\"><strong>Code (C#)<\/strong><\/h2>\n\n\n\n<p>Zuerst starten wir die gew\u00fcnschte Anwendung und legen uns eine Instanz des Fensters f\u00fcr die weitere Verwendung an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var app = Application.Launch(@\"C:WindowsSystem32Taskmgr.exe\");<br>var automation = new UIA2Automation();<br>var mainWin = app.GetMainWindow(automation);<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Desweiteren ben\u00f6tigen wir noch die Helper Class <code>ConditionFactory<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ConditionFactory cf = new ConditionFactory(new UIA2PropertyLibrary());<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Diese Helper Class bietet uns die M\u00f6glichkeit, Objekte nach bestimmten Bedingungen zu suchen. Wie zum Beispiel, die Suche nach einem Objekt mit einer bestimmten ID.<\/p>\n\n\n\n<p>In den folgenden Methoden wollen wir, wie oben erw\u00e4hnt, das Programm maximieren und wieder den Ausgangszustand herstellen. Au\u00dferdem wollen wir Elemente hervorheben:<\/p>\n\n\n\n<p>F\u00fcr die erste Methode werden wir mit <code>FindFirstDescendant<\/code> und <code>FindAllDescendant<\/code> arbeiten. <code>FindAllDescendant<\/code> sucht sich alle Elemente, die unterhalb des Ausgangselements liegen.&nbsp; <code>FindFirstDescendant<\/code> findet das erste Element unterhalb des Ausgangselements, das mit der \u00fcbergebenen Suchbedingung \u00fcbereinstimmt und mit<code> DrawHighlight <\/code>wird ein roter Rahmen um das Element gelegt. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static void FindWithDescendant(Window window, string condition, string expected)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 window.FindFirstDescendant(cf => cf.ByAutomationId(condition)).AsButton().Click();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var element = window.FindFirstDescendant(cf =>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cf.ByAutomationId(\"TmColumnHeader\")).FindAllDescendants();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach(var Item in element)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(Item.IsOffscreen != true)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Item.DrawHighlight();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Assert.IsNotNull(window.FindFirstDescendant(cf => cf.ByAutomationId(expected)));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>In der zweiten Methode nutzen wir <code>FindFirstChild<\/code> und <code>FindAllChildren<\/code>. Beide funktionieren fast gleich wie Descendant, nur dass hier nicht alle Elemente gefunden werden, sondern nur die, die direkt unter dem Ausgangselement liegen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0static void FindWithChild(Window window, string condition, string expected)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 window.FindFirstChild(cf => cf.ByAutomationId(\"TitleBar\")).FindFirstChild(cf =>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cf.ByAutomationId(condition)).AsButton().Click();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var element = window.FindAllChildren();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach(var Item in element)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Item.DrawHighlight();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Assert.IsNotNull(window.FindFirstDescendant(cf => cf.ByAutomationId(expected)));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Und f\u00fcr die dritte Methode nehmen wir <code>FindFirstByXPath<\/code> und <code>FindAllByXPath<\/code>. Hier m\u00fcssen wir, wie der Name sagt, den Pfad angeben. Bei <code>First <\/code>sollte es der genaue Pfad zum gew\u00fcnschten Element sein und bei <code>FindAll<\/code> werden alle Elemente gesucht, die in dem Pfad gefunden werden k\u00f6nnen. Solltet ihr ein Programm untersuchen, welches ihr nicht kennt, hilft es, FlaUI Inspect zu nutzen, welches Eigenschafen wie den Pfad anzeigen, aber auch andere Informationen \u00fcber Elemente von Windows-Apps darstellen kann.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0static void FindWithXPath(Window window, string expected)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 window.FindFirstByXPath(\"\/TitleBar\/Button&#91;2]\").AsButton().Click();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var element = window.FindAllByXPath(\"\/\/TitleBar\/Button\");\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach(var Item in element)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Item.DrawHighlight();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Assert.IsNotNull(window.FindFirstDescendant(cf => cf.ByAutomationId(expected)));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Als letztes m\u00fcssen wir nur noch die Methoden aufrufen und ihnen die gew\u00fcnschten Werte \u00fcbergeben. Zum einen das Fenster was wir uns am Anfang angelegt haben und zum anderen die AutomationID des Maximieren-Buttons, welche sich wie erw\u00e4hnt \u00e4ndert, sobald der Button bet\u00e4tigt wurde.<\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;   FindWithDescendant(mainWin,\"Maximize\", \"Restore\");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;FindWithChild(mainWin,\"Restore\", \"Maximize\");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindWithXPath(mainWin,\"Restore\");<\/code><\/p>\n\n\n\n<p>Im Code sieht das bei mir wie folgt aus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Bild1.jpg\" alt=\"\" class=\"wp-image-2372\" style=\"width:500px\"\/><\/figure>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"696\" src=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707992919447-1024x696.png\" alt=\"\" class=\"wp-image-4041\" style=\"width:700px\" srcset=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707992919447-1024x696.png 1024w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707992919447-600x408.png 600w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707992919447-768x522.png 768w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707992919447-640x435.png 640w, https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707992919447.png 1043w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 770px\" \/><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"schwachpunkte-a8d9f0d8-d67d-4c1d-9cb5-f2acaca66f7a\"><strong>Schwachpunkte<\/strong><\/h2>\n\n\n\n<p>Ein Problem sind selbst gebaute Objekte z.B. hatten wir in einem Projekt mit selbsterstellten Polygonen Buttons angelegt. Diese konnten weder von FlaUI Inspect noch von FlaUI selbst gefunden werden, was die Nutzung dieser in unseren Autotests stark eingeschr\u00e4nkt hat. F\u00fcr solche Objekte muss ein <code>AutomationPeer<\/code> (stellt Basisklasse bereit, die das Objekt f\u00fcr die UI-Automatisierung nutzbar macht) angelegt werden, damit diese gefunden werden k\u00f6nnen.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fazit-und-zusammenfassung-566aacad-a463-4406-811a-2201819ead8a\"><strong>Fazit und Zusammenfassung<\/strong><\/h2>\n\n\n\n<p>FlaUI unterst\u00fctzt mit UIA2 Forms und Win 32 Anwendungen sowie mit UIA3 WPF und Windows Store Apps. Es ist einfach zu bedienen und \u00fcbersichtlich, da es mit relativ wenig Grundfunktionen auskommt. Au\u00dferdem kann es jederzeit mit eigenen Methoden und Objekten erweitert werden.<\/p>\n\n\n\n<p>Auch die Software-Entwickler:innen sind zufrieden, da sie keine extra Schnittstellen und damit keine potenziellen Fehlerquellen f\u00fcr die Testautomatisierung einbauen m\u00fcssen. Gerade weil FlaUI uns die M\u00f6glichkeit gibt, direkt die Objekte des zu testenden Programmes abgreifen zu k\u00f6nnen, brauchen wir keine zus\u00e4tzliche Arbeitszeit darauf zu verwenden, f\u00fcr das Testing gr\u00f6\u00dfere und fehleranf\u00e4llige Anpassungen an der bestehenden Programmstruktur vorzusehen und zu verwalten. <\/p>\n\n\n\n<p>Andererseits muss man um jedes Objekt automatisiert ansprechen zu k\u00f6nnen, seine AutomationID im Testcode mindestens einmal hinterlegen, damit sie f\u00fcr den Test auch nutzbar ist. Dies bedeutet, dass man praktisch die ungef\u00e4hre Struktur des zu testenden Programmes nachbilden muss, was gerade bei komplexeren Programmen aufw\u00e4ndig sein kann. Und um dabei die \u00dcbersichtlichkeit zu erhalten, sollte man diese geclustert in mehreren, namentlich Aussagekr\u00e4ftigen, Klassen hinterlegen. <\/p>\n\n\n\n<p>Wir werden es auf alle F\u00e4lle weiterverwenden und auch unseren Kolleg:innen empfehlen.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>FlaUI ist eine Open-Source-Bibliothek f\u00fcr .NET, mit der Benutzeroberfl\u00e4chen von Windows-Anwendungen automatisiert werden k\u00f6nnen. Es ist eine gute Wahl f\u00fcr Tester:innen oder Entwickler:innen, die automatisierte Tests f\u00fcr Anwendungen erstellen m\u00f6chten, die auf der Windows-Plattform laufen. FlaUI bietet eine einfache und robuste API, die es Benutzer:innen erm\u00f6glicht, die meisten Aktionen auszuf\u00fchren, die ein:e Benutzer:in normalerweise auf der Benutzeroberfl\u00e4che durchf\u00fchren w\u00fcrde.<\/p>\n","protected":false},"author":39,"featured_media":3996,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","footnotes":""},"categories":[10,16],"tags":[41,48,52,443,768],"topics":[227],"class_list":["post-3992","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-qualitaetssicherung","category-dot-net","tag-automatisiertes-testen","tag-softwaretests","tag-testautomatisierung","tag-net","tag-flaui","topics-testautomatisierung"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ZEISS Digital Innovation Blog - FlaUI, Erfahrung aus dem Projekt<\/title>\n<meta name=\"description\" content=\"FlaUI ist eine Open-Source-Bibliothek f\u00fcr .NET, mit der Benutzeroberfl\u00e4chen von Windows-Anwendungen automatisiert werden k\u00f6nnen. Es ist eine gute Wahl f\u00fcr Tester:innen oder Entwickler:innen, die automatisierte Tests f\u00fcr Anwendungen erstellen m\u00f6chten, die auf der Windows-Plattform laufen. FlaUI bietet eine einfache und robuste API, die es Benutzer:innen erm\u00f6glicht, die meisten Aktionen auszuf\u00fchren, die ein:e Benutzer:in normalerweise auf der Benutzeroberfl\u00e4che durchf\u00fchren w\u00fcrde.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Blogbeitrag &quot;FlaUI, Erfahrung aus dem Projekt&quot;\" \/>\n<meta property=\"og:description\" content=\"FlaUI ist eine Open-Source-Bibliothek f\u00fcr .NET, mit der Benutzeroberfl\u00e4chen von Windows-Anwendungen automatisiert werden k\u00f6nnen. Es ist eine gute Wahl f\u00fcr Tester:innen oder Entwickler:innen, die automatisierte Tests f\u00fcr Anwendungen erstellen m\u00f6chten, die auf der Windows-Plattform laufen. FlaUI bietet eine einfache und robuste API, die es Benutzer:innen erm\u00f6glicht, die meisten Aktionen auszuf\u00fchren, die ein:e Benutzer:in normalerweise auf der Benutzeroberfl\u00e4che durchf\u00fchren w\u00fcrde.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/\" \/>\n<meta property=\"og:site_name\" content=\"Digital Innovation Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ZEISSDigitalInnovation\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-30T14:53:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-15T15:10:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1001\" \/>\n\t<meta property=\"og:image:height\" content=\"599\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Niels Brestrich\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Blogbeitrag &quot;FlaUI, Erfahrung aus dem Projekt&quot;\" \/>\n<meta name=\"twitter:description\" content=\"FlaUI ist eine Open-Source-Bibliothek f\u00fcr .NET, mit der Benutzeroberfl\u00e4chen von Windows-Anwendungen automatisiert werden k\u00f6nnen. Es ist eine gute Wahl f\u00fcr Tester:innen oder Entwickler:innen, die automatisierte Tests f\u00fcr Anwendungen erstellen m\u00f6chten, die auf der Windows-Plattform laufen. FlaUI bietet eine einfache und robuste API, die es Benutzer:innen erm\u00f6glicht, die meisten Aktionen auszuf\u00fchren, die ein:e Benutzer:in normalerweise auf der Benutzeroberfl\u00e4che durchf\u00fchren w\u00fcrde.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png\" \/>\n<meta name=\"twitter:creator\" content=\"@ZEISS_di\" \/>\n<meta name=\"twitter:site\" content=\"@ZEISS_di\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Niels Brestrich\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"6\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/\",\"name\":\"ZEISS Digital Innovation Blog - FlaUI, Erfahrung aus dem Projekt\",\"isPartOf\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png\",\"datePublished\":\"2024-01-30T14:53:11+00:00\",\"dateModified\":\"2024-02-15T15:10:29+00:00\",\"author\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/572a73e5111c709d73b211d71678f4b6\"},\"description\":\"FlaUI ist eine Open-Source-Bibliothek f\u00fcr .NET, mit der Benutzeroberfl\u00e4chen von Windows-Anwendungen automatisiert werden k\u00f6nnen. Es ist eine gute Wahl f\u00fcr Tester:innen oder Entwickler:innen, die automatisierte Tests f\u00fcr Anwendungen erstellen m\u00f6chten, die auf der Windows-Plattform laufen. FlaUI bietet eine einfache und robuste API, die es Benutzer:innen erm\u00f6glicht, die meisten Aktionen auszuf\u00fchren, die ein:e Benutzer:in normalerweise auf der Benutzeroberfl\u00e4che durchf\u00fchren w\u00fcrde.\",\"breadcrumb\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#primaryimage\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png\",\"width\":1001,\"height\":599},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FlaUI, Erfahrung aus dem Projekt\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#website\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/\",\"name\":\"Digital Innovation Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/572a73e5111c709d73b211d71678f4b6\",\"name\":\"Niels Brestrich\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Mitarbeiterbild_Niels_2-e1706627343161-150x150.png\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Mitarbeiterbild_Niels_2-e1706627343161-150x150.png\",\"caption\":\"Niels Brestrich\"},\"description\":\"Niels Brestrich arbeitet seit 2016 als Software Test Consultant f\u00fcr Zeiss Digital Innovation in Dresden. Seine Schwerpunkte sind das manuelle bzw. automatisierte Testen von Software f\u00fcr Mikroskope. Er arbeitet vorrangig mit .NET und Java f\u00fcr System bzw. UI-Tests.\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/author\/nielsbrestrich\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ZEISS Digital Innovation Blog - FlaUI, Erfahrung aus dem Projekt","description":"FlaUI ist eine Open-Source-Bibliothek f\u00fcr .NET, mit der Benutzeroberfl\u00e4chen von Windows-Anwendungen automatisiert werden k\u00f6nnen. Es ist eine gute Wahl f\u00fcr Tester:innen oder Entwickler:innen, die automatisierte Tests f\u00fcr Anwendungen erstellen m\u00f6chten, die auf der Windows-Plattform laufen. FlaUI bietet eine einfache und robuste API, die es Benutzer:innen erm\u00f6glicht, die meisten Aktionen auszuf\u00fchren, die ein:e Benutzer:in normalerweise auf der Benutzeroberfl\u00e4che durchf\u00fchren w\u00fcrde.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/","og_locale":"de_DE","og_type":"article","og_title":"Blogbeitrag \"FlaUI, Erfahrung aus dem Projekt\"","og_description":"FlaUI ist eine Open-Source-Bibliothek f\u00fcr .NET, mit der Benutzeroberfl\u00e4chen von Windows-Anwendungen automatisiert werden k\u00f6nnen. Es ist eine gute Wahl f\u00fcr Tester:innen oder Entwickler:innen, die automatisierte Tests f\u00fcr Anwendungen erstellen m\u00f6chten, die auf der Windows-Plattform laufen. FlaUI bietet eine einfache und robuste API, die es Benutzer:innen erm\u00f6glicht, die meisten Aktionen auszuf\u00fchren, die ein:e Benutzer:in normalerweise auf der Benutzeroberfl\u00e4che durchf\u00fchren w\u00fcrde.","og_url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/","og_site_name":"Digital Innovation Blog","article_publisher":"https:\/\/www.facebook.com\/ZEISSDigitalInnovation\/","article_published_time":"2024-01-30T14:53:11+00:00","article_modified_time":"2024-02-15T15:10:29+00:00","og_image":[{"width":1001,"height":599,"url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png","type":"image\/png"}],"author":"Niels Brestrich","twitter_card":"summary_large_image","twitter_title":"Blogbeitrag \"FlaUI, Erfahrung aus dem Projekt\"","twitter_description":"FlaUI ist eine Open-Source-Bibliothek f\u00fcr .NET, mit der Benutzeroberfl\u00e4chen von Windows-Anwendungen automatisiert werden k\u00f6nnen. Es ist eine gute Wahl f\u00fcr Tester:innen oder Entwickler:innen, die automatisierte Tests f\u00fcr Anwendungen erstellen m\u00f6chten, die auf der Windows-Plattform laufen. FlaUI bietet eine einfache und robuste API, die es Benutzer:innen erm\u00f6glicht, die meisten Aktionen auszuf\u00fchren, die ein:e Benutzer:in normalerweise auf der Benutzeroberfl\u00e4che durchf\u00fchren w\u00fcrde.","twitter_image":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png","twitter_creator":"@ZEISS_di","twitter_site":"@ZEISS_di","twitter_misc":{"Verfasst von":"Niels Brestrich","Gesch\u00e4tzte Lesezeit":"6\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/","name":"ZEISS Digital Innovation Blog - FlaUI, Erfahrung aus dem Projekt","isPartOf":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#primaryimage"},"image":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png","datePublished":"2024-01-30T14:53:11+00:00","dateModified":"2024-02-15T15:10:29+00:00","author":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/572a73e5111c709d73b211d71678f4b6"},"description":"FlaUI ist eine Open-Source-Bibliothek f\u00fcr .NET, mit der Benutzeroberfl\u00e4chen von Windows-Anwendungen automatisiert werden k\u00f6nnen. Es ist eine gute Wahl f\u00fcr Tester:innen oder Entwickler:innen, die automatisierte Tests f\u00fcr Anwendungen erstellen m\u00f6chten, die auf der Windows-Plattform laufen. FlaUI bietet eine einfache und robuste API, die es Benutzer:innen erm\u00f6glicht, die meisten Aktionen auszuf\u00fchren, die ein:e Benutzer:in normalerweise auf der Benutzeroberfl\u00e4che durchf\u00fchren w\u00fcrde.","breadcrumb":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#primaryimage","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png","contentUrl":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8.png","width":1001,"height":599},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/flaui-erfahrung-aus-dem-projekt\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/"},{"@type":"ListItem","position":2,"name":"FlaUI, Erfahrung aus dem Projekt"}]},{"@type":"WebSite","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#website","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/","name":"Digital Innovation Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/572a73e5111c709d73b211d71678f4b6","name":"Niels Brestrich","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/#\/schema\/person\/image\/","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Mitarbeiterbild_Niels_2-e1706627343161-150x150.png","contentUrl":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Mitarbeiterbild_Niels_2-e1706627343161-150x150.png","caption":"Niels Brestrich"},"description":"Niels Brestrich arbeitet seit 2016 als Software Test Consultant f\u00fcr Zeiss Digital Innovation in Dresden. Seine Schwerpunkte sind das manuelle bzw. automatisierte Testen von Software f\u00fcr Mikroskope. Er arbeitet vorrangig mit .NET und Java f\u00fcr System bzw. UI-Tests.","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/author\/nielsbrestrich\/"}]}},"author_meta":{"display_name":"Niels Brestrich","author_link":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/author\/nielsbrestrich\/"},"featured_img":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-content\/uploads\/sites\/2\/2024\/01\/Element-4-8-600x359.png","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/qualitaetssicherung\/\" class=\"advgb-post-tax-term\">Qualit\u00e4tssicherung<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">.NET<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Qualit\u00e4tssicherung<\/span>","<span class=\"advgb-post-tax-term\">.NET<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">automatisiertes Testen<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">Softwaretests<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">Testautomatisierung<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">.NET<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/category\/dot-net\/\" class=\"advgb-post-tax-term\">FlaUI<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">automatisiertes Testen<\/span>","<span class=\"advgb-post-tax-term\">Softwaretests<\/span>","<span class=\"advgb-post-tax-term\">Testautomatisierung<\/span>","<span class=\"advgb-post-tax-term\">.NET<\/span>","<span class=\"advgb-post-tax-term\">FlaUI<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 2\u00a0Jahren ago","modified":"Updated 2\u00a0Jahren ago"},"absolute_dates":{"created":"Posted on Januar 30, 2024","modified":"Updated on Februar 15, 2024"},"absolute_dates_time":{"created":"Posted on Januar 30, 2024 2:53 p.m.","modified":"Updated on Februar 15, 2024 3:10 p.m."},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/posts\/3992","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/users\/39"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/comments?post=3992"}],"version-history":[{"count":10,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/posts\/3992\/revisions"}],"predecessor-version":[{"id":4051,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/posts\/3992\/revisions\/4051"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/media\/3996"}],"wp:attachment":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/media?parent=3992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/categories?post=3992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/tags?post=3992"},{"taxonomy":"topics","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/de\/wp-json\/wp\/v2\/topics?post=3992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}