{"id":2368,"date":"2024-02-06T08:44:21","date_gmt":"2024-02-06T08:44:21","guid":{"rendered":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/?p=2368"},"modified":"2024-02-15T15:10:30","modified_gmt":"2024-02-15T15:10:30","slug":"flaui-project-experience","status":"publish","type":"post","link":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/","title":{"rendered":"FlaUI, project experience"},"content":{"rendered":"\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Preface<\/strong><\/h2>\n\n\n\n<p>The automated testing of graphical user interfaces is an important topic. For each GUI technology, there are several libraries that need to be carefully selected in order to achieve a high-quality and accurate result in the shortest possible time.&nbsp;<\/p>\n\n\n\n<p>When it comes to web technologies, there are many well-known frameworks such as Selenium, Playwright, Cypress and many more. There are also suitable alternatives for WPF or Winforms. Today I would like to introduce you to FlaUI.<\/p>\n\n\n\n<p>FlaUI is a .NET class library for automated testing of Windows apps, especially the UI. It is built on the in-house Microsoft libraries for UI Automation.<\/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 loading=\"lazy\" decoding=\"async\" width=\"1001\" height=\"629\" src=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Grafik_EN.png\" alt=\"\" class=\"wp-image-2394\" style=\"aspect-ratio:1.671118530884808;width:700px;height:auto\" srcset=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Grafik_EN.png 1001w, https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Grafik_EN-600x377.png 600w, https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Grafik_EN-768x483.png 768w, https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Grafik_EN-640x402.png 640w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 770px\" \/><figcaption class=\"wp-element-caption\"><em>Image: Pyramid of test automation<\/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>History<\/strong><\/h2>\n\n\n\n<p>Roman Roemer published the first version of FlaUI on Github on December 20, 2016. Version 0.6.1 was the first step towards a class library for testing .NET products. Since then, the library has been developed further with consistency and great enthusiasm in order to expand it with new and better functions. The newest version is 4.0.0 and it includes features such as the automation of WPF and Windows Store app products as well as the FlaUI Inspect tool, which reads and displays the structure of .NET products.<\/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>FlaUI can be downloaded and installed via GitHub or NuGet. For this article and the following example, I will also use other plugins\/frameworks and class libraries such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C# by OmniSharp<\/li>\n\n\n\n<li>C# Extensions by Jchannon<\/li>\n\n\n\n<li>NuGet Package Manager by Jmrog<\/li>\n\n\n\n<li>.NET Core Test Explorer by Jun Han<\/li>\n\n\n\n<li>The latest 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>Example<\/strong><\/h2>\n\n\n\n<p>For this example, I will use several different methods to maximize a typical Windows app, here the task manager, and restore it to its original state. Also, different elements should be highlighted.<\/p>\n\n\n\n<p>While working on this article, I noticed that Windows exhibits a special behavior: When a program is maximized, not only the name and other properties of the button change, but also the AutomationID. As a result, I had to give the method calls two different transfer strings for the AutomationID, \u201cMaximize\u201d and \u201cRestore\u201d, which both address the same button.<\/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>First of all, we start the relevant application and create an instance of the window for further use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var app = Application.Launch(@\"C:\\Windows\\System32\\Taskmgr.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>Furthermore, we also need the<code> ConditionFactory<\/code> helper class:<\/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>This helper class enables us to search for objects according to certain conditions. For instance, searching for an object with a specific ID.<\/p>\n\n\n\n<p>As mentioned above, we want to maximize the program and restore the initial state in the following methods. We also want to highlight elements:<\/p>\n\n\n\n<p>For the first method, we will work with <code>FindFirstDescendant<\/code> and <code>FindAllDescendant<\/code>. <code>FindAllDescendant<\/code> searches for all elements that are below the source element.<code> FindFirstDescendant<\/code> finds the first element below the source element matching the specified search condition and <code>DrawHighlight<\/code> creates a red frame around the element.<\/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>For the second method, we use <code>FindFirstChild<\/code> and <code>FindAllChildren<\/code>. Both function in almost the same way as Descendant, except that not all elements are found here, but only those that are directly below the starting element.<\/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>And for the third method, we use <code>FindFirstByXPath <\/code>and <code>FindAllByXPath<\/code>. This is where we have to specify the path, as the name suggests. With First it should be the exact path to the desired element and with FindAll all elements found within the path are searched for. If you want to inspect an unknown program, it helps to use FlaUI Inspect, which can display properties such as the path, but also other information about elements of Windows apps.<\/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>Finally, we just need to call the methods and pass them the desired values. The first is the window that we created at the beginning and the second is the AutomationID of the maximize button, which changes as soon as the button is pressed.<\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&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>This looks as follows in my code:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"187\" 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\" srcset=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Bild1.jpg 605w, https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Bild1-600x185.jpg 600w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 605px\" \/><\/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=\"701\" src=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707993273455-1024x701.png\" alt=\"\" class=\"wp-image-2405\" style=\"width:700px\" srcset=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707993273455-1024x701.png 1024w, https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707993273455-600x411.png 600w, https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707993273455-768x526.png 768w, https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707993273455-640x438.png 640w, https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Brestrich_FlaUI_Codesnippet-e1707993273455.png 1035w\" 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\"><strong>Flaws<\/strong><strong><\/strong><\/h2>\n\n\n\n<p>One problem is self-made objects, e.g. we had created buttons in a project with self-made polygons. These could not be found by either FlaUI Inspect or FlaUI itself, which severely limited their use in our automated tests. For such objects, an AutomationPeer (provides a base class that makes the object usable for UI automation) must be created so that they can be found.<\/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\"><strong>Summary and conclusion<\/strong><strong><\/strong><\/h2>\n\n\n\n<p>FlaUI supports Forms and Win 32 applications with UIA2 and WPF and Windows Store apps with UIA3. It is user-friendly and straightforward to operate, as it requires relatively few basic functions. Furthermore, it can be extended with your own methods and objects at any time. <\/p>\n\n\n\n<p>Similarly, the software developers are satisfied because they do not have to install any extra interfaces and therefore no potential sources of error for test automation. Since FlaUI gives us the possibility to directly access the objects of the program to be tested, we do not need to spend additional time planning and managing major and error-prone adjustments to the existing program structure for testing. <\/p>\n\n\n\n<p>On the other hand, in order to be able to address each object automatically, its AutomationID must be stored at least once in the test code so that it can also be used for the test. Consequently, the approximate structure of the program to be tested must be reproduced, which can be time-consuming, especially with more complex programs. And for the sake of clarity, these should be clustered in several classes with meaningful names. <\/p>\n\n\n\n<p>We will definitely continue to use it and recommend it to our colleagues.<\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>FlaUI is an open source library for .NET that enables the automation of user interfaces for Windows applications. It is a good choice for testers or developers looking to create automated tests for applications running on the Windows platform. FlaUI features a simple and robust API enabling users to perform most actions that a user would normally perform on the user interface.<\/p>\n","protected":false},"author":78,"featured_media":2374,"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":[7,13],"tags":[16,21,131,926],"topics":[82],"class_list":["post-2368","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-quality-assurance","category-dot-net","tag-software-testing","tag-net","tag-test-automation","tag-flaui","topics-test-automation"],"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, project experience<\/title>\n<meta name=\"description\" content=\"FlaUI is an open source library for .NET that enables the automation of user interfaces for Windows applications. It is a good choice for testers or developers looking to create automated tests for applications running on the Windows platform. FlaUI features a simple and robust API enabling users to perform most actions that a user would normally perform on the user interface.\" \/>\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\/en\/flaui-project-experience\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Blog post &quot;FlaUI, project experience&quot;\" \/>\n<meta property=\"og:description\" content=\"FlaUI is an open source library for .NET that enables the automation of user interfaces for Windows applications. It is a good choice for testers or developers looking to create automated tests for applications running on the Windows platform. FlaUI features a simple and robust API enabling users to perform most actions that a user would normally perform on the user interface.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/\" \/>\n<meta property=\"og:site_name\" content=\"Digital Innovation Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-06T08:44:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-15T15:10:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Grafik_EN.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1001\" \/>\n\t<meta property=\"og:image:height\" content=\"629\" \/>\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=\"Blog post &quot;FlaUI, project experience&quot;\" \/>\n<meta name=\"twitter:description\" content=\"FlaUI is an open source library for .NET that enables the automation of user interfaces for Windows applications. It is a good choice for testers or developers looking to create automated tests for applications running on the Windows platform. FlaUI features a simple and robust API enabling users to perform most actions that a user would normally perform on the user interface.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Grafik_EN.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Niels Brestrich\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/\",\"name\":\"ZEISS Digital Innovation Blog - FlaUI, project experience\",\"isPartOf\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Element-4-8.png\",\"datePublished\":\"2024-02-06T08:44:21+00:00\",\"dateModified\":\"2024-02-15T15:10:30+00:00\",\"author\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#\/schema\/person\/9c2dfdcbcfd5fa4e4079e336fad3e04e\"},\"description\":\"FlaUI is an open source library for .NET that enables the automation of user interfaces for Windows applications. It is a good choice for testers or developers looking to create automated tests for applications running on the Windows platform. FlaUI features a simple and robust API enabling users to perform most actions that a user would normally perform on the user interface.\",\"breadcrumb\":{\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#primaryimage\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Element-4-8.png\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Element-4-8.png\",\"width\":1001,\"height\":1000},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FlaUI, project experience\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#website\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/\",\"name\":\"Digital Innovation Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#\/schema\/person\/9c2dfdcbcfd5fa4e4079e336fad3e04e\",\"name\":\"Niels Brestrich\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Mitarbeiterbild_Niels_2-e1706627251353-150x150.png\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Mitarbeiterbild_Niels_2-e1706627251353-150x150.png\",\"caption\":\"Niels Brestrich\"},\"description\":\"Niels Brestrich has been working as a Software Test Consultant for Zeiss Digital Innovation in Dresden since 2016. His main focus is on manual and automated testing of software for microscopes. He works primarily with .NET and Java for system and UI tests.\",\"url\":\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/author\/ennielsbrestrich\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ZEISS Digital Innovation Blog - FlaUI, project experience","description":"FlaUI is an open source library for .NET that enables the automation of user interfaces for Windows applications. It is a good choice for testers or developers looking to create automated tests for applications running on the Windows platform. FlaUI features a simple and robust API enabling users to perform most actions that a user would normally perform on the user interface.","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\/en\/flaui-project-experience\/","og_locale":"en_US","og_type":"article","og_title":"Blog post \"FlaUI, project experience\"","og_description":"FlaUI is an open source library for .NET that enables the automation of user interfaces for Windows applications. It is a good choice for testers or developers looking to create automated tests for applications running on the Windows platform. FlaUI features a simple and robust API enabling users to perform most actions that a user would normally perform on the user interface.","og_url":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/","og_site_name":"Digital Innovation Blog","article_published_time":"2024-02-06T08:44:21+00:00","article_modified_time":"2024-02-15T15:10:30+00:00","og_image":[{"width":1001,"height":629,"url":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Grafik_EN.png","type":"image\/png"}],"author":"Niels Brestrich","twitter_card":"summary_large_image","twitter_title":"Blog post \"FlaUI, project experience\"","twitter_description":"FlaUI is an open source library for .NET that enables the automation of user interfaces for Windows applications. It is a good choice for testers or developers looking to create automated tests for applications running on the Windows platform. FlaUI features a simple and robust API enabling users to perform most actions that a user would normally perform on the user interface.","twitter_image":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/02\/Grafik_EN.png","twitter_misc":{"Written by":"Niels Brestrich","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/","name":"ZEISS Digital Innovation Blog - FlaUI, project experience","isPartOf":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#primaryimage"},"image":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Element-4-8.png","datePublished":"2024-02-06T08:44:21+00:00","dateModified":"2024-02-15T15:10:30+00:00","author":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#\/schema\/person\/9c2dfdcbcfd5fa4e4079e336fad3e04e"},"description":"FlaUI is an open source library for .NET that enables the automation of user interfaces for Windows applications. It is a good choice for testers or developers looking to create automated tests for applications running on the Windows platform. FlaUI features a simple and robust API enabling users to perform most actions that a user would normally perform on the user interface.","breadcrumb":{"@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#primaryimage","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Element-4-8.png","contentUrl":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Element-4-8.png","width":1001,"height":1000},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/flaui-project-experience\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/"},{"@type":"ListItem","position":2,"name":"FlaUI, project experience"}]},{"@type":"WebSite","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#website","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/","name":"Digital Innovation Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#\/schema\/person\/9c2dfdcbcfd5fa4e4079e336fad3e04e","name":"Niels Brestrich","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/#\/schema\/person\/image\/","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Mitarbeiterbild_Niels_2-e1706627251353-150x150.png","contentUrl":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Mitarbeiterbild_Niels_2-e1706627251353-150x150.png","caption":"Niels Brestrich"},"description":"Niels Brestrich has been working as a Software Test Consultant for Zeiss Digital Innovation in Dresden since 2016. His main focus is on manual and automated testing of software for microscopes. He works primarily with .NET and Java for system and UI tests.","url":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/author\/ennielsbrestrich\/"}]}},"author_meta":{"display_name":"Niels Brestrich","author_link":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/author\/ennielsbrestrich\/"},"featured_img":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-content\/uploads\/sites\/3\/2024\/01\/Element-4-8-600x600.png","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/category\/quality-assurance\/\" class=\"advgb-post-tax-term\">Quality Assurance<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/category\/dot-net\/\" class=\"advgb-post-tax-term\">.NET<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Quality Assurance<\/span>","<span class=\"advgb-post-tax-term\">.NET<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/category\/dot-net\/\" class=\"advgb-post-tax-term\">software testing<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/category\/dot-net\/\" class=\"advgb-post-tax-term\">.NET<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/category\/dot-net\/\" class=\"advgb-post-tax-term\">test automation<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/category\/dot-net\/\" class=\"advgb-post-tax-term\">FlaUI<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">software testing<\/span>","<span class=\"advgb-post-tax-term\">.NET<\/span>","<span class=\"advgb-post-tax-term\">test automation<\/span>","<span class=\"advgb-post-tax-term\">FlaUI<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 2 years ago","modified":"Updated 2 years ago"},"absolute_dates":{"created":"Posted on February 6, 2024","modified":"Updated on February 15, 2024"},"absolute_dates_time":{"created":"Posted on February 6, 2024 8:44 am","modified":"Updated on February 15, 2024 3:10 pm"},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/posts\/2368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/users\/78"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/comments?post=2368"}],"version-history":[{"count":19,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/posts\/2368\/revisions"}],"predecessor-version":[{"id":2417,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/posts\/2368\/revisions\/2417"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/media\/2374"}],"wp:attachment":[{"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/media?parent=2368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/categories?post=2368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/tags?post=2368"},{"taxonomy":"topics","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/digital-innovation\/en\/wp-json\/wp\/v2\/topics?post=2368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}