From 09d4322b7ccee23cc717e9c657b240063a65940c Mon Sep 17 00:00:00 2001 From: "Zhaopeng Wang (from Dev Box)" Date: Sun, 26 Jan 2025 14:43:33 +0800 Subject: [PATCH] add PowerToys Module Config --- src/UITestAPI/src/ModuleConfigData.cs | 27 +++++ src/UITestAPI/src/UITestAPI.cs | 99 ++++++++++--------- .../UITests-FancyZones/RunFancyZonesTest.cs | 8 +- .../RunFancyZonesEditorTest.cs | 25 +++-- .../RunKeyboardManagerUITests.cs | 6 +- 5 files changed, 104 insertions(+), 61 deletions(-) create mode 100644 src/UITestAPI/src/ModuleConfigData.cs diff --git a/src/UITestAPI/src/ModuleConfigData.cs b/src/UITestAPI/src/ModuleConfigData.cs new file mode 100644 index 000000000000..15191bd7465a --- /dev/null +++ b/src/UITestAPI/src/ModuleConfigData.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.UITests.API +{ + public enum PowerToysModule + { + None, + Fancyzone, + KeyboardManagerKeys, + KeyboardManagerShortcuts, + Hosts, + } + + public struct ModuleConfigData(string moduleName, string windowName) + { + public string ModuleName = moduleName; + public string WindowName = windowName; + } +} diff --git a/src/UITestAPI/src/UITestAPI.cs b/src/UITestAPI/src/UITestAPI.cs index 91794c4ed291..2643f2743626 100644 --- a/src/UITestAPI/src/UITestAPI.cs +++ b/src/UITestAPI/src/UITestAPI.cs @@ -8,7 +8,7 @@ using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; - +using System.Xml.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Appium; @@ -16,29 +16,40 @@ using OpenQA.Selenium.Interactions; using static Microsoft.ApplicationInsights.MetricDimensionNames.TelemetryContext; using static Microsoft.UITests.API.APPManager; +using static Microsoft.UITests.API.ModuleConfigData; namespace Microsoft.UITests.API { public class UITestAPI { + protected const string PowerToysPath = @"\..\..\..\WinUI3Apps\PowerToys.Settings.exe"; + + public Dictionary ModuleConfig { get; private set; } + public APPManager APPManager { get; private set; } private static Process? appDriver; public UITestAPI() { + ModuleConfig = new Dictionary(); + ModuleConfig[PowerToysModule.Fancyzone] = new ModuleConfigData("Fancyzone", "FancyZones Layout"); + ModuleConfig[PowerToysModule.KeyboardManagerKeys] = new ModuleConfigData("KeyboardManagerKeys", "Remap keys"); + ModuleConfig[PowerToysModule.KeyboardManagerShortcuts] = new ModuleConfigData("KeyboardManagerShortcuts", "Remap shortcuts"); + ModuleConfig[PowerToysModule.Hosts] = new ModuleConfigData("Hosts", "Hosts File Editor"); + APPManager = new APPManager(); } [UnconditionalSuppressMessage("SingleFile", "IL3000:Avoid accessing Assembly file path when publishing as a single file", Justification = "")] - public void Init(string appName, string exePath, string windowName, string winAppDriverPath = "C:\\Program Files (x86)\\Windows Application Driver\\WinAppDriver.exe") + public void Init(string winAppDriverPath = "C:\\Program Files (x86)\\Windows Application Driver\\WinAppDriver.exe") { appDriver = Process.Start(winAppDriverPath); // Launch Exe string? path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - path += exePath; - APPManager.StartExe(appName, windowName, path); + path += PowerToysPath; + APPManager.StartExe("PowerToys", "PowerToys Settings", path); var session = APPManager.GetCurrentWindow(); Assert.IsNotNull(session, "Session not initialized"); @@ -76,68 +87,68 @@ public void StartExe(string appName, string windowName, string appPath) } // Take control of an application that already exists - public void LaunchModule(string appName, string windowName) + public void LaunchModule(PowerToysModule module) { - APPManager.LaunchModule(appName, windowName); + APPManager.LaunchModule(ModuleConfig[module].ModuleName, ModuleConfig[module].WindowName); } // Use the name to switch the current driver - public void SwitchApp(string appName) + public void SwitchModule(PowerToysModule module) { - APPManager.SwitchApp(appName); + APPManager.SwitchApp(ModuleConfig[module].ModuleName); } - public void CloseApp(string appName) + public void CloseModule(PowerToysModule module) { - APPManager.CloseApp(appName); + APPManager.CloseApp(ModuleConfig[module].ModuleName); } - public WindowsDriver? GetWindowInList(string appName) + public WindowsDriver? GetWindowInList(PowerToysModule module) { - return APPManager.GetWindowInList(appName); + return APPManager.GetWindowInList(ModuleConfig[module].ModuleName); } - public WindowsDriver? GetSession(string? appName = null) + public WindowsDriver? GetSession(PowerToysModule module = PowerToysModule.None) { - if (appName == null) + if (module == PowerToysModule.None) { return APPManager.GetCurrentWindow(); } else { - return APPManager.GetWindowInList(appName); + return APPManager.GetWindowInList(ModuleConfig[module].ModuleName); } } // ===================================Control API================================================ - private WindowsElement? GetElement(string elementName, string? appName = null) + private WindowsElement? GetElement(string elementName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var item = session?.FindElementByName(elementName); Assert.IsNotNull(item, "ElementName " + elementName + " not found"); return item; } - private ReadOnlyCollection GetElements(string elementName, string? appName = null) + private ReadOnlyCollection GetElements(string elementName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var listItem = session?.FindElementsByName(elementName); Assert.IsNotNull(listItem, "ElementName " + elementName + " not found"); return listItem; } - public WindowsElement? NewOpenContextMenu(string elementName, string? appName = null) + public WindowsElement? NewOpenContextMenu(string elementName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); RightClick_Element(elementName); var menu = session?.FindElementByClassName("ContextMenu"); Assert.IsNotNull(menu, "Context menu not found"); return menu; } - public void Click_Element(string elementName, string? appName = null) + public void Click_Element(string elementName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var element = GetElement(elementName); Actions actions = new Actions(session); actions.MoveToElement(element); @@ -145,9 +156,9 @@ public void Click_Element(string elementName, string? appName = null) actions.Build().Perform(); } - public void Click_Elements(string elementName, string? appName = null) + public void Click_Elements(string elementName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var elements = GetElements(elementName); Actions actions = new Actions(session); foreach (var element in elements) @@ -160,9 +171,9 @@ public void Click_Elements(string elementName, string? appName = null) } } - public void Click_Element(string elementName, string helpText, string? appName = null) + public void Click_Element(string elementName, string helpText, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var elements = GetElements(elementName); Actions actions = new Actions(session); bool buttonClicked = false; @@ -182,9 +193,9 @@ public void Click_Element(string elementName, string helpText, string? appName = Assert.IsTrue(buttonClicked, $"No button with elementName '{elementName}' and HelpText '{helpText}' was found."); } - public void Enable_Module_from_Dashboard(string moduleName, string? appName = null) + public void Enable_Module_from_Dashboard(string moduleName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var elements = GetElements("Enable module"); Actions actions = new Actions(session); bool buttonFound = false; @@ -208,9 +219,9 @@ public void Enable_Module_from_Dashboard(string moduleName, string? appName = nu Assert.IsTrue(buttonFound, $"No button with elementName '{moduleName}' and HelpText '{moduleName}' was found."); } - public void Disable_Module_from_Dashboard(string moduleName, string? appName = null) + public void Disable_Module_from_Dashboard(string moduleName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var elements = GetElements("Enable module"); Actions actions = new Actions(session); bool buttonFound = false; @@ -234,9 +245,9 @@ public void Disable_Module_from_Dashboard(string moduleName, string? appName = n Assert.IsTrue(buttonFound, $"No button with elementName '{moduleName}' and HelpText '{moduleName}' was found."); } - public void RightClick_Element(string elementName, string? appName = null) + public void RightClick_Element(string elementName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var element = GetElement(elementName); Actions actions = new Actions(session); actions.MoveToElement(element); @@ -245,43 +256,43 @@ public void RightClick_Element(string elementName, string? appName = null) actions.Build().Perform(); } - private WindowsElement? GetLayout(string layoutName, string? appName = null) + private WindowsElement? GetLayout(string layoutName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var listItem = session?.FindElementByName(layoutName); Assert.IsNotNull(listItem, "Layout " + layoutName + " not found"); return listItem; } - public WindowsElement? OpenContextMenu(string layoutName, string? appName = null) + public WindowsElement? OpenContextMenu(string layoutName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); RightClick_Layout(layoutName); var menu = session?.FindElementByClassName("ContextMenu"); Assert.IsNotNull(menu, "Context menu not found"); return menu; } - public void Click_CreateNewLayout(string? appName = null) + public void Click_CreateNewLayout(PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); + WindowsDriver? session = GetSession(module); var button = session?.FindElementByAccessibilityId("NewLayoutButton"); Assert.IsNotNull(button, "Create new layout button not found"); button?.Click(); } - public void Click_EditLayout(string layoutName, string? appName = null) + public void Click_EditLayout(string layoutName, PowerToysModule module = PowerToysModule.None) { - var layout = GetLayout(layoutName, appName); + var layout = GetLayout(layoutName, module); var editButton = layout?.FindElementByAccessibilityId("EditLayoutButton"); Assert.IsNotNull(editButton, "Edit button not found"); editButton.Click(); } - public void RightClick_Layout(string layoutName, string? appName = null) + public void RightClick_Layout(string layoutName, PowerToysModule module = PowerToysModule.None) { - WindowsDriver? session = GetSession(appName); - var layout = GetLayout(layoutName, appName); + WindowsDriver? session = GetSession(module); + var layout = GetLayout(layoutName, module); Actions actions = new Actions(session); actions.MoveToElement(layout); actions.MoveByOffset(30, 30); diff --git a/src/modules/fancyzones/UITests-FancyZones/RunFancyZonesTest.cs b/src/modules/fancyzones/UITests-FancyZones/RunFancyZonesTest.cs index f19e645aac4a..3d6393dc099c 100644 --- a/src/modules/fancyzones/UITests-FancyZones/RunFancyZonesTest.cs +++ b/src/modules/fancyzones/UITests-FancyZones/RunFancyZonesTest.cs @@ -16,7 +16,6 @@ namespace UITests_FancyZones [TestClass] public class RunFancyZonesTest { - private const string PowerToysPath = @"\..\..\..\WinUI3Apps\PowerToys.Settings.exe"; private static UITestAPI? mUITestAPI; private static TestContext? _context; @@ -35,7 +34,7 @@ public static void ClassCleanup() public void TestInitialize() { mUITestAPI = new UITestAPI(); - mUITestAPI.Init("PowerToys.Settings", PowerToysPath, "PowerToys.Settings"); + mUITestAPI.Init(); } [TestCleanup] @@ -88,9 +87,8 @@ public void RunFancyZones() Assert.IsNotNull(mUITestAPI); mUITestAPI.Click_Element("Launch layout editor"); - - Thread.Sleep(5000); - mUITestAPI.LaunchModule("PowerToys.FancyZonesEditor", "FancyZones Layout"); + Thread.Sleep(4000); + mUITestAPI.LaunchModule(PowerToysModule.Fancyzone); mUITestAPI?.Click_CreateNewLayout(); } } diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/RunFancyZonesEditorTest.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/RunFancyZonesEditorTest.cs index 71559e93cc66..f6438b318e41 100644 --- a/src/modules/fancyzones/UITests-FancyZonesEditor/RunFancyZonesEditorTest.cs +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/RunFancyZonesEditorTest.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; +using System.Threading; using FancyZonesEditorCommon.Data; using Microsoft.FancyZonesEditor.UITests; @@ -15,7 +16,6 @@ namespace UITests_FancyZonesEditor [TestClass] public class RunFancyZonesEditorTest { - private const string FancyZonesEditorPath = @"\..\..\..\PowerToys.FancyZonesEditor.exe"; private static FancyZonesEditorFiles? _files; private static UITestAPI? mUITestAPI; @@ -142,6 +142,14 @@ public static void ClassInitialize(TestContext testContext) AppliedLayouts = new List { }, }; _files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + // Start Powertoys + mUITestAPI = new UITestAPI(); + mUITestAPI.Init(); + Assert.IsNotNull(mUITestAPI); + mUITestAPI.Click_Element("Launch layout editor"); + Thread.Sleep(4000); + mUITestAPI.LaunchModule(PowerToysModule.Fancyzone); } [ClassCleanup] @@ -151,24 +159,23 @@ public static void ClassCleanup() { _files.Restore(); } + + if (mUITestAPI != null && _context != null) + { + mUITestAPI.Close(_context); + } + + _context = null; } [TestInitialize] public void TestInitialize() { - mUITestAPI = new UITestAPI(); - mUITestAPI.Init("PowerToys.FancyZonesEditor", FancyZonesEditorPath, "PowerToys.FancyZonesEditor"); } [TestCleanup] public void TestCleanup() { - if (mUITestAPI != null && _context != null) - { - mUITestAPI.Close(_context); - } - - _context = null; } [TestMethod] diff --git a/src/modules/keyboardmanager/KeyboardManagerUITests/RunKeyboardManagerUITests.cs b/src/modules/keyboardmanager/KeyboardManagerUITests/RunKeyboardManagerUITests.cs index d99b5badbfea..0c04b1114bca 100644 --- a/src/modules/keyboardmanager/KeyboardManagerUITests/RunKeyboardManagerUITests.cs +++ b/src/modules/keyboardmanager/KeyboardManagerUITests/RunKeyboardManagerUITests.cs @@ -35,7 +35,7 @@ public static void CleanupAll() public static void ClassInitialize(TestContext testContext) { mUITestAPI = new UITestAPI(); - mUITestAPI.Init("PowerToys.Settings", PowerToysSettingsPath, "PowerToys.Settings"); + mUITestAPI.Init(); Debug.WriteLine("ClassInitialize executed"); } @@ -72,10 +72,10 @@ public void EnableKeyboardManager() // verify the session is initialized mUITestAPI.Enable_Module_from_Dashboard("Keyboard Manager"); mUITestAPI.Click_Element("Remap a key"); Thread.Sleep(5000); - mUITestAPI.LaunchModule("PowerToys.KeyboardManagerEditor", "Remap keys"); + mUITestAPI.LaunchModule(PowerToysModule.KeyboardManagerKeys); mUITestAPI.Click_Element("Add key remapping"); mUITestAPI.Click_Element("Cancel"); - mUITestAPI.CloseApp("PowerToys.KeyboardManagerEditor"); + mUITestAPI.CloseModule(PowerToysModule.KeyboardManagerKeys); mUITestAPI.Disable_Module_from_Dashboard("Keyboard Manager"); } }