-
Notifications
You must be signed in to change notification settings - Fork 6.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add UITestAutomation framework * add code comments * Optimized code format * Optimized code format * Update commons and add keyboard manager ui test project * Optimized code format * test scope and fix fancyzone exe path * Add readme * Optimize helper functions and UI test method * Fix spelling errors and restore module UI tests * Restore Indent * Update NOTICE.md * Update comments to Session and Elements * Update comments for Button and Window * delete unnecessary code * change FindElementByName to FindElmenet * Update comments for ModuleConfigData * Update readme and comments * Remove extra comments * change public property * Optimize code readability * add default Attach Function * change attach function name * Update comments to XML format * Hide by internal functions * Update readme * Refine the framework * Fix process start position and update readme * Remove Enum PowerToysModuleWindow * Update attach comments * Update ModuleConfigData comments --------- Co-authored-by: Zhaopeng Wang (from Dev Box) <[email protected]> Co-authored-by: Xiaofeng Wang (from Dev Box) <[email protected]> Co-authored-by: urnotdfs <[email protected]>
- Loading branch information
1 parent
a1a0288
commit 9453e38
Showing
12 changed files
with
889 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
# UI tests framework | ||
|
||
A specialized UI test framework for PowerToys that makes it easy to write UI tests for PowerToys modules or settings. Let's start writing UI tests! | ||
|
||
## Before running tests | ||
|
||
- Install Windows Application Driver v1.2.1 from https://github.com/microsoft/WinAppDriver/releases/tag/v1.2.1 to the default directory (`C:\Program Files (x86)\Windows Application Driver`) | ||
|
||
- Enable Developer Mode in Windows settings | ||
|
||
## Running tests | ||
|
||
- Exit PowerToys if it's running. | ||
|
||
- Open `PowerToys.sln` in Visual Studio and build the solution. | ||
|
||
- Run tests in the Test Explorer (`Test > Test Explorer` or `Ctrl+E, T`). | ||
|
||
|
||
## How to add the first UI tests for your modules | ||
|
||
- Create a new project and add the following references to the project file. Change the OutputPath to your own module's path. | ||
``` | ||
<PropertyGroup> | ||
<OutputType>Library</OutputType> | ||
<!-- This is a UI test, so don't run as part of MSBuild --> | ||
<RunVSTest>false</RunVSTest> | ||
</PropertyGroup> | ||
<PropertyGroup> | ||
<OutputPath>..\..\..\..\$(Platform)\$(Configuration)\tests\KeyboardManagerUITests\</OutputPath> | ||
</PropertyGroup> | ||
<ItemGroup> | ||
<PackageReference Include="MSTest" /> | ||
<ProjectReference Include="..\..\..\common\UITestAutomation\UITestAutomation.csproj" /> | ||
<Folder Include="Properties\" /> | ||
</ItemGroup> | ||
``` | ||
- Inherit your test class from UITestBase. | ||
>Set Scope: The default scope starts from the PowerToys settings UI. If you want to start from your own module, set the constructor as shown below: | ||
>Specify Scope: | ||
``` | ||
[TestClass] | ||
public class RunFancyZonesTest : UITestBase | ||
{ | ||
public RunFancyZonesTest() | ||
: base(PowerToysModule.FancyZone) | ||
{ | ||
} | ||
} | ||
``` | ||
|
||
- Then you can start using session to perform the UI operations. | ||
|
||
**Example** | ||
``` | ||
using Microsoft.PowerToys.UITest; | ||
using Microsoft.VisualStudio.TestTools.UnitTesting; | ||
namespace UITests_KeyboardManager | ||
{ | ||
[TestClass] | ||
public class RunKeyboardManagerUITests : UITestBase | ||
{ | ||
[TestMethod] | ||
public void OpenKeyboardManagerEditor() | ||
{ | ||
// Open KeyboardManagerEditor | ||
this.Session.Find<Button>(By.Name("Remap a key")).Click(); | ||
this.Session.Attach("Remap keys"); | ||
// Maximize window | ||
var window = Session.Find<Window>(By.Name("Remap keys")).Maximize(); | ||
// Add Key Remapping | ||
this.Session.Find<Button>(By.Name("Add key remapping")).Click(); | ||
window.Close(); | ||
// Back to Settings | ||
this.Session.Attach(PowerToysModule.PowerToysSettings); | ||
} | ||
} | ||
} | ||
``` | ||
|
||
## Extra tools and information | ||
|
||
**Accessibility Tools**: | ||
While working on tests, you may need a tool that helps you to view the element's accessibility data, e.g. for finding the button to click. For this purpose, you could use [AccessibilityInsights](https://accessibilityinsights.io/docs/windows/overview) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// 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 Microsoft.VisualStudio.TestTools.UnitTesting; | ||
using OpenQA.Selenium; | ||
using OpenQA.Selenium.Appium.Windows; | ||
using OpenQA.Selenium.Interactions; | ||
using OpenQA.Selenium.Remote; | ||
using OpenQA.Selenium.Support.Events; | ||
|
||
namespace Microsoft.PowerToys.UITest | ||
{ | ||
/// <summary> | ||
/// Represents a button in the UI test environment. | ||
/// </summary> | ||
public class Button : Element | ||
{ | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
// 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 static OpenQA.Selenium.By; | ||
|
||
namespace Microsoft.PowerToys.UITest | ||
{ | ||
/// <summary> | ||
/// This class represents a By selector. | ||
/// </summary> | ||
public class By | ||
{ | ||
private readonly OpenQA.Selenium.By by; | ||
|
||
private By(OpenQA.Selenium.By by) | ||
{ | ||
this.by = by; | ||
} | ||
|
||
/// <summary> | ||
/// Creates a By object using the name attribute. | ||
/// </summary> | ||
/// <param name="name">The name attribute to search for.</param> | ||
/// <returns>A By object.</returns> | ||
public static By Name(string name) => new By(OpenQA.Selenium.By.Name(name)); | ||
|
||
/// <summary> | ||
/// Creates a By object using the ID attribute. | ||
/// </summary> | ||
/// <param name="id">The ID attribute to search for.</param> | ||
/// <returns>A By object.</returns> | ||
public static By Id(string id) => new By(OpenQA.Selenium.By.Id(id)); | ||
|
||
/// <summary> | ||
/// Creates a By object using the XPath expression. | ||
/// </summary> | ||
/// <param name="xpath">The XPath expression to search for.</param> | ||
/// <returns>A By object.</returns> | ||
public static By XPath(string xpath) => new By(OpenQA.Selenium.By.XPath(xpath)); | ||
|
||
/// <summary> | ||
/// Creates a By object using the CSS selector. | ||
/// </summary> | ||
/// <param name="cssSelector">The CSS selector to search for.</param> | ||
/// <returns>A By object.</returns> | ||
public static By CssSelector(string cssSelector) => new By(OpenQA.Selenium.By.CssSelector(cssSelector)); | ||
|
||
/// <summary> | ||
/// Creates a By object using the link text. | ||
/// </summary> | ||
/// <param name="linkText">The link text to search for.</param> | ||
/// <returns>A By object.</returns> | ||
public static By LinkText(string linkText) => new By(OpenQA.Selenium.By.LinkText(linkText)); | ||
|
||
/// <summary> | ||
/// Creates a By object using the tag name. | ||
/// </summary> | ||
/// <param name="tagName">The tag name to search for.</param> | ||
/// <returns>A By object.</returns> | ||
public static By TagName(string tagName) => new By(OpenQA.Selenium.By.TagName(tagName)); | ||
|
||
/// <summary> | ||
/// Converts the By object to an OpenQA.Selenium.By object. | ||
/// </summary> | ||
/// <returns>An OpenQA.Selenium.By object.</returns> | ||
internal OpenQA.Selenium.By ToSeleniumBy() => by; | ||
} | ||
} |
Oops, something went wrong.